Pergunta

Como você calcula a distância entre 2 cidades?

Foi útil?

Solução

Se você precisar levar em consideração a curvatura da Terra, a distância do Grande Círculo é o que você está procurando. O artigo da Wikipédia provavelmente explica melhor como a fórmula funciona do que eu, e também há esta página do formulário de aviação que cobre isso entra em mais detalhes.

As fórmulas são apenas a primeira parte do quebra-cabeça. Se você precisar fazer isso funcionar para cidades arbitrárias, precisará de um banco de dados de localização para obter a latitude/longitude.Felizmente você pode obter isso gratuitamente em Geonames.org, embora existam bancos de dados comerciais disponíveis (pergunte ao Google).Então, em geral, procure as duas cidades que você deseja, obtenha as coordenadas lat/long e insira-as na fórmula como em o exemplo trabalhado da Wikipedia.

Outras sugestões:

  • Para uma solução comercial completa, há PC Miler que é usado por muitas empresas de caminhões para calcular as taxas de remessa.
  • Faça chamadas para a API do Google Maps (ou outra).Se você precisar fazer muitas solicitações por dia, considere armazenar os resultados em cache no servidor.
  • Também muito importante é considerar a construção de um banco de dados de equivalência para cidades, subúrbios, vilas, etc.se você acha que precisará agrupar seus dados.Porém, isso fica muito complicado e você pode não encontrar uma solução única para o seu problema.

Por último, mas não menos importante, Joel escreveu um artigo sobre esse problema há algum tempo, então aqui está: Novo recurso:Procura de emprego

Outras dicas

Você usa o Fórmula Haversina.

Isso é muito fácil de fazer com o tipo geográfico no SQL Server 2008.

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm

4326 é SRID para modelo terrestre elipsoidal WGS84

Você pode usar o A* algoritmo para encontrar o caminho mais curto entre essas duas cidades e assim você terá a distância.

Se você está falando sobre a distância mais curta entre duas cidades reais em um planeta esférico real, como a Terra, você quer que o distância do grande círculo.

Se você está trabalhando no avião e deseja o Distância euclidiana "em linha reta":

// Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1]
dx = x1 - x0;
dy = y1 - y0;
dist = sqrt(dx*dx + dy*y);

Não é necessária trigonometria!Apenas o teorema de Pitágoras e o fato de que os quadrados são sempre positivos, então você não precisa de dx = abs(x1 - x0), etc.para obter um número positivo para passar para sqrt().

Observe que você provavelmente poderia fazer isso em uma linha e um compilador faria provavelmente reduza o código equivalente acima:

dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));

[1] http://en.wikipedia.org/wiki/Smoot

Você pode obter a distância entre duas cidades na API do Google Map.Aqui está uma implementação disso em Python

#!/usr/bin/python
import requests
from sys import argv 
def get_distance(origin,destination):
    gmap='http://maps.googleapis.com/maps/api/distancematrix/json'
    payload={"origins":origin,"destinations":destination,"sensor":'false' }
    try:
        a=requests.get(gmap,params=payload)
        data = a.json()
        origin = str(data['origin_addresses'][0])
        destination= str(data['destination_addresses'][0])
        distance = data['rows'][0]['elements'][0]['distance']['text']
        return distance,origin,destination
    except Exception,e:
        print "The %s or %destination does not exists :(" %(origin,destination)
        exit()

if __name__=="__main__":
    if len(argv)<3:
        print "sorry Check the format"
    else:
        origin=argv[1]
        destination=argv[2]
        distance,origin,destination=get_distance(origin,destination)
        print "%s ---> %s    :   %s" %(origin,destination,distance)

Link de exemplo: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

Você encontra o Lat/Lon da cidade e, em seguida, usa um algoritmo de estimativa de distância para coordenadas Lat/Lon.

se você precisar de um exemplo de código, acho que tenho um que poderia desenterrar em casa, mas como muitas das respostas anteriores, você precisa de um banco de dados longo/lat para fazer o cálculo

É melhor usar uma tabela de consulta para obter a distância entre duas cidades.

Isso faz sentido porque * a fórmula para calcular a distância AIS com bastante intensidade computacional.*É improvável que a distância entre as cidades mude.

Portanto, a menos que suas necessidades sejam muito específicas (como mapeamento de terreno de um satélite ou algum algoritmo de topografia ou qualquer outra coisa), você deve apenas salvar a lista de cidades e distâncias entre elas em uma tabela e procurá-la conforme necessário.

Tenho trabalhado muito com isso recentemente.Estou descobrindo que os novos recursos do SQL2008 realmente facilitam isso.Posso encontrar todos os pontos que estão dentro de Xkm de uma tabela de registros de 100k em menos de um segundo... nada mal.

O método do grande círculo (suposição esférica) em meus testes estava a cerca de 4 km de distância quando comparado à fórmula de Vincenty (suposição elipsoidal, que é o que a Terra é).

O verdadeiro truque é obter a latência e a longitude... para isso estou usando o Google.

@Jared - uma pequena correção no seu exemplo de código.A última linha do primeiro exemplo de código deve ser:

dist = sqrt(dx*dx + dy*dy);

Concordo que, uma vez que você tenha as informações, se elas não mudarem, armazene-as de alguma forma.@Marko Tinto Obrigado pela amostra T-SQL.Para quem não tem acesso ao SQL Server ou prefere outro método:Se você precisar de alta precisão, confira Entrada da Wikipedia sobre o algoritmo Vincenty para mais informações.Acredito que exista uma implementação js, ​​que (se ainda não) seria facilmente portada para outras linguagens.Além disso, na parte inferior da página há um link para geográficaLib, que pretende ser 1000 vezes mais preciso que o algoritmo Vincenty (se você tiver dados tão bons, isso pode ser importante).

Por que você usaria algo como o método Vincenty?Porque a Terra não é uma esfera perfeita e métodos como esse permitem inserir eixos maiores e menores mais precisos para modelar a Terra.

eu uso distância tão simples e limpo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top