我正在找到两个几何点之间的距离,下面是我的查询
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而不是米或其他东西?
答案 0 :(得分:2)
首先:由于地球不是平坦的,请改用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
[meters],这似乎是正确的。
第二:要使用多边形,您必须注意orientation。地理类型中的“内部多边形”和“外部多边形”有所区别。如果多边形覆盖地球的一半-应该选择哪一半?这由方向确定。我切换了第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
[meters],这似乎是正确的。
第三:确保未更改您的纬度和经度坐标:请参见Point
与STPolyFromText
。