Вопрос

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

Я хочу передать широту / 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):

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

В качестве краткости я обычно вычисляю градусы на милю как для широты, так и для 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`
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top