3

我正在寻找两个几何点之间的距离,以下是我的查询

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

但是当我在谷歌地图和必应地图上找到点之间的距离时,我得到了 100 米。

我还检查了与 SRID 相关的文档,当我使用 SRID 4326 时,它使用仪表作为测量值。因此,如果我将返回结果视为米,那么结果就会大不相同。

那么函数 STDistance 是否有任何问题,或者我应该将其视为 Km 而不是米或其他什么?

4

1 回答 1

3

第一:由于地球不是平坦的,请使用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] 似乎是正确的。


第二:要使用多边形,您必须注意方向。地理类型中的“内部多边形”和“外部多边形”是有区别的。如果多边形覆盖地球的一半 - 应该选择哪一半?这是由方向决定的。我交换了第 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] 似乎是正确的。


第三:确保你的经纬度坐标没有切换:见Pointvs STPolyFromText

于 2019-01-02T10:38:53.587 回答