Question

J'aimerais implémenter un moyen d'afficher une liste d'adresses stockées triées par proximité avec une adresse donnée.

Les adresses de la liste seront stockées dans une table de base de données. Les parties séparées ont des champs distincts (nous avons des champs pour le code postal, le nom de la ville, etc.), donc ce n'est pas simplement un géant varchar . Celles-ci sont saisies par l'utilisateur et, en raison de la nature du système, peuvent ne pas toujours être complètes (certaines peuvent manquer de code postal et d'autres peuvent avoir un peu plus que la ville et l'état).

Bien que ce soit pour une application intranet, je n’ai aucun problème à utiliser des ressources externes, y compris l’accès à des services Web Internet, etc. En fait, je préférerais cela plutôt que de rouler le mien, à moins que ce soit trivial de le faire moi-même. Si Google ou Yahoo! fournit déjà un service gratuit, je suis plus que disposé à le vérifier. Le mot clé est qu'il doit être gratuit, car je n'ai pas le droit d'introduire de coût supplémentaire dans ce projet pour cette fonctionnalité, car il s'agit déjà d'un bonus "bonus". pour ainsi dire.

Je pense à cela un peu comme beaucoup de briques & amp; les ateliers de mortier font leur "Trouver un lieu" fonctionnalité. L'afficher dans un tableau simple, trié de manière appropriée et afficher la distance (en miles, par exemple), est excellent. Afficher un mash-up sur carte est encore plus cool, mais je peux vraiment vivre simplement en prenant la distance et en gérant tout le suivi de l'affichage et du tri.

Le problème des algorithmes de distance simples est la nature des données. Comme tout ou partie de l'adresse peut être indéfinie, je n'ai rien de plus pratique que des coordonnées lat / long. De plus, même si je crée des codes postaux obligatoires, 90% des adresses auront probablement les mêmes cinq codes postaux.

Même s’il n’est pas nécessaire d’être extrêmement rapide, tout ce qui prend plus de sept secondes pour apparaître sur la page en raison de la latence peut être trop long pour l’utilisateur moyen d’attendre, comme nous le savons bien. Si un tel service hypothétique prend en charge l'envoi simultané d'un lot d'adresses au lieu d'interroger une à la fois, ce serait formidable. Néanmoins, je ne devrais pas penser que la liste d'adresses dépasserait le total de 50, si tant est que.

Était-ce utile?

La solution

Google et Yahoo! fournissent tous deux des services de géocodage gratuits. Vous pouvez calculer la distance à l'aide de la formule de Haversine ( implémenté dans .NET ou SQL ). Les deux services vous permettront d'effectuer des recherches partielles (code postal uniquement, ville uniquement) et vous permettront de connaître la précision de leurs résultats (afin que vous puissiez exclure des lieux sans informations significatives, bien que Yahoo! Fournisse des informations plus précises que Google).

Autres conseils

L'API de Google Maps ne vous convient pas à cause de leurs conditions d'utilisation. Cependant, Yahoo propose un service REST pour convertir les adresses en coordonnées Long / Lat, que vous pouvez ensuite utiliser pour calculer des distances. Son ici .

Leur demander de saisir un code postal, puis de créer une table de base de données mappant le code postal en paires latitude / longitude (ou en trouver un en ligne). Je ne sais pas comment vous travaillez, mais ici, le code postal peut être spécifique à plusieurs mètres, ce qui devrait être assez précis. Utilisez ensuite cette méthode pour calculer la distance entre deux codes postaux:

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

L’avantage d’utiliser votre propre code par rapport à un service de géocodage est que vous pouvez ensuite effectuer plusieurs calculs plus intéressants par rapport aux données, ainsi que stocker des éléments à côté dans votre base de données.

Ne pouvez-vous pas simplement utiliser l'API Google Maps pour obtenir les distances et les trier de votre côté?

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

Je suggérerais de rechercher l'API Google Maps.

Vous auriez besoin d’une connexion externe (pour que les données y soient transférées vers un service Web), mais il fournit ce dont vous avez besoin, à savoir la distance, en demandant un itinéraire entre 2 points et en obtenant la distance de celui-ci.

Référence de l'API de l'API d'itinéraire

Une des choses que nous avons accomplies dans mon entreprise est de tricher et d’utiliser la latitude / longitude du code postal (le centre de la zone du code postal). Ce n'est pas parfait, mais c'est assez proche pour que ceux-ci me trouvent x dans un rayon de n miles de y types de recherches. Ceci est particulièrement utile lorsque les adresses ne peuvent pas être reconnues par les services de nettoyage d'adresses.

À un moment donné, j’ai trouvé un code postal gratuit dans la table de correspondance latitude / longitude à utiliser dans cette approximation. Je suis désolé de ne plus avoir le lien vers ceci.

Consultez ce site Web: http://geocoder.us/help/utility.shtml

Vous pouvez traiter des enregistrements, 1 toutes les 15 secondes, comme suit: http://geocoder.us/service/distance?zip1=95472&zip2=94305

Ils ont également un service d'abonnement sans limite de temps

Quelqu'un l'a déjà fait à l'adresse Daft Logic . (edit: typo). Ils utilisent l'API Google Maps avec la la formule du grand cercle . Je ne pense pas que ce soit difficile à mettre en œuvre.

Mettre à jour : dans la pratique, il vous suffit d'obtenir les coordonnées de votre fournisseur préféré, puis de faire le calcul avec votre code. Vous pouvez précharger les coordonnées des magasins lorsque les utilisateurs indiquent leur emplacement. Vous pouvez même les utiliser pour la validation. Ensuite, lorsque la demande est faite, vous pouvez uniquement rechercher l'emplacement du client.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top