Реверс формулы Хаверсайна для MySQL? - PullRequest
8 голосов
/ 25 июня 2009

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

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

Формула Haversine: (3959 * acos (cos (радианы (40)) * cos (радианы (широта)) * cos (радианы (long) - радианы (-110)) + sin (радианы (40)) * sin (радианы (long)))

дб:

circleLatCenter, circleLngCenter, Radius

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

Ответы [ 3 ]

3 голосов
/ 26 июня 2009

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

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

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

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

2 голосов
/ 25 июня 2009

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

Итак, учитывая базу данных точек, точку поиска (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. Постобработка списка возвращенных точек с вычислением фактического расстояния большого круга, чтобы удалить точки в углах квадрата, которые не находятся в пределах вашего расстояния.

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

К вашему сведению - от 0,167469 до 0,014564 градуса на милю и 0,014483 градуса на милю

0 голосов
/ 23 января 2014

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