Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PHP MySQL i geolokalizacja

Obliczanie odległości za pomocą tej funkcji jest dość kosztowne obliczeniowo, ponieważ obejmuje całą masę funkcji transcendentalnych. Będzie to problematyczne, gdy masz dużą liczbę wierszy do filtrowania.

Oto alternatywa, przybliżenie, które jest znacznie mniej kosztowne obliczeniowo:

Przybliżona odległość w milach:

sqrt(x * x + y * y)

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

Możesz poprawić dokładność tego przybliżonego obliczenia odległości, dodając funkcję matematyczną cosinusa:

Poprawiona przybliżona odległość w milach:

sqrt(x * x + y * y)

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

Źródło:http://www.meridianworlddata.com/Distance-Calculation.asp

Przeprowadziłem kilka testów z losowo generowanymi zestawami danych.

  • Różnica w dokładności trzech algorytmów jest minimalna , szczególnie na krótkich dystansach
  • Najwolniejszy algorytm to oczywiście ten z funkcjami trygonometrycznymi (ten z twojego pytania). Jest 4x wolniejszy niż pozostałe dwa.

Zdecydowanie nie warto. Po prostu przejdź do przybliżenia.
Kod jest tutaj:http://pastebin.org/424186

Aby użyć tego w MySQL, utwórz procedurę składowaną który pobiera argumenty współrzędnych i zwraca odległość, możesz zrobić coś takiego:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skuteczne strategie tworzenia kopii zapasowych i odzyskiwania danych MySQL/MariaDB

  2. Jak określić, co jest bardziej skuteczne:RÓŻNE czy GDZIE ISTNIEJE?

  3. SQLSTATE [HY000] [1045] Odmowa dostępu dla użytkownika 'nazwa_użytkownika'@'localhost' przy użyciu CakePHP

  4. Cel SQLAlchemy nad MySQLdb

  5. Co wydarzyło się najpierw w mysql:dołącz lub gdzie