STDistance () возвращает странный результат - PullRequest
0 голосов
/ 02 января 2019

Я нахожу расстояние между двумя точками геометрии, и вот мой запрос

DECLARE @g geometry;   
SET @g = geometry::STPolyFromText('POLYGON ((5.177074447274207  60.32819571126778,
5.177074447274207   60.32533671620816,
5.172660537064075   60.32533671620816,
5.172660537064075   60.32819571126778,
5.177074447274207   60.32819571126778)
                            )', 4326).MakeValid();  


DECLARE @h geometry;
SET @h = geometry::Point(5.1752474, 60.3290297, 4326)
Select @g.STDistance(@h)

, и вот результат, который я получаю

0.000833988732217961

Но когда я нахожу расстояние между точками на Google Map и Bing Map, я получаю 100mtr.

Я также проверил документацию, связанную с SRID, и, поскольку я использую SRID 4326, в качестве измерения используется счетчик.Так что, если я считаю результат возврата метрами, то результат будет совершенно другим.

Так есть ли проблемы с функцией STDistance или я должен считать это Km вместо метров или чем-то?

1 Ответ

0 голосов
/ 02 января 2019

Первое: поскольку Земля не плоская, вместо нее используйте geography типы:

--Closest point from polygon
DECLARE @g geography = geography::Point(60.32819571126778, 5.1752474, 4326)
--Reference point
DECLARE @h geography = geography::Point(60.3290297, 5.1752474, 4326)

SELECT @g.STDistance(@h)

Возвращает 92,9212347595042 [метров], что кажется правильным.


Второе: чтобы использовать полигон, необходимо позаботиться о ориентации . Существует различие между «внутренним многоугольником» и «внешним многоугольником» в типе географии. Если полигон покрывает половину Земли - какую половину следует выбрать? Это определяется ориентацией. Я переключил точки № 2 и № 4. Смотрите следующий пример:

DECLARE @g geography = geography::STPolyFromText('POLYGON ((
5.177074447274207   60.32819571126778,
5.172660537064075   60.32819571126778,
5.172660537064075   60.32533671620816,
5.177074447274207   60.32533671620816,
5.177074447274207   60.32819571126778))', 4326);  

DECLARE @h geography = geography::Point(60.3290297, 5.1752474, 4326)
SELECT @g.STDistance(@h)

Возвращает 92,9192581745513 [метры], что кажется правильным.


В-третьих: убедитесь, что ваши координаты широты и долготы не переключены: см. Point против STPolyFromText.

...