Обратная формула Haversine для MySQL?
-
20-08-2019 - |
Вопрос
В моей базе данных я храню центральную точку вместе с радиусом (в метрах).
Я хочу передать широту / lng, а затем сохранить значения mysql, которые я сохранил, создать круг, чтобы сообщить мне, находится ли моя точка, в которую я передал, в пределах этого круга.Есть ли что-то, что позволило бы мне сделать это, похожее на haversine forumla (который предполагал бы, что моя точка зрения уже была в БД).
Формула Хаверсина:( 3959 * acos( cos( радианы (40) ) * cos ( радианы ( широта ) ) * cos ( радианы ( long
) - радианы (-110) ) + sin (радианы (40) ) * sin ( радианы( long
) ) )
дб:
Центр окружности, Центр окружности, Радиус
передача в> выберите идентификатор из foo, где lat,lng в (функция создания круга:Окружность, окружность, радиус)
Решение
MySQL обладает целым рядом функций для обработки пространственных данных:
Пространственные расширения для MySQL
Я думаю, что раздел, посвященный измерению взаимосвязей между геометриями, - это то, что вам нужно:
Другие советы
Я выполнил аналогичный географический поиск, вычислив ограничивающую рамку через большое расстояние по окружности и запросив для этого базу данных.Вам все еще нужен еще один проход в вашем приложении, чтобы "закруглить углы" от ограничивающей рамки до круга.
Итак, учитывая базу данных точек, точку поиска (X, Y) и расстояние D, найдите все точки в пределах D от (X,Y):
- Вычислите deltaX, которое является точкой, если вы переместили расстояние D вдоль оси Y.
- Вычислите deltaY, которая является точкой, если вы переместили расстояние D вдоль оси X.
- Вычислите свой ограничивающий прямоугольник:(X-deltaX, Y-deltaY), (X + deltaX, Y + deltaY)
- Запрашивать базу данных точек с использованием SQL МЕЖДУ оператором:ВЫБЕРИТЕ * ИЗ ТАБЛИЦЫ, ГДЕ X МЕЖДУ X-deltaX И X + deltaX И Y МЕЖДУ Y-deltaY И Y + deltaY
- Обработайте список возвращенных точек, вычислив фактическое расстояние по большому кругу, чтобы удалить точки в углах квадрата, которые не находятся в пределах вашего круга расстояний.
В качестве краткости я обычно вычисляю градусы на милю как для широты, так и для lon (на экваторе, поскольку градусы на милю различаются на полюсах для lon), и вывожу deltaX и deltaY как (D * градусы широты на милю) или градусы лон на милю.Разница на экваторе и полюсе не имеет большого значения, поскольку я уже вычисляю фактическое расстояние после SQL-запроса.
К вашему сведению - от 0,167469 до 0,014564 градусов по гринвичу на милю и от 0,014483 градусов по широте на милю
Я знаю, что это давно устаревший пост, но, на случай, если кто-нибудь когда-нибудь наткнется на это, вам вообще не нужно создавать "обратную формулу хаверсина".Формула Хаверсина дает расстояние между точками а и в.Для вашего расчета вам нужно расстояние между точками b и a.Это одно и то же значение.
SELECT *,
( 3959 * acos( cos( radians(40) ) * cos( radians( `circleLatCenter` ) ) * cos( radians( `circleLngCenter` ) - radians(-110) ) + sin( radians(40) ) * sin( radians( `circleLngCenter` ) ) ) as `haversine`
FROM `table` WHERE 1=1
HAVING `haversine` < `Radius`