2008-09-22 7 views
12

Ich möchte eine Möglichkeit implementieren, eine Liste gespeicherter Adressen anzuzeigen, sortiert nach Nähe zu einer bestimmten Adresse.Welche bereits vorhandenen Dienste existieren zur Berechnung der Entfernung zwischen zwei Adressen?

Adressen in der Liste werden in einer Datenbanktabelle gespeichert. Getrennte Teile haben getrennte Felder (wir haben Felder für Postleitzahl, Stadtname, etc.), also ist es nicht nur ein Riese varchar. Diese sind vom Benutzer eingegeben und aufgrund der Art des Systems möglicherweise nicht immer vollständig (einige möglicherweise Postleitzahl fehlen und andere können wenig mehr als Stadt und Staat).

Obwohl dies für eine Intranet-Anwendung ist, habe ich keine Probleme mit externen Ressourcen einschließlich Zugriff auf Internet-Web-Services und solche. Ich würde das lieber überrollen, wenn es nicht einfach wäre, es selbst zu tun. Wenn Google oder Yahoo! bietet bereits einen kostenlosen Service, ich bin mehr als bereit, es zu überprüfen. Das Schlüsselwort ist, dass es frei sein muss, da ich nicht in der Lage bin, zusätzliche Kosten für dieses Feature in dieses Projekt einzubringen, da es sozusagen schon ein Bonus "Perk" ist.

Ich denke an so viel wie viele Ziegel & Mörtel-Läden tun ihre "Find a Location" -Funktion. Es in einer einfachen Tabelle zu zeigen, sortiert angemessen und Anzeigeabstand (in, sagen, Meilen) ist groß. Das Map Mash-Up ist noch cooler, aber ich kann definitiv damit leben, dass ich nur die Entfernung zurück bekomme und mich mit der gesamten nachfolgenden Anzeige und Sortierung beschäftige.

Das Problem mit einfachen Abstandsalgorithmen ist die Art der Daten. Da die Adresse ganz oder teilweise undefiniert sein kann, habe ich nichts Bequemes wie lat/long coords. Auch wenn ich Postleitzahlen benötige, werden 90% der Adressen wahrscheinlich die gleichen fünf Postleitzahlen haben.

Obwohl es nicht blitzartig schnell sein muss, ist alles, was aufgrund der Latenz mehr als sieben Sekunden auf der Seite angezeigt wird, für den durchschnittlichen Benutzer zu lang, wie wir wissen. Wenn ein solcher hypothetischer Dienst das Senden eines Stapels von Adressen auf einmal unterstützt, statt nur einzeln zu fragen, wäre das großartig. Dennoch sollte ich nicht denken, dass die Liste der Adressen insgesamt 50 überschreiten würde, wenn das viele wären.

Antwort

10

Google und Yahoo! bieten beide Geocodierungsdienste kostenlos. Sie können die Entfernung mit der Haversine formula (implemented in .NET or SQL) berechnen.Mit beiden Diensten können Sie Teilsuchen (nur Postleitzahl, nur Stadt) durchführen und Sie wissen lassen, wie präzise die Ergebnisse sind (so dass Sie Orte ohne aussagekräftige Informationen ausschließen können, obwohl Yahoo! präzisere Informationen bereitstellt als Google).

+0

Ich werde mich definitiv darum kümmern. Wir haben bereits innerhalb eines anderen Teils dieses Systems eine Verbindung zu Yahoo! Karten, um Ortsinformationen für beliebig eingegebene Adressen zu geben. Aber in diesem Fall brauchte ich keine Nähe ... –

+0

Bitte sagen Sie, welche Lösung Sie benutzt haben ... damit auch andere davon profitieren können ... Ich habe auch ein ähnliches Problem ... http://stackoverflow.com/questions/7426710/how-to-find-the-distance-between-two-zipcodes-using-java-code – aProgrammer

1

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

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

+0

Da dies nicht ist Öffentlich/Intranet, ich müsste Google Maps API Premier verwenden, die nicht frei ist. –

0

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

Es würde erfordern, dass Sie eine externe Verbindung (und damit es in Ordnung sein, die Daten über einen Web-Dienst zu leiten), aber es bietet, was Sie benötigen, nämlich die Entfernung nach einer Route zwischen 2 Punkten und die Entfernung davon bekommen.

API reference of the directions API

0

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 nahe genug für diejenigen, die mich x innerhalb von n Meilen von y Arten von Suchen finden. Dies ist besonders hilfreich, wenn die Adressen von Adressbereinigungsdiensten nicht erkannt werden können.

Irgendwann stieß ich auf eine freie Postleitzahl zur Breiten-/Längengradnachschlagetabelle, um in dieser Annäherung zu verwenden. Es tut mir leid, dass ich den Link dazu nicht mehr habe.

+0

Dies wäre eine gute Idee, wenn es nicht für die Tatsache wäre, dass fast alle Orte in ihrer Liste innerhalb einer kleinen Anzahl von Postleitzahlen (dh alle im selben Großraum) liegen würden und das wäre daher nicht korrekt genug denke ich nicht. Aber vielleicht lohnt es sich weiter zu schauen ... –

4

Die Google Maps API ist aufgrund ihrer Nutzungsbedingungen nicht gut für Sie. Yahoo bietet jedoch einen REST-Dienst an, um Adressen in Long/Lat-Koordinaten umzuwandeln, die Sie dann zur Berechnung von Entfernungen verwenden können. Sein here.

+0

+1 für die harten Bedingungen von Google zu erwähnen ..... – aProgrammer

0

Jemand anderes hat es schon getan bei Daft Logic (bearbeiten: Tippfehler). Sie verwenden Google Maps API mit der Great-circle formula. Ich denke nicht, dass es schwer umzusetzen ist.

Aktualisieren: In der Praxis müssen Sie nur die Koordinaten von Ihrem bevorzugten Anbieter abrufen und dann die Berechnung mit Ihrem Code durchführen. Sie können die Koordinaten des Shops vorab laden, wenn Benutzer ihren Standort angeben - Sie können dies sogar zur Validierung verwenden. Dann, wenn die Anfrage gemacht wird, können Sie nur den Standort des Kunden nachschlagen.

+0

nicht meinst du DaftLogic? ;) Das ist aber wirklich cool. Ich wäre gespannt, wie ich es mit Punkten aus unserem db vorladen könnte. Wirklich, ich brauche etwas, das viel schneller und "zur Hand" ist. Unsere Benutzer arbeiten mit begrenzter Zeit, wenn sie auf die Arten von Anfragen reagieren, mit denen diese Funktion helfen würde. –

2

Geben Sie an, dass sie eine Postleitzahl eingeben müssen, und erstellen Sie dann eine Zuordnungstabelle für die Zuordnung der Datenbanktabelle zu Breiten-/Längengradpaaren (oder suchen Sie eine online). Ich weiß nicht, wie es ist, wo Sie arbeiten, aber hier kann die Postleitzahl mehrere Meter betragen, also sollte das genau genug sein. 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 die Speicherung Sachen ein paar mehr interessante Berechnungen mit den Daten tun können daneben in deiner db.