用经纬度表示多边形中的点

本文关键字:多边形 经纬度 表示 | 更新日期: 2023-09-27 18:17:42

我们正在研究一个地图解决方案。在这里,用户在地图上绘制了一个多边形,对于给定的点,我们需要找出点是在多边形内还是在多边形外。

到目前为止,我们正在使用一种SQL技术按照http://www.sql-statements.com/point-in-polygon.html来完成这项任务,但在此期间,我们发现它在某些领域不起作用。

有人有合适的解决方案吗?我们也可以在c#中尝试解决方案,如果它工作良好

谢谢。

用经纬度表示多边形中的点

如果你使用的是SQL Server 2008,那么你可以使用STIntersection(地理数据类型)- SQL Server将为你做一切。

在这种情况下,我推荐SQL Server 2008,因为它提供了对地理数据的本地支持。在您使用它之前,"STIntersect给出不正确的地理数据类型结果"可能值得一读。来自该站点的示例:
declare @point geometry
declare @polygon geometry
set @point =  geometry::STGeomFromText('POINT (-88.22 41.50000001)', 4326)
set @polygon = geometry::STGeomFromText('POLYGON ((-88.2 41.5, -88.2 41.6, -88.3 41.6, -88.3 41.5, -88.2 41.5))', 4326)--124
Select @point.STIntersection(@polygon).ToString()

转述自http://en.wikipedia.org/wiki/Point_in_polygon

最简单的方法是从你的点向一个方向画一条想象的线,并计算它穿过的线的数量。如果是奇数,点在里面,偶数点在外面。

基本上遍历每个点对,找到它与你的点的水平线相交的位置,如果它与右相交,则增加计数器,如果它与左相交或根本不相交,则忽略它。在你的点上的水平线也不应该被计算(边界条件)。

我认为PIP解决方案的基本解释缺少了一半重要的东西,即如何确定实际测试多边形的哪些线已被越过。以防michaowpowaga的解决方案对你不起作用。

点p (x, y)是你的点。点P0(x0, y0)和P1(x1, y1)形成一条直线。我们画的假想线是水平线,用来看我们穿过多少条多线段。

1)首先确定哪些线实际上是可以交叉的(与你画的假想线平行的线,或者明显不会交叉的线的上方或下方的线):

For each line of the polygon, compute weather P would be able to cross it.
If ((x0 < x < x1) OR (x0 > x > x1)) add line to some list.

2)确定哪些剩余的行(列表中的行)实际上是交叉的:

For each line in list, compute
    result = (y - y0) * (x1- x0) - (x - x0) * (y1 - y0)
If (result < 0) the line was crossed, increment a counter.
If (result == 0) the point is ON the line, increment a counter if thats supposed
    to count as the point having crossed the line, else don't ...
If (result > 0) the line was not crossed, so just continue with the loop.
[Note: double check weather I got the sides right ...]

3)现在,如果计数器是奇数,你的点在里面,如果它是偶数或零,它在多边形外面。