Я должен вычислить расстояние между объектом (городом) и каждой из нескольких записей из таблицы MySQL, которую я имею (некоторые рестораны). Этот город и рестораны находятся в одной стране.
Расчетное расстояние используется, чтобы показать все рестораны, которые находятся близко к этому городу; пороговое расстояние произвольно. Кроме того, это ранжированный список: самые близкие рестораны показываются первыми, а самые отдаленные - в конце списка. Моя проблема связана с этим ранжированием.
Что я сейчас сделал
Итак, я провел несколько исследований, и мне удалось вычислить это расстояние.
$special_select_distance = "DEGREES(ACOS(COS(RADIANS(" . $oneVilles->__get('latitude')[app::getLang()] . ")) * COS(RADIANS(lat)) * COS(RADIANS(lon) - RADIANS(" . $oneVilles->__get('longitude')[app::getLang()] . ")) + SIN(RADIANS(" . $oneVilles->__get('latitude')[app::getLang()] . ")) * SIN(RADIANS(lat))))";
$restaurants = $restaurantsDAO->getAll(null, ['distance DESC'] , null, 'HAVING distance < 1.9' , null , '*, ' . $special_select_distance . " AS distance");
... где:
['distance DESC']
обозначает ранжирование по расстоянию
'HAVING distance < 1.9'
обозначает произвольный порог
'*, ' . $special_select_distance . " AS distance"
является селектором
$oneVilles->__get('latitude')[app::getLang()]
и $oneVilles->__get('longitude')[app::getLang()]
- координаты города, широта и долгота
lat
и lon
- координаты ресторана (автоматически учитываются в таблице, по которой мы выполняем итерацию, , то есть: restaurants
таблица, поскольку мы используем рестораны DAO)
Вопрос
Фактический и неожиданный результат
Для каждого из ресторанов, которые достаточно близки между собой, расчетное расстояние до города остается неизменным.
Пример: предположим, что рестораны A и B довольно близки. Тогда расстояние между А и городом такое же, как у В и города, это мой фактический и неожиданный результат.
Это не то, что я хочу. Действительно, на самом деле один из этих ресторанов ближе к городу, чем другой. Я думаю, что в MySQL недостаточно точности.
Ожидаемый результат
Ожидаемый результат: составить рейтинг ресторанов по расстоянию до города. Другими словами, чтобы получить более точное вычисленное расстояние.
Пример: предположим, что рестораны A и B довольно близки. Тогда расстояние между А и городом короче, чем В и городом, это мой ожидаемый результат.
Примеры вычисленных расстояний
Между рестораном и городом (ресторан находится далеко от города): 1.933156948976873
Между рестораном A и городом (A находится недалеко от города): 1.6054631070094885
Между рестораном B и городом (B находится рядом с A): 1.6054631070094885
Расстояния в точках 2. и 3. одинаковы и это не нормально. Я хотел бы иметь больше цифр, чтобы иметь возможность более эффективно ранжировать свои рестораны.
Ограничения
Я бы не хотел менять конфигурацию MySQL Server.
- В частности: я абсолютно не могу использовать геометрические типы MySQL (это ограничение фирмы)
Ожидаемое решение должно просто изменить SQL-запрос, который я написал и предоставил вам, чтобы быть более точным, если это возможно.
При необходимости допускаются другие методы расчета расстояния.