SQL 地理数据类型,检查多边形中的点,STIntersects 产生错误结果
SQL Geography Datatype , checking Point in Polygon , STIntersects producing wrong result
我正在尝试检查多边形中的点,但 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)
结果是 returning 1,但它应该是 return 0,因为我选择了栅栏一侧的点,
我的多边形坐标有什么问题吗?由于我是空间数据类型的新手,请对我的任何愚蠢错误提出建议。
为了"fix"这个,我们需要做一些形式的假设。如果假设不能 "instruct the users to enter polygons that obey the left-hand rule" 那么我们必须使用其他东西。
在这里,我假设多边形的正确 "sense" 是指它包围的最小面积:
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
(您可能还希望在 CASE
之前做一个简单的 SELECT @polygon
以查看原始的样子)
但是,请注意上述假设的含义 - 如果您的用户可能希望提供 "the whole planet minus this small area around 55 degrees East/25 degrees North",您现在无法接受这样的值。
参考文献 - STArea
ReorientObject
我正在尝试检查多边形中的点,但 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)
结果是 returning 1,但它应该是 return 0,因为我选择了栅栏一侧的点,
我的多边形坐标有什么问题吗?由于我是空间数据类型的新手,请对我的任何愚蠢错误提出建议。
为了"fix"这个,我们需要做一些形式的假设。如果假设不能 "instruct the users to enter polygons that obey the left-hand rule" 那么我们必须使用其他东西。
在这里,我假设多边形的正确 "sense" 是指它包围的最小面积:
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
(您可能还希望在 CASE
之前做一个简单的 SELECT @polygon
以查看原始的样子)
但是,请注意上述假设的含义 - 如果您的用户可能希望提供 "the whole planet minus this small area around 55 degrees East/25 degrees North",您现在无法接受这样的值。
参考文献 - STArea
ReorientObject