2011-12-14 133 views
1

我们正在研究一个地图解决方案。 这里用户在地图上绘制了一个多边形,对于给定的点我们需要查找点是在多边形中还是在多边形之外。根据经度 - 点纬度

根据http://www.sql-statements.com/point-in-polygon.html,我们正在使用一种SQL技术来完成这项任务直到现在,但在此期间我们发现它不适用于某些区域。

有没有人有适当的解决方案呢?我们也可以尝试C#中的解决方案,如果其工作正常

谢谢。

+0

删除了由Jasonw添加的Geolocation标签,因为Geolocation“更强调确定一个有意义的位置(例如街道地址)而不仅仅是一组地理坐标”[Wikipedia] – 2011-12-14 08:51:48

+0

您能否说它以何种方式失败?扫描该代码似乎是一个非常好的光线追踪实现。它有什么问题? – 2011-12-14 09:04:57

回答

4

如果您使用的是SQL Server 2008,那么您可以使用STIntersection (geography Data Type) - SQL Server将为您做所有事情。

在这种情况下,我推荐SQL Server 2008,因为它提供了对地理数据的本地支持。在使用之前,“STIntersect giving incorrect result for geography Datatype”可能值得您阅读。从该网站举例:

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() 
1

意译从http://en.wikipedia.org/wiki/Point_in_polygon

做到这一点,最简单的方法是借鉴贵点的假想线在一个方向又算什么呢跨越的行数。如果它很奇怪,那么这个点就在里面,即使这个点在外面。

基本上遍历每个点对,找到它在哪里穿过水平线的位置,如果它跨越右边,增加计数器,如果它横向到左侧或根本不交叉,则忽略它。在你的点上的水平线也不应该被计数(边界条件)。

+0

这就是他们链接的代码所做的。 – 2011-12-14 09:05:14

1

恕我直言PIP解决方案的基本解释是缺少的重要的东西,即如何确定多边形的线条来实际测试已经越过一半。只是在MichałPowaga的解决方案不适合你的情况下。

Point 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)现在,如果计数器为奇数贵点就在里面,如果是偶数或零它是多边形的外。