Обратная формула Haversine для MySQL?

в моей БД я храню центральную точку вместе с радиусом (в метрах).

Я ищу, чтобы передать lat / lng, а затем значения mysql, которые я сохранил, создают круг, чтобы сказать мне, если моя точка, которую я передал, находится в этом круге. Есть ли что-то, что позволило бы мне сделать это, подобно haversine forumla (который предположил бы, что моя точка уже была в db).

Формула Haversine: ( 3959 * ЭКОСа( соѕ( радианы(40) ) * соѕ( радианы( лат ) ) * потому что( радианы( long ) - радианы(-110) ) + в Sin( радианы(40) ) * грех( радианы( long )))

db:

circleLatCenter, circleLngCenter, Radius

проходящий в> выберите id из foo, где lat, lng in (сделайте функцию круга: circleLat, circleLng, radius)

3 ответов


MySQL имеет целый ряд функций пространственных данных:

пространственные расширения для MySQL

Я думаю, что раздел об измерении отношений между геометрией - это то, что вам нужно:

Отношения Между Геометриями


Я сделал аналогичные географические поиски, вычисляя ограничивающую рамку через большое расстояние круга и запрашивая базу данных для этого. Вам все еще нужен еще один проход в вашем приложении, чтобы" обойти углы " от ограничительной рамки до круга.

Итак, учитывая базу данных точек, точку поиска (X, Y) и расстояние D,найдите все точки в пределах D (X, Y):

  1. вычислить deltaX, который является точкой, если вы переместили расстояние D вдоль оси Y.
  2. вычислить deltaY, который является точкой, если вы переместили расстояние D вдоль оси X.
  3. вычислите ограничивающую рамку: (X-deltaX,Y-deltaY), (X+deltaX,Y+deltaY)
  4. база данных запросов точек использует SQL между оператором: выберите * из таблицы, где X между X-deltaX и X + deltaX и Y между Y-deltaY и Y+deltaY
  5. Post-process список возвращенных точек, вычисляя фактическое большое расстояние круга, чтобы удалить точки в углах квадрата, которые не находятся в пределах вашего расстояния круг.

как укороченные, я обычно вычисляют градусов-в-милю для обоих широта и долгота (по экватору, так как ступени-за милю отличается на полюсах для долгота), и вывести deltaX и deltaY как (Д * градусов-широта-за милю) или в градусах-долгота-за милю. Разница на экваторе и полюсе не имеет большого значения, так как я уже вычисляю фактическое расстояние после SQL-запроса.

FYI-0,167469 до 0,014564 градуса-Лон-на-милю, и 0,014483 Градусы-лат-на-милю!--1-->


Я знаю, что это давно мертвый пост, но, если кто-нибудь когда-нибудь столкнется с этим, вам не нужно создавать "обратную формулу хаверсина" вообще. Формула Хаверсина дает расстояние между точкой a и точкой b. Для расчета необходимо расстояние между точкой 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`