2011-12-14 202 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)現在,如果計數器爲奇數貴點就在裏面,如果是偶數或零它是多邊形的外。