2008-09-22 10 views
12

me gustaría poner en práctica una forma de mostrar una lista de direcciones almacenadas ordenados por proximidad a una dirección dada.¿Qué servicios preexistentes existen para calcular la distancia entre dos direcciones?

direcciones de la lista serán almacenados en una tabla de base de datos. Las partes separadas tienen campos separados (tenemos campos para el código postal, el nombre de la ciudad, etc.) por lo que no es solo un gigante varchar. 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 se trata de una aplicación de intranet que no tengo problemas con el uso de recursos externos, incluyendo el acceso a los servicios web de Internet y tal. 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 tengo la 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 mucho al igual que muchas tiendas de ladrillo y mortero de & 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 algoritmos de distancia simples 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.

Respuesta

10

Google y Yahoo! ambos ofrecen servicios de geocodificación de forma gratuita. Puede calcular la distancia usando Haversine formula (implemented in .NET or 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).

+0

Definitivamente voy a investigar esto. Ya, en otra parte de este mismo sistema, tenemos un enlace a Yahoo! Mapas para dar información de ubicación para direcciones ingresadas arbitrariamente. Pero en ese caso no necesitaba ningún tipo de proximidad ... –

+0

por favor diga qué solución ha usado ... para que otros también puedan beneficiarse de ella ... También tengo un problema similar ... http://stackoverflow.com/questions/7426710/how-to-find-the-distance-between-two-zipcodes-using-java-code – aProgrammer

1

no puedes utilizar la API de Google Maps para obtener las distancias y ordenarlos de su lado?

http://code.google.com/apis/maps/

+0

Dado que se trata no public/intranet, necesitaría usar Google Maps API Premier, que no es gratuito. –

0

me gustaría sugerir la investigación de la API de Google Maps.

Exigiría que tuviera una conexión externa (y para que sea correcto derivar los datos a un servicio web), pero proporciona lo que necesita, es decir, la distancia pidiendo una ruta entre 2 puntos y obteniendo la distancia de eso.

API reference of the directions API

0

Una cosa que hemos hecho en mi empresa es engañar y utilizar la latitud/longitud del código postal (Aproximadamente el centro del área de 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.

+0

Esto sería una buena idea si no fuera por el hecho de que casi todas las ubicaciones en su lista residirán dentro de una pequeña cantidad de códigos postales (es decir, todos en el mismo área metropolitana) y eso no sería preciso lo suficiente, no creo. Pero aún vale la pena investigar ... –

4

Google Maps API no es bueno para usted 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. Es here.

+0

+1 por mencionar los duros términos y condiciones de Google ..... – aProgrammer

0

Alguien más lo ha hecho ya en Daft Logic (edit: typo). Usan Google Maps API con el Great-circle formula. No creo que sea difícil de implementar.

actualización: Prácticamente, sólo tendrá que obtener las coordenadas de su proveedor favorito, y luego hacer 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.

+0

No hacer quieres decir DaftLogic? ;) Eso es realmente genial, sin embargo. Me gustaría saber cómo podría precargarlo con puntos de nuestro db. Realmente, sin embargo, necesito algo mucho más rápido y "a mano". Nuestros usuarios trabajan con tiempo limitado cuando responden a los tipos de solicitudes que esta característica ayudaría. –

2

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 buscar 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. A continuación, utilice 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 a través de un servicio de geocodificación es que luego se puede hacer un montón cálculos más interesantes en contra de los datos, así como material de almacenamiento junto a él en su db.

Cuestiones relacionadas