PHP MySql und Geolocation

8

Ich schreibe eine Website, die im Grunde nach Orten innerhalb eines Radius von 25 Meilen von einem Breitengrad und lange mit PHP und MySQL sucht.

Ich frage mich, wie so etwas funktionieren würde?

Ich würde Lat und Long zum Scrip führen und es nur Orte herausziehen lassen, die sich im Umkreis von 25 Meilen vom Lat befinden und lange von meiner Datenbank der Orte entfernt sind.

Was ist der beste Weg, dies zu tun?

BEARBEITEN: Ich habe diesen Code zur Berechnung der Entfernung zwischen 2 Punkten gefunden.

%Vor%

Gibt es eine Möglichkeit, diese Berechnung in der MYSQL-Suche durchzuführen, so dass ich nur zurückkehren kann, wenn meilen = & lt; 25?

    
shaneburgess 31.08.2010, 04:57
quelle

3 Antworten

6

Die Berechnung der Entfernung mit dieser Funktion ist ziemlich rechenintensiv, weil sie eine ganze Reihe transzendenter Funktionen beinhaltet. Dies wird problematisch sein, wenn Sie eine große Anzahl von Zeilen filtern müssen.

Hier ist eine Alternative, die viel weniger rechenintensiv ist:

Ungefähre Entfernung in Meilen:

%Vor%

Sie können die Genauigkeit dieser ungefähren Abstandsberechnung verbessern, indem Sie die Cosinus-Mathematikfunktion hinzufügen:

Verbesserte ungefähre Entfernung in Meilen:

%Vor%

Quelle: Ссылка

Ich habe eine Reihe von Tests mit zufällig generierten Datensätzen durchgeführt.

  • Der Unterschied in der Genauigkeit der 3 Algorithmen ist minimal , besonders bei kurzen Entfernungen
  • Der langsamste Algorithmus ist natürlich derjenige mit den trigonometrischen Funktionen (der auf Ihrer Frage). Es ist 4x langsamer als die anderen beiden.

Definitiv nicht wert. Gehen Sie einfach mit einer Annäherung.
Code ist hier: Ссылка

Um dies für MySQL zu verwenden, erstellen Sie eine gespeicherte Prozedur , die Koordinatenargumente akzeptiert und gibt die Entfernung zurück, dann können Sie etwas tun wie:

%Vor%     
NullUserException 31.08.2010, 05:21
quelle
2

Vielleicht möchten Sie diese Lösung - ein wenig brilliante Abhilfe.

    
djn 31.08.2010 14:30
quelle
0

Sie können es leicht in zwei Schritten tun:

  • Finde alle Orte innerhalb von 25 Meilen in jeder Richtung des Punktes. Dies sieht folgendermaßen aus: WHERE lat BETWEEN $lat1 AND $lat2 AND lng BETWEEN $lng1 AND $lng2

  • Dann wiederhole jedes Ergebnis und überprüfe mit deinem Code, ob es wirklich innerhalb von 25 Meilen ist. (d. h., filtere die Orte heraus, die sich in den Ecken des Quadrats befinden.)

Für den ersten Teil, hier ist ein Code, den ich herumliegen habe (erinnere mich nicht an die Quelle):

%Vor%

Im Grunde verwenden Sie einfach ($lat - $lat_range, $lat + $lat_range) und ($lng - $lng_range, $lng + $lng_range) Radius ist in Meilen.

Offensichtlich können Sie die Mathematik etwas aufräumen.

Bearbeiten: Ich habe vergessen zu erwähnen, dass Sie es ein wenig zwicken müssen, wenn Sie Standorte in der Nähe des Äquators, internationale Datumsgrenze usw. unterstützen müssen. Offensichtlich für Nordamerika wäre es in Ordnung, wie es ist.

>     
Matthew 31.08.2010 05:35
quelle