¿Qué servicios preexistentes existen para calcular la distancia entre dos direcciones?

StackOverflow https://stackoverflow.com/questions/115850

  •  02-07-2019
  •  | 
  •  

Pregunta

Me gustaría implementar una forma de mostrar una lista de direcciones almacenadas ordenadas por proximidad a una dirección determinada.

Las direcciones de la lista se almacenarán en una tabla de base de datos.Las partes separadas tienen campos separados (tenemos campos para código postal, nombre de ciudad, etc.), por lo que no es solo un gigante varchar.Estos son ingresados ​​por el usuario y, debido a la naturaleza del sistema, es posible que no siempre estén completos (a algunos les puede faltar el código postal y a otros puede tener poco más que ciudad y estado).

Aunque esto es para una aplicación de intranet, no tengo problemas para utilizar recursos externos, incluido el acceso a servicios web de Internet y demás.De hecho, prefiero eso a hacerlo yo mismo, a menos que sea trivial hacerlo yo mismo.Si Google o Yahoo!ya ofrece un servicio gratuito, estoy más que dispuesto a comprobarlo.La palabra clave es que debe ser gratuito, ya que no tengo la libertad de introducir ningún costo adicional en este proyecto por esta función, ya que ya es un "beneficio" adicional, por así decirlo.

Estoy pensando en esto de manera muy similar a como muchas tiendas físicas utilizan su función "Buscar una ubicación".Mostrarlo en una tabla simple ordenada adecuadamente y mostrar la distancia (en, digamos, millas) es excelente.Mostrar una combinación de mapas es aún mejor, pero definitivamente puedo vivir con solo recuperar la distancia y manejar toda la visualización y clasificación posteriores.

El problema de los algoritmos de distancia simples es la naturaleza de los datos.Dado que toda o parte de la dirección puede no estar definida, no tengo nada conveniente como coordenadas de latitud/longitud.Además, incluso si hago que los códigos postales sean obligatorios, el 90% de las direcciones probablemente tendrán los mismos cinco códigos postales.

Si bien no tiene por qué ser increíblemente rápido, cualquier cosa que tarde 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 un servicio tan hipotético admitiera el envío de un lote de direcciones a la vez en lugar de consultar una a la vez, sería fantástico.Aún así, no creo que la lista de direcciones supere las 50 en total, si es que son tantas.

¿Fue útil?

Solución

Google y Yahoo! Ambos ofrecen servicios de codificación geográfica de forma gratuita.Puedes calcular la distancia usando el fórmula de Haversina (implementado en .NET o SQL).Ambos servicios te permitirán realizar búsquedas parciales (solo código postal, solo ciudad) y te permitirán saber cuál es la precisión de sus resultados (para que puedas excluir ubicaciones sin información significativa, aunque Yahoo!proporciona información más precisa que Google).

Otros consejos

La API de Google Maps no te sirve debido a sus condiciones de uso.Sin embargo, Yahoo ofrece un servicio REST para convertir direcciones en coordenadas largas/latónicas, que luego puedes usar para calcular distancias.Es aquí.

Pídales que ingresen un código postal y luego cree una tabla de base de datos que asigne el código postal a pares de latitud/longitud (o busque 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 usar su propio código sobre un servicio de codificación geográfica es que luego puede hacer muchos cálculos más interesantes con los datos, así como almacenar cosas junto con ellos en su base de datos.

¿No puedes simplemente usar la API de Google Maps para obtener las distancias y ordenarlas de tu lado?

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

Sugeriría investigar la API de Google Maps.

Se necesitaría tener una conexión externa (y para que esté bien desviar 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 él.

Referencia API de la API de direcciones

Una cosa que hemos hecho en mi empresa es hacer trampa y utilizar la latitud/longitud del código postal (aproximadamente el centro del área del código postal).No es perfecto, pero está lo suficientemente cerca como para que me encuentren x dentro de n millas de y tipos de búsquedas. Esto es especialmente útil cuando los servicios de limpieza de direcciones no pueden reconocer las direcciones.

En algún momento me encontré con una tabla de búsqueda gratuita de códigos postales y latitudes/longitudes para usar en esta aproximación.Lo siento, ya no tengo el enlace a esto.

Echa un vistazo a esta página web: http://geocoder.us/help/utility.shtml

Puede procesar registros, 1 cada 15 segundos, así:http://geocoder.us/service/distance?zip1=95472&zip2=94305

También tienen un servicio de suscripción sin límite de tiempo.

Alguien más lo ha hecho ya en Lógica tonta (editar:error de tipografía).Utilizan la API de Google Maps con la Fórmula del gran círculo.No creo que sea difícil de implementar.

Actualizar:Prácticamente, sólo necesitas obtener las coordenadas de tu proveedor favorito y luego hacer el cálculo con tu código.Puede precargar las coordenadas de las tiendas cuando los usuarios proporcionen su ubicación; incluso puede usar esto para la validación.Luego, cuando se realiza la solicitud, sólo podrá buscar la ubicación del cliente.

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