Pregunta

¿Cómo se calcula la distancia entre 2 ciudades?

¿Fue útil?

Solución

Si necesitas tener en cuenta la curvatura de la Tierra, la distancia del Gran Círculo es lo que estás buscando. El artículo de Wikipedia probablemente hace un mejor trabajo que yo al explicar cómo funciona la fórmula, y también hay esta página del formulario de aviación eso cubre eso entra en más detalles.

Sin embargo, las fórmulas son solo la primera parte del rompecabezas; si necesita que esto funcione para ciudades arbitrarias, necesitará una base de datos de ubicación para obtener la latitud y la longitud.Afortunadamente, puedes obtenerlo gratis en Geonames.org, aunque hay bases de datos comerciales disponibles (pregunte a google).Entonces, en general, busque las dos ciudades que desea, obtenga las coordenadas de latitud y longitud e introdúzcalas en la fórmula como en el ejemplo trabajado de Wikipedia.

Otras sugerencias:

  • Para una solución comercial completa, hay PC Miler que utiliza muchas compañías de camiones para calcular las tarifas de envío.
  • Realice llamadas a la API de Google Maps (u otra).Si necesita realizar muchas solicitudes por día, considere almacenar en caché los resultados en el servidor.
  • También muy importante es considerar la construcción de una base de datos de equivalencia para ciudades, suburbios, pueblos, etc.si cree que alguna vez necesitará agrupar sus datos.Sin embargo, esto se vuelve realmente complicado y es posible que no encuentre una solución única para su problema.

Por último, pero no menos importante, Joel escribió un artículo sobre este problema hace un tiempo, así que aquí lo tienes: Nueva caracteristica:Búsqueda de trabajo

Otros consejos

tu usas el fórmula de Haversina.

Esto es muy fácil de hacer con el tipo de geografía en 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 es SRID para el modelo de Tierra elipsoidal WGS84

Puedes usar el A* algoritmo para encontrar el camino más corto entre esas dos ciudades y de esta manera tendrás la distancia.

Si estás hablando de la distancia más corta entre dos ciudades reales en un planeta esférico real, como la Tierra, quieres que distancia del gran círculo.

Si estás trabajando en el avión y quieres el distancia euclidiana "mientras el cuervo vuela":

// 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);

¡No se necesita trigonometría!Solo el Teorema de pitágoras y el hecho de que los cuadrados siempre son positivos, por lo que no es necesario dx = abs(x1 - x0), etc.para obtener un número positivo para pasar a sqrt().

Tenga en cuenta que probablemente podría hacer esto en una línea y un compilador lo haría. probablemente redúzcalo al código equivalente anterior:

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

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

Puede obtener la distancia entre dos ciudades desde la API de Google Map.Aquí hay una implementación en 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)

Enlace de ejemplo: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

Encuentra la Lat/Lon de la ciudad, luego usa un algoritmo de estimación de distancia para las coordenadas Lat/Lon.

Si necesita un ejemplo de código, creo que tengo uno que podría buscar en casa, pero como muchas de las respuestas anteriores, necesita una base de datos larga/lat para hacer el cálculo.

Es mejor utilizar una tabla de consulta para obtener la distancia entre dos ciudades.

Esto tiene sentido porque * la fórmula para calcular la distancia es bastante intensivo computacionalmente.* Es poco probable que cambie la distancia entre ciudades.

Entonces, a menos que sus necesidades sean muy específicas (como mapeo del terreno desde un satélite o algún algoritmo topográfico o algo más), debería guardar la lista de ciudades y las distancias entre ellas en una tabla y buscarla según sea necesario.

He estado trabajando mucho con esto recientemente.Estoy descubriendo que las nuevas características de SQL2008 realmente hacen que esto sea fácil.Puedo encontrar todos los puntos que están dentro de Xkm de una tabla de récord de 100k en menos de un segundo... no está nada mal.

El método del gran círculo (suposición esférica) en mis pruebas estaba a aproximadamente 2,5 millas de distancia en comparación con la fórmula de Vincenty (suposición elipsoidal, que es lo que es la Tierra).

El verdadero truco es obtener la latitud y la longitud... para eso estoy usando Google.

@Jared: una pequeña corrección a su ejemplo de código.La última línea del primer ejemplo de código debería decir:

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

Estoy de acuerdo en que una vez que tengas la información, si no va a cambiar, guárdala de alguna manera.@Marko Tinto Gracias por la muestra de T-SQL.Para aquellos que no tienen acceso a SQL Server o prefieren otro método:Si necesita alta precisión, consulte Entrada de Wikipedia sobre el algoritmo Vincenty para más información.Creo que existe una implementación js, que (si no ya) se trasladaría fácilmente a otros lenguajes.Además, en la parte inferior de esa página hay un enlace a biblioteca geográfica, que pretende ser 1000 veces más preciso que el algoritmo Vincenty (si tienes datos tan buenos, podría importar).

¿Por qué usarías algo como el método Vincenty?Porque la Tierra no es una esfera perfecta y métodos como ese permiten ingresar un eje mayor y menor más preciso para modelar la Tierra.

yo suelo distancia tan simple y limpio

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top