多边形内的 SQL 地理点在 STIntersect 上不返回 true(但使用 Geometry 返回 true)

问题描述 投票:0回答:2

我不想求助于将我的地理数据转换为几何,只是为了在 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)

它返回真,有什么我想念的吗?我所知道的是地理是 3D 平面,几何是平面地图,但是如果点在多边形中,我正在使用地球进行计算。

PS:它不适用于 STContains、STWithin、STOverlaps

使用 Microsoft SQL Server 2012

sql geometry polygon point geography
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)

你必须小心描述多边形的“方向”

geography
- 考虑定义为围绕赤道的圆形的多边形 - 你打算指定北半球还是南半球?

这里

在椭球系统中,多边形没有意义,或者是模糊的,没有方向。例如,赤道周围的环代表北半球还是南半球?如果我们使用地理数据类型来存储空间实例,我们必须指定环的方向并准确描述实例的位置。椭圆体系统中多边形的内部由左手法则定义。


1
投票

您需要应用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())

下面的图片将展示不同之处

#Update_2023 加分应该是反的 椭圆体系统中多边形的内部由“左手法则”定义:如果您想象自己沿着地理多边形的环行走,按照列出的顺序跟随点,左边的区域被视为多边形的内部,右边的区域被视为多边形的外部。

逆时针

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 @polygon.ReorientObject()

© www.soinside.com 2019 - 2024. All rights reserved.