Расчет коротких расстояний между широтой / длинной точкой - PullRequest
2 голосов
/ 22 декабря 2011

У меня есть таблица MySQL с пространственными точками, и мне нужно рассчитать расстояния. Я нашел много материала об этом, используя формулу Хаверсайна, однако все они предполагают большое расстояние между точками. В моем случае я забочусь только о коротких расстояниях (<1 миля), поэтому мне не нужно корректировать кривизну Земли. Моя интуиция с использованием формулы Хаверсайна будет неточной на таких малых расстояниях. Есть предложения? </p>

Ответы [ 2 ]

3 голосов
/ 19 марта 2012

Ваша интуиция неверна. Рассмотрим формулу haversine и определение haversine, согласно Википедии ( φ - это широта, а ψ - это долгота):

haversin(d/r) = haversin(φ_2 - φ_1) + cos(φ_1) cos(φ_2) haversin(ψ_2 - ψ_1)

haversin(θ) = sin(θ/2)^2

Имеется еще один важный факт: для малых значений θ sin θ приблизительно равен θ ; более уместно, это приблизительно линейный в θ . Следовательно, haversin θ будет приблизительно ( θ / 2) ². Это приближение становится лучше, когда θ приближается к нулю .

Если широта и долгота близки друг к другу, то φ ₂ - φ ₁ и ψ ₂ - ψ ₁, что то, к чему здесь применяется функция haversine, будет близко к нулю, что означает, что формула приблизительно равна

(д / 2р) ² = (( φ ₂ - φ ₁) / 2) ² + cos ( φ ₁) cos ( φ ₂) (( ψ ₂ - ψ ₁) / 2) ²

Теперь обратите внимание, что эта формула имеет ту же форму, что и евклидово расстояние в двух измерениях с некоторыми произвольными масштабными коэффициентами (помня, что ( kx ) ² = k ² x ², чтобы мы могли перемещать константы в квадраты и из них):

k d ² = k ₂ ∆ φ ² + k ₃ ∆ ψ ²

Наконец, я безоговорочно утверждаю, что эти произвольные коэффициенты масштабирования оказываются теми же, которые преобразуют изменения широты / долготы в линейное расстояние.

Следовательно, формула haversine не становится неточной для небольших расстояний; он точно такой же, как обычный расчет евклидова расстояния, в пределе малых расстояний.

0 голосов
/ 25 февраля 2014
  1. Создание точек с использованием значений точек типов данных Geometry в таблице MyISAM

  2. Создание индекса SPATIAL для этих точек

Используйте MBRContains (), чтобы найти значения:

SELECT  *
FROM    table
WHERE   MBRContains(LineFromText(CONCAT(
        '('
        , @lon + 10 / ( 111.1 / cos(RADIANS(@lon)))
        , ' '
        , @lat + 10 / 111.1
        , ','
        , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
        , ' '
        , @lat - 10 / 111.1 
        , ')' )
        ,mypoint)

, или, в MySQL 5.1 и выше:

SELECT  *
FROM    table
WHERE   MBRContains
                (
                LineString
                        (
                        Point
                                (
                                @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
                                @lat + 10 / 111.1
                                ) 
                        Point
                                (
                                @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
                                @lat - 10 / 111.1
                                ) 
                        ),
                mypoint
                )

Это выберет все точки приблизительно в пределах поля (@lat+/- 10 км, @lon +/- 10 км).

На самом деле это не прямоугольник, а сферический прямоугольник: связанный с широтой и долготой сегмент сферы.Это может отличаться от простого прямоугольника на Земле Франца-Иосифа, но довольно близко к нему в большинстве населенных мест.

Применить дополнительную фильтрацию, чтобы выделить все внутри круга (не квадрата)

Возможноприменить дополнительную тонкую фильтрацию, чтобы учесть большое расстояние круга (для больших расстояний)

здесь следующее решение, чтобы нажать

...