Неправильные расстояния при сравнении значений географии в SQL - PullRequest
0 голосов
/ 09 октября 2019

У меня установлена ​​база данных SQL, содержащая несколько полей, одно из которых является географическим полем, называемым Координаты. Мне нужно найти все строки, которые находятся в пределах определенного радиуса, и для этого я использую запрос

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(-84.505562, 39.137706, 4326)

SELECT * , Coordinates.STDistance(@CurrentLocation) AS Distance FROM tParkingLot
WHERE Coordinates.STDistance(@CurrentLocation )<= 200000

, который дает мне следующие результаты enter image description here

первая строка возвращается, как и ожидалось, поскольку я использовал эти координаты в качестве своего центра. Однако при измерении двух других лотов на картах Google я обнаружил, что результаты должны быть ближе к 1133.246 для строки 2 и 74673.56 для строки 3

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

1 Ответ

3 голосов
/ 10 октября 2019

Причиной проблемы является порядок широты и долготы. В мире географии традиционно используется порядок (lat, lon), в мире SQL определяется порядок (x, y), что обычно означает порядок (lon, lat).

Точка конструктора Microsoft SQL Server пошла на запутанный компромисс: они используют порядок (x, y) для геометрии, но(lat, lon) порядок для географии:

Point ( Lat, Long, SRID )  [1]

Поскольку ваши баллы находятся в Цинциннати, а не в Антарктиде, порядок обмена аргументами меняется.

[1] https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/point-geography-data-type?view=sql-server-2017

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...