STDistance() возвращает странный результат
Я нахожу расстояние между двумя точками геометрии и следующий мой запрос
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 ответ
Первое: поскольку Земля не плоская, используйте 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
,