SQL地理点在多边形内部不返回真值,使用STIntersect(但使用几何返回真值)

11

我不想将我的地理数据转换为几何数据,只是为了在STIntersect中返回true。

以下是SQL代码:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326)
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326)

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)
以下代码返回 false (0),但是如果我使用以下代码:
DECLARE @point GEOMETRY = GEOMETRY::Point(1, 1, 4326)
DECLARE @polygon GEOMETRY = GEOMETRY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326)

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

它返回true,我有什么遗漏的吗?我知道的是地理是3D平面,而几何是一个平面地图,但我正在使用地球来计算点是否在多边形内。

PS:使用STContains、STWithin、STOverlaps也不起作用。

使用Microsoft SQL Server 2012

2个回答

12

这个有效:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326)
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 4326)

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

地理 中描述多边形的“方向”需要小心 - 以赤道为中心的圆形定义的多边形,你是要指定北半球还是南半球呢?

请参考这里:

在一个椭球系统中,没有方向或者说存在歧义的多边形。例如,绕赤道的环描述的是北半球还是南半球?如果我们使用地理数据类型存储空间实例,必须指定环的方向并准确描述实例的位置。在椭球系统中,多边形内部由左手规则定义。


2
这是一篇很好的博客文章,解释了“左手规则”:http://danielwertheim.se/2012/12/03/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position-no/例如:如果一个点在多边形的所有线段的左侧,它就与多边形相交。 - bounav
上面解释左手规则的博客文章的URL应为:http://danielwertheim.se/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position-no/ - Daniel
长话短说,你应该逆时针列出你的要点。 - John Gietzen
@JohnGietzen 你是说“总是”吗?还是当你想要“除了(撒哈拉沙漠)整个地球表面”时,你按顺时针列出它们?(或者你仍然逆时针列出撒哈拉,然后问“不在其中”...) - Caius Jard

2

你需要应用ReorientObject来交换内部区域和外部区域。

DECLARE @point geography  = geography::Parse('POINT (-109.81715474571 32.2371931437342)');  
DECLARE @polygon geography  = geography::Parse('multipolygon (((-127.24365234375 37.944197500754,
-80.68359375 37.944197500754,
-80.68359375 24.966140159913,
-127.24365234375 24.966140159913,
-127.24365234375 37.944197500754)))
');  
SELECT @point.STIntersects(@polygon.ReorientObject())

以下图片将展示差异 输入图像描述 输入图像描述

#更新_2023 添加点应该是计数器 在椭球系统中,多边形的内部由“左手定则”定义:如果您想象自己沿着地理多边形的环走,按照它们列出的顺序跟随这些点,左侧的区域被视为多边形的内部,右侧的区域被视为多边形的外部。

逆时针

DECLARE @point geography  = geography::Parse('POINT (-109.81715474571 32.2371931437342)');  
    DECLARE @polygon geography  = geography::Parse('multipolygon (((
    -127.24365234375 37.944197500754,
    -127.24365234375 24.966140159913,
    -80.68359375 24.966140159913,
    -80.68359375 37.944197500754,
    -127.24365234375 37.944197500754)))
    ');  
    select @polygon
    SELECT @point.STIntersects(@polygon)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接