Расчет расстояния довольно затратен в вычислительном отношении, как говорили другие.Возвращение огромных наборов данных также не очень хорошая идея - особенно учитывая, что PHP не так уж хорош в производительности.
Я бы использовал эвристику, например приближение расстояния с простым сложением и вычитанием.
1 минута = 1,86 километра = 1,15 мили
Просто найдите в БД инциденты в этом диапазоне (фактически квадрат, а не круг), и тогда вы можетеработать с ними с помощью PHP.
РЕДАКТИРОВАТЬ : вот альтернатива;приближение, которое намного дешевле в вычислительном отношении:
Приблизительное расстояние в милях:
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
EDIT 2 : я провел несколько тестов со случайно сгенерированными наборами данных.
- Разница в точности для трех алгоритмов минимальна, особенно на коротких расстояниях
- Самый медленный алгоритм (один с целым набором функций триггера) в 4 раза медленнее другогодва.
Определенно не стоит.Просто перейдите с приближением.
Код здесь: http://pastebin.org/424186