2013-02-19 139 views
2

我有一個多邊形的大列表(比如說大小爲250,000)和一個大的列表(比如100,000)。我需要做的是找出每個這些點屬於哪個多邊形。匹配點在多邊形列表中的多邊形

多邊形總是矩形/菱形,其中第一個點和最後一個點是相同的5個點。它們也有與多邊形相關的近似中心點。多邊形(a; b; c; d; a)=(3,1; 5,3; 3,5; 1,3; 3,1)和中心點(x)=( 3,3)。請參閱下面的示例圖:

  c (3,5) 
     /\ 
     /\ 
(1,3) d/ \b (5,3) 
     \ x/
     \/
     \/ 
      a (3,1) 

這是一個簡化示例。這些點中的大部分都是lat-lon/GIS座標。

點的輸入列表可能不匹配任何多邊形,也可能與多邊形列表中的一個或多個多邊形相匹配。

目前我有一個函數,它需要一個點和一個多邊形來查看點是否在多邊形內。任何時候我想看到一個點在多邊形中,我必須遍歷多邊形的完整列表來查看它是否匹配。另外,由於一個點可能在多個多邊形中,因此每次都必須遍歷完整列表。這是非常低效的。

我在找的是將這些多邊形排序成一個HashMap或其他東西,這樣我就可以快速獲取需要爲每個點檢查的幾個多邊形,而不是完整的多邊形列表。由於點有x和y兩個參數,因此我無法找到訂購多邊形的好方法。 另請注意,每個多邊形都有一箇中心點。那麼有沒有辦法將基於這些中心點的多邊形排序爲關鍵點,以便我們可以輕鬆查找?

對此有何想法/想法?謝謝!

回答

0

將您的二維空間拆分爲方形單元格,每個單元格存儲與該單元格相交的多邊形列表。當你需要檢查點時,首先找到所屬的單元點,然後遍歷所有與這個單元相交的多邊形並進行測試。選擇單元格大小,以便每個單元格有合理數量的多邊形。

如果您的多邊形分佈不均勻,您可能需要使用quadtree而不是方形單元格。