Welche bereits bestehenden Dienste existieren für die Berechnung der Entfernung zwischen zwei Adressen?

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich möchte eine Art und Weise implementieren, um eine Liste der gespeicherten Adressen durch die Nähe zu einer bestimmten Adresse sortiert angezeigt werden soll.

Adressen in der Liste in einer Datenbanktabelle gespeichert werden. Separate Teile verfügen über separate Felder (wir haben Felder für Postleitzahl, Ortsname, etc.), so ist es nicht nur ein riesiger varchar. Diese sind vom Benutzer eingegebenen und aufgrund der Art des Systems können nicht immer vollständig sein (einige Postleitzahl können fehlen, und andere haben etwas mehr als Stadt und Staat).

Obwohl dies für eine Intranet-Anwendung ist, ich habe keine Probleme außerhalb Ressourcen einschließlich des Zugriffs auf Internet-Web-Dienste und so weiter. Ich würde eigentlich lieber, wenn meine eigenen Überrollen, wenn es trivial sein würde, mich zu tun. Wenn Google oder Yahoo! bereits bietet einen kostenlosen Service, ich bin mehr als bereit, es auszuprobieren. Das Schlüsselwort ist es frei sein muss, da ich nicht in Freiheit bin für diese Funktion keine zusätzlichen Kosten auf dieses Projekt vorstellen, wie es ist schon ein Bonus „Perk“ sozusagen.

Ich bin dieses Denkens viel wie viele Ziegel und Mörtel Geschäfte haben ihre „Find a Location“ -Funktion. in geeigneter Weise und Entfernung angezeigt wird sortiert, es in einer einfachen Tabelle zeigt (in, sagen wir, Meilen) ist groß. Karte Mash-up zeigt, ist noch viel cooler, aber ich kann auf jeden Fall mit nur immer die Entfernung zurück und mich Umgang mit allen der nachfolgenden Anzeige und Sortierung.

leben

Das Problem mit einfacher Entfernung Algorithmen ist die Art der Daten. Da alle oder ein Teil der Adresse nicht definiert werden können, habe alles, was ich nicht bequem wie lat / long coords. Auch wenn ich machen Postleitzahlen erforderlich, 90% der Adressen wird wahrscheinlich die gleichen fünf Postleitzahlen haben.

Es ist zwar nicht mörderisch schnell sein muss, etwas, das mehr als sieben Sekunden dauert aufgrund Latenz auf der Seite auftauchen könnte zu lang für den durchschnittlichen Benutzer zu warten, wie wir wissen. Wenn eine solche hypothetische Service unterstützt eine zu einem Zeitpunkt der Abfrage eine Charge von Adressen auf einmal statt zu senden, würde das groß sein. Dennoch sollte, glaube ich nicht die Liste der Adressen insgesamt 50 überschreiten würde, wenn so viele.

War es hilfreich?

Lösung

Google und Yahoo! bieten sowohl Geokodierung Dienste kostenlos. Sie können Entfernung mit der Haversine Formel ( in .NET oder SQL implementiert). Beide Dienste lassen Sie tun Teil sucht (PLZ nur, Stadt nur) und lassen Sie wissen, was die Präzision ihrer Ergebnisse sind (so dass Sie Standorte ohne aussagekräftige Informationen ausschließen können, obwohl Yahoo! mehr Präzision Informationen als Google zur Verfügung stellt).

Andere Tipps

Die Google Maps API ist nicht gut für Sie aufgrund ihrer Nutzungsbedingungen. Allerdings bietet Yahoo einen REST-Service für Adressen in Lang / Lat Koordinaten drehen, die Sie dann berechnen Entfernungen nutzen könnten. Seine hier .

verlangen, daß sie eine Postleitzahl eingeben, dann eine Datenbanktabelle Mapping Postleitzahl erstellen Breite / Länge-Paare (ein online oder finden). Ich weiß nicht, wie es ist, wo Sie arbeiten, aber hier kann Postleitzahl zu mehreren Metern spezifisch sein, so dass eine präzise genug sein sollte. Dann diese Methode verwenden, um den Abstand zwischen zwei Postleitzahlen zu berechnen:

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

Der Vorteil der eigenen Codes über einen Geocoding Service ist, dass Sie dann auch ein paar mehr interessante Berechnungen mit den Daten tun können Sachen neben es in Ihrem db als zu speichern.

Können Sie sich nicht Google Maps API verwenden, um die Entfernungen zu erhalten und sie auf Ihrer Seite sortieren?

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

Ich würde vorschlagen, die Google Maps API zu untersuchen.

Es würde Sie benötigt eine externe Verbindung haben (und für sie in Ordnung sein, die Daten über sie zu einem Web-Service Shunt), aber es bietet, was Sie benötigen, nämlich die Entfernung von einer Strecke zwischen zwei Punkten zu fragen und bekommen der Abstand von ihm.

API-Referenz der Richtungen API

Eine Sache, die wir in meiner Firma getan haben, ist, zu betrügen und die Breite / Länge der Postleitzahl (Etwa die Mitte des PLZ-Bereich) zu verwenden. Es ist nicht perfekt, aber es ist nah genug für die, mich finden x innerhalb n Meilen von y Arten von Suchanfragen. Dies ist besonders hilfreich, wenn die Adressen nicht durch Adressreinigungsdienst anerkannt werden.

An einem gewissen Punkt, den ich über einen freien Postleitzahl kam / Längen Lookup-Tabelle zur Breite in dieser Annäherung zu verwenden. Es tut mir leid ich den Link nicht auf diese haben nicht mehr.

Überprüfen Sie diese Webseite aus: http://geocoder.us/help/utility.shtml

Sie können Datensätze verarbeiten, 1 pro 15 Sekunden wie folgt aus: http://geocoder.us/service/distance?zip1=95472&zip2=94305

Sie haben auch einen Abo-Service ohne Zeitlimit

Jemand anderes hat es getan bereits unter Daft Logic (edit: Tippfehler). Sie nutzen Google Maps API mit dem Großkreis Formel . Ich glaube nicht, es ist schwer zu implementieren.

Aktualisieren : Praktisch, müssen Sie nur die Koordinaten von Ihren Lieblings-Anbietern zu bekommen, dann mit Ihrem Code, um die Berechnung zu tun. Sie können die Geschäfte Koordinaten vorzuladen, wenn Benutzer ihre Lage bieten - Sie auch diese für die Validierung verwenden können. Dann, wenn der Antrag gestellt wird, können Sie nur den Standort des Kunden Nachschlag.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top