Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP MySql и геолокация

Изчисляването на разстоянието с помощта на тази функция е доста скъпо изчислително, защото включва цял куп трансцендентални функции. Това ще бъде проблематично, когато имате голям брой редове за филтриране.

Ето алтернатива, приближение, което е много по-малко изчислително скъпо:

Приблизително разстояние в мили:

sqrt(x * x + y * y)

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

Можете да подобрите точността на това приблизително изчисление на разстоянието, като добавите косинусовата математическа функция:

Подобрено приблизително разстояние в мили:

sqrt(x * x + y * y)

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

Източник:http://www.meridianworlddata.com/Distance-Calculation.asp

Проведох куп тестове с произволно генерирани набори от данни.

  • Разликата в точността за 3-те алгоритма е минимална , особено на къси разстояния
  • Най-бавният алгоритъм, разбира се, е този с триг функции (този във вашия въпрос). Той е 4 пъти по-бавен от другите два.

Определено не си заслужава. Просто направете приблизително.
Кодът е тук:http://pastebin.org/424186

За да използвате това в MySQL, създайте съхранена процедура който приема координатни аргументи и връща разстоянието, тогава можете да направите нещо като:

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. MYSQL задава часова зона в PHP код

  2. намаляване на производителността на низовете като първични ключове?

  3. Как да спрем някой да се върне към предишната страница?

  4. PHP PDO MySQL заявка LIKE -> множество ключови думи

  5. командата за актуализиране е отказана за потребителя