1

我试图得到多边形内的所有点,经过几次测试,我终于抓住了。

STIntersects即使在“视觉上”不在多边形中的点的情况下,也始终为我的所有实体返回 1。

我找到了有关多边形创建方向的帖子并尝试了它,但它没有帮助我:)

所以我决定创建一个简单的案例:

  1. 在俄罗斯某处具有 4 个顶点的多边形(角:55 37、56 38)
  2. 此多边形内的一点
  3. 还有一个在外面

这是带有点的谷歌地图的链接

这个测试的结果让我摆脱了困境

declare @cw geography, @ccw geography, @pointIn geography, @pointOut geography

-- counterclockwise direction from bottom left corner
set @ccw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,55.0 38.0
,56.0 38.0
,56.0 37.0
,55.0 37.0
))', 4326
)

-- clockwise direction from bottom left corner
set @cw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,56.0 37.0
,56.0 38.0
,55.0 38.0
,55.0 37.0
))', 4326
)

set @pointIn = geography::Point(55.5, 37.5, 4326)
set @pointOut = geography::Point(54, 36, 4326)


select @pointIn.STIntersects(@ccw) ccw, @pointIn.STIntersects(@cw) cw
-- result: 1   0

--here i should get inversed values, but it didnt happens
select @pointOut.STIntersects(@ccw) ccw, @pointOut.STIntersects(@cw) cw
-- result: 1   0

为什么会这样?我只是不明白我错过了什么

我希望pointIn当我的多边形很小时应该返回 1,当我的多边形是整个世界减去选定区域时pointOut返回 0,并且应该在第一种情况下返回 0,在第二种情况下返回 1

但是两个点都在逆时针多边形中返回 1。

更新

最后我的错误是geography::STPolyFromText 第一个应该是 lng 和第二个 lat 的输入参数的顺序。并且扩展顺序是不同的 msdn 说Point ( Lat, Long, SRID )

4

1 回答 1

1

在 SqlGeography 实例中,@ccw 定义了一个孔(由于它是逆时针顺序)。由于这个洞不在多边形内,它变成了地球上的一个洞。换句话说,你得到一个覆盖整个地球的多边形,减去你的 @cw 多边形。

Geography::Point也使用 WKT 的反向坐标,因此我相信您的纬度和经度坐标是错误的(不可能绝对确定),因为只有您知道您的数据。无论如何,附图应该足以解释这一点。“橙色”颜色是@ccw,蓝色是@cw,其余的都有标签。

如果您有 SSMS,您可以使用以下查询对其进行可视化,请注意这些点已被缓冲,以便您可以看到它们。

select
'Clockwise' AS Label,
@cw AS Item

union all

select
'Counter-Clockwise' AS Label,
@ccw AS Item

union all

select
'Point In' AS Label,
@pointIn.STBuffer(100000) AS Item

union all

select
'Point Out' AS Label,
@pointOut.STBuffer(100000) AS Item

希望能帮助到你。

在此处输入图像描述

于 2014-08-28T15:09:42.533 回答