Изчисляването на разстоянието с помощта на тази функция е доста скъпо изчислително, защото включва цял куп трансцендентални функции. Това ще бъде проблематично, когато имате голям брой редове за филтриране.
Ето алтернатива, приближение, което е много по-малко изчислително скъпо:
Приблизително разстояние в мили:
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