Ответ 1
Использование функций базы данных, таких как STDistance для всех n записей является субоптимальным. Накладные расходы процессора будут экспоненциально увеличиваться.
Что вам нужно сделать, так это проверить количество точек внутри прямоугольника вокруг текущего эпицентра, который вы ищете. Вот пример (в MySQL):
SELECT * FROM `points`
WHERE `latitude` >= X1 AND `latitude` <= X2
AND `longitude` >= Y1 AND `longitude` <= Y2
Это обеспечивает уменьшенные superset
точек, которые затем должны быть дополнительно уменьшены путем вычисления ортодромного расстояния (относительно кривизны Земли) с помощью Формула Хаверсина.
Не забудьте создать составной индекс на latitude
и longitude
.
Здесь он находится в PHP:
<?php
function haversine($latitude1, $longitude1,
$latitude2, $longitude2, $unit = 'Mi') {
$theta = $longitude1 - $longitude2;
$distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) +
(cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
switch ($unit) {
case 'Mi':
break;
case 'Km':
$distance = $distance * 1.609344;
}
return (round($distance, 2));
}
?>
Обновить:
Вот пример изображения, иллюстрирующий, что делать:
Первый поиск будет включать поиск столкновений с ограничивающим полем (пример MySQL) для определения superset
, исключая красные точки. Второй процесс проверки должен включать вычисление, если точки находятся в пределах соответствующего ортодромного расстояния с формулой Хаверсина (пример PHP) и принимают subset
(состоящий из черных точек).