4 Stimmen

Anzeige von Adressen im Umkreis von x Meilen um einen Geo-Standort mit Google Maps

In meiner Datenbank habe ich eine Liste von Orten, und für jeden habe ich den Straßennamen und die Hausnummer, die Postleitzahl, die Stadt und den Landkreis. Einige von ihnen haben einen Breiten- und Längengrad.

Und ich habe zum Beispiel den Geostandort des Stadtzentrums. Ich möchte auf einer Google-Karte nur die Orte anzeigen, die sich innerhalb von X Meilen vom Stadtzentrum befinden.

Incase dies würde einen Geo-Standort für jeden meiner Orte zu arbeiten, könnte ich vielleicht ein Skript einrichten, um Google Maps api verwenden, um Geokodierung zu verwenden, um einen Geo-Standort für alle meine Orte zu erhalten und die Datenbank mit dem lat/lng zu aktualisieren. Dann hätte ich eine Datenbank voller Längen- und Breitengrade, mit denen ich arbeiten könnte.

Sobald alle Orte haben ein lat/lng dann vielleicht mysql kann die innerhalb des Bereichs Adressen zurück?

2voto

O. Jones Punkte 90877

Das ist nicht schwer, wenn man die Längen- und Breitengraddaten hat und wenn man die Formel für die Großkreisentfernung im mySQL-Format erhält.

@maggie hat einen guten Hinweis gegeben. Wie man effizient die nächstgelegenen Orte in der Nähe eines bestimmten Ortes findet

Indizierungsstrategie: Denken Sie daran, dass eine Minute Breitengrad (1/60 Grad) einer Seemeile oder 1,1515 statutarischen Meilen (ungefähr) auf der ganzen Welt entspricht. Indizieren Sie also Ihre Breitengradspalte und führen Sie Ihre Suche wie folgt durch. (Wenn Sie sich in einem Teil der Welt befinden, in dem km verwendet werden, können Sie umrechnen; entschuldigen Sie die altbritisch-imperiale Antwort, aber dort wurde die nautische Meile definiert).

WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
  AND (the big distance formula) <= myradius

Damit erhalten Sie sowohl eine vernünftige Indexierung der Datenbank als auch einigermaßen genaue Entfernungskreise.

Eine zusätzliche Verfeinerung: Sie können auch den Längengrad indizieren. Das Problem ist, dass die Bodenentfernung nicht direkt mit der geografischen Länge zusammenhängt. Am Äquator beträgt sie eine Seemeile pro Minute, aber sie wird kleiner, und an den Polen gibt es Singularitäten. Sie können also einen weiteren Term zu Ihrem WHERE hinzufügen. Er liefert korrekte Ergebnisse, ist aber nicht so selektiv wie die Indizierung nach Breitengrad. Aber es hilft bei der Indizierungssuche, besonders wenn Sie viele Zeilen zu durchsuchen haben. Sie erhalten also:

WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
  AND mylon BETWEEN column.lon-(myradius*1.1515) AND column.lon+(myradius*1.1515)
  AND (the big distance formula) < myradius

0voto

Micromega Punkte 12386

Höchstwahrscheinlich möchten Sie eine raumfüllende Kurve oder einen räumlichen Index verwenden, um Ihr 2D-Problem auf ein 1D-Problem zu reduzieren. Sie können zum Beispiel das Breiten-/Längenpaar mit einer z-Kurve oder einer Hilbert-Kurve kombinieren. Ich selbst verwende eine Hilbert-Kurve für die Suche nach Postleitzahlen. Meine Lösung finden Sie unter phpclasses.org ( hilbert-curve ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X