【问题标题】:STDistance() return weird resultSTDistance() 返回奇怪的结果
【发布时间】:2019-01-02 08:47:36
【问题描述】:

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

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 是否有任何问题,或者我应该将其视为公里而不是米或其他什么?

【问题讨论】:

    标签: sql-server sqlgeometry


    【解决方案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 [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 vs STPolyFromText

    【讨论】:

    • 我想你的意思是geography 在第一行。
    • @PawełDyl 问题在这里,如果我使用点而不是我应该使用点(纬度,经度)和多边形我应该使用多边形(经度纬度)吗?例如,因为您在 Polygon 和 Point 中切换纬度和经度。
    • 嗯,是的。此处指定点:docs.microsoft.com/en-us/sql/t-sql/spatial-geography/…。我没有改变 POLYGON 坐标。
    • 作为一个简单的规则:geometry 更适合平坦区域(笛卡尔),geography 更适合“地球”计算(大地测量)。如果您单击我之前评论中的链接,您应该会看到以下声明 Point ( Lat, Long, SRID )Lat 是纬度,Long 是经度。
    • 根据specification:'椭圆体系统中多边形的内部由左手规则定义'。您可以: 1. 要求其他服务遵守规则。 2.如果规则总是被打破,则反转点。 3. 如果没有规则 - 从列表中选择形成最小区域的点 a) 从服务接收,b) 反转(一组应该可能覆盖几乎整个世界,切换 #2 和 #4 是反转 5 元素列表)。跨度>
    猜你喜欢
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多