SQL 地理总是相交 returns 1
SQL Geography Intersect always returns 1
我正在尝试确定一个点是否在多边形内。无论该点是否在边界内,我得到的结果似乎总是返回 1。
DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(54.2225,-4.5366, 4326)
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326)
SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)
我在本地使用 SQL Express 2014 运行
你的问题很经典。在几何多边形中指定点的顺序是有意义的。正如您定义的那样,您已经创建了一个多边形,它是整个地球减去一个小洞。幸运的是,这个问题的测试和修复都相当容易。
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326)
set @polygon = @polygon.ReorientObject();
select @polygon.EnvelopeAngle()
如果注释掉对 ReorientObject()
的调用,您会看到包络角为 180 度。这是我个人用来查看是否存在环方向问题的启发式方法。您也可以使用 STArea()
检查该区域。无论哪种方式,重新定向的对象都是您可能期望的,并且在进行交叉测试时应该会给您带来更好的结果!
我正在尝试确定一个点是否在多边形内。无论该点是否在边界内,我得到的结果似乎总是返回 1。
DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(54.2225,-4.5366, 4326)
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326)
SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)
我在本地使用 SQL Express 2014 运行
你的问题很经典。在几何多边形中指定点的顺序是有意义的。正如您定义的那样,您已经创建了一个多边形,它是整个地球减去一个小洞。幸运的是,这个问题的测试和修复都相当容易。
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326)
set @polygon = @polygon.ReorientObject();
select @polygon.EnvelopeAngle()
如果注释掉对 ReorientObject()
的调用,您会看到包络角为 180 度。这是我个人用来查看是否存在环方向问题的启发式方法。您也可以使用 STArea()
检查该区域。无论哪种方式,重新定向的对象都是您可能期望的,并且在进行交叉测试时应该会给您带来更好的结果!