algorithm - recorrida - medir distancias en google earth
¿Qué servicios preexistentes existen para calcular la distancia entre dos direcciones? (8)
¿No puedes usar la API de google maps para obtener las distancias y ordenarlas de tu lado?
Me gustaría implementar una forma de mostrar una lista de direcciones almacenadas ordenadas por proximidad a una dirección determinada.
Las direcciones en la lista se almacenarán en una tabla de base de datos. Las partes separadas tienen campos separados (tenemos campos para el código postal, nombre de la ciudad, etc.) por lo que no es solo un varchar
gigante. Estos son ingresados por el usuario y debido a la naturaleza del sistema pueden no estar completos (algunos pueden perder el código postal y otros pueden tener poco más que ciudad y estado).
Aunque esto es para una aplicación de intranet, no tengo problemas para usar recursos externos, incluido el acceso a servicios web de Internet, etc. En realidad, preferiría que superara la mía a menos que fuera trivial hacerlo yo mismo. Si Google o Yahoo! ya ofrece un servicio gratuito, estoy más que dispuesto a verificarlo. La palabra clave es que debe ser gratuita, ya que no estoy en libertad de introducir ningún costo adicional en este proyecto para esta función, ya que es una "ventaja" extra por así decirlo.
Estoy pensando en esto como muchas tiendas de ladrillo y mortero hacen su función "Buscar una ubicación". Mostrarlo en una tabla simple ordenada de forma adecuada y mostrar la distancia (en, por ejemplo, millas) es excelente. Mostrar un mapa mash-up es aún más genial, pero definitivamente puedo vivir con solo recuperar la distancia y manejar todo el despliegue y la clasificación subsiguientes.
El problema con los algoritmos de distancia simple es la naturaleza de los datos. Debido a que la totalidad o parte de la dirección puede estar indefinida, no tengo nada conveniente como coordenadas lat / long. Además, incluso si configuro códigos postales, el 90% de las direcciones probablemente tendrán los mismos cinco códigos postales.
Si bien no tiene que ser extremadamente rápido, cualquier cosa que demore más de siete segundos en aparecer en la página debido a la latencia podría ser demasiado larga para que el usuario promedio espere, como sabemos. Si dicho servicio hipotético admite enviar un lote de direcciones a la vez en lugar de consultar uno a la vez, sería genial. Aún así, no creo que la lista de direcciones exceda el total de 50, si es que hay muchas.
Alguien más ya lo ha hecho en Daft Logic (edit: typo). Utilizan Google Maps API con la fórmula Great-circle . No creo que sea difícil de implementar.
Actualización : Prácticamente, solo necesita obtener las coordenadas de su proveedor favorito, luego haga el cálculo con su código. Puede precargar las coordenadas de las tiendas, cuando los usuarios proporcionan su ubicación, incluso puede usar esto para la validación. Luego, cuando se realiza la solicitud, solo puede buscar la ubicación del cliente.
Exigirles que ingresen un código postal, luego crear una tabla de base de datos que mapee el código postal a los pares de latitud / longitud (o encuentre uno en línea). No sé cómo es donde trabajas, pero aquí, el código postal puede ser específico para varios metros, por lo que debería ser lo suficientemente preciso. Luego use este método para calcular la distancia entre dos códigos postales:
public static double distance(double lat1, double lon1, double lat2, double lon2, char unit)
{
double theta = lon1 - lon2;
double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
dist = Math.Acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
if (unit == ''K'')
{
dist = dist * 1.609344;
}
else if (unit == ''N'')
{
dist = dist * 0.8684;
}
return (dist);
}
private static double deg2rad(double deg)
{
return (deg * Math.PI / 180.0);
}
private static double rad2deg(double rad)
{
return (rad / Math.PI * 180.0);
}
La ventaja de utilizar su propio código sobre un servicio de geocodificación es que puede hacer un montón de cálculos más interesantes contra los datos, así como almacenar cosas junto a él en su base de datos.
La API de Google Maps no es buena para ti debido a sus términos de uso. Sin embargo, Yahoo ofrece un servicio REST para convertir direcciones en coordenadas Largas / Lat, que luego podría usar para calcular distancias. Está aquí .
Sugiero que investigue la API de google maps.
Exigiría que tuviera una conexión externa (y que estuviera bien para derivar los datos a un servicio web), pero proporciona lo que necesita, es decir, la distancia al solicitar una ruta entre 2 puntos y obtener la distancia desde eso.
Una cosa que hemos hecho en mi empresa es hacer trampa y usar la latitud / longitud del código postal (aproximadamente el centro del área del código postal). No es perfecto, pero está lo suficientemente cerca para que me encuentren x dentro de n millas de y tipos de búsquedas. Esto es especialmente útil cuando las direcciones no pueden ser reconocidas por los servicios de limpieza de direcciones.
En algún momento encontré un código postal gratuito en la tabla de búsqueda de latitud / longitud para usar en esta aproximación. Lo siento, ya no tengo el enlace para esto.
Visite este sitio web: http://geocoder.us/help/utility.shtml
Puede procesar registros, 1 por 15 segundos, de esta manera: http://geocoder.us/service/distance?zip1=95472&zip2=94305
También tienen un servicio de suscripción sin límite de tiempo
Google y Yahoo! ambos brindan servicios de geocodificación de forma gratuita. Puede calcular la distancia usando la fórmula Haversine ( implementada en .NET o SQL ). Ambos servicios le permitirán hacer búsquedas parciales (solo código postal, solo ciudad) y le permitirán conocer la precisión de sus resultados (para poder excluir ubicaciones sin información significativa, aunque Yahoo proporciona más información de precisión que Google).