4

我正在尝试编写一个 SQL 查询来确定给定点是否在多边形中。(我使用的是 SQL Server 2008 R2)。

我正在关注本教程(只需复制/粘贴它并更改一些表名),它几乎可以工作,但它根本不精确。例如,让我们考虑一个坐标为 : 的给定点。 如果你用 4 个顶点坐标在这个点周围画一个小多边形(一个近似的正方形):
P = 45.7664, 4.87383


S = 45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909

下面链接中给出的过程回答了该点不在多边形中,而它是...这是输出(带有我自己的格式文本):(
错误输出
多边形 20 是上面的多边形)

但是,如果您将正方形放大(在我的测试中放大了 10 倍),则程序回答我的观点在正方形中。

所以,我正在寻找另一种更精确的算法。
这是我的 VERTICE 表,包含我的数据库的每个多边形的所有顶点坐标 顶点表

我需要检查所有多边形(有几千个),如果传入参数的给定点在多边形中(如果是,是哪个)。我可以自己做循环,但我错过了多边形算法中的正确点。

有人可以帮助我吗?非常感谢。

概括

对应的 SQL 小提琴:http ://sqlfiddle.com/#!3/0caa4/1

4

1 回答 1

7

您的问题是您已经向后定义了多边形。让我们用原生 SQL 地理类型来探索这个

declare @s geography, @t geography, @p geography;
select @s = geography::STPolyFromText('POLYGON((45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909))', 4326);
select @t = geography::STPolyFromText('POLYGON((46.05227 5.366821, 45.73302 5.460205, 45.687 4.674683, 45.97215 4.693909, 46.05227 5.366821))', 4326);
select @p = geography::STPointFromText('POINT(45.7664 4.87383)', 4326);

select @p.STIntersects(@s), @p.STIntersects(@t);
select @p.STBuffer(10), @s, @t;

如您所见,@s它几乎拥有整个世界。在结果集查看器中,如果您放大“正方形”应该在的位置,您会发现一个洞。@t与您期望的区域进行对比。另请注意,我在 SQL 2012 中运行了这个,它改进了 2012 年之前存在的限制,即地理空间实例不能跨越半球边界。如果您在 2008 实例上运行上述内容,您可能会收到与@s. 注释掉定义的行@s,它会运行。

定义地理(地理/几何)多边形时有一个“右手”规则。想象一下,您正在按照您指定的顺序访问这些点的汽车中。您定义的区域是您从汽车右侧向外看时所看到的区域。

于 2013-10-27T21:41:22.110 回答