SQL Geography数据类型,检查Point in Polygon,STIntersects产生错误的结果

时间:2017-10-19 12:00:53

标签: sql-server polygon spatial point sqlgeography

我试图检查多边形中的点,但是STIntersect产生错误的结果,下面给出了点和多边形。

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(25.631119, 54.666181, 4326)

DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON 
((55.368827104612151 25.270499845366924, 55.368226289792808 
25.268578811810126, 55.367410898252288 25.269529630198974, 
55.368054628415855 25.270364015710307, 55.368827104612151 
25.270499845366924))', 4326)

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)

结果返回1,但是它应该返回0,因为我选择了栅栏的一侧,

我对多边形坐标有什么问题吗?因为我是空间数据类型的新手,请告诉我任何愚蠢的错误。

1 个答案:

答案 0 :(得分:1)

为了修复"这个,我们需要做出一些形式的假设。如果假设不能指示用户输入符合左手规则的多边形"然后我们必须使用别的东西。

在这里,我假设正确的"意识"对于多边形而言,无论哪种方式都意味着它包围着最小的区域:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(25.631119, 54.666181, 4326)

DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON 
((55.368827104612151 25.270499845366924,
55.368226289792808 25.268578811810126,
55.367410898252288 25.269529630198974, 
55.368054628415855 25.270364015710307,
55.368827104612151 25.270499845366924))', 4326)

SET @polygon = CASE
    WHEN @polygon.STArea() > @polygon.ReorientObject().STArea()
        THEN @polygon.ReorientObject()
    ELSE @polygon
    END

SELECT @polygon

(您可能还希望在SELECT @polygon之前做一个简单的CASE来查看原始图片的内容。

但是,请仔细注意上述假设的含义 - 如果您的用户可能希望提供"整个行星减去东北55度/北纬25度的这个小区域,那么就有了#34;现在你无法接受这样的价值。

参考文献 - STArea ReorientObject