Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP MySql und Geolokalisierung

Die Berechnung der Entfernung mit dieser Funktion dort ist ziemlich rechenintensiv, weil es eine ganze Reihe von transzendentalen Funktionen beinhaltet. Dies wird problematisch, wenn Sie eine große Anzahl von Zeilen zum Filtern haben.

Hier ist eine Alternative, eine Annäherung, die viel weniger rechenintensiv ist:

Ungefähre Entfernung in Meilen:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 53.0 * (lon2 - lon1) 

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

Verbesserte ungefähre Entfernung in Meilen:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Quelle:http://www.meridianworlddata.com/Distance-Calculation.asp

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

  • Der Genauigkeitsunterschied der 3 Algorithmen ist minimal , besonders auf kurze Distanzen
  • Der langsamste Algorithmus ist natürlich der 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:http://pastebin.org/424186

Um dies auf MySQL zu verwenden, erstellen Sie eine gespeicherte Prozedur das Koordinatenargumente nimmt und die Entfernung zurückgibt, dann können Sie so etwas tun:

SELECT columns 
  FROM table 
 WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25