2011-09-21 145 views
9

我有很多多邊形。理想情況下,所有的多邊形不得彼此重疊,但它們可以彼此相鄰。將多邊形轉換爲網格

但是實際上,我必須允許輕微多邊形重疊(由一定的容差所定義的),因爲所有這些多邊形是從用戶手繪圖輸入,這是不一樣的機器一種高精度如我希望他們能夠獲得。

我的問題是,有沒有什麼軟件庫組件:

  1. 允許一個輸入範圍的多邊形
  2. 檢查的,如果多邊形超過規定的公差
  3. 如果是重疊較多,然後停止或繼續
  4. 通過將公共頂點和邊組合在一起,根據多邊形的座標和元素創建網格?
  5. 更重要的是,將網格邊緣鏈接回原始多邊形的邊緣?

還是有人解決過這個問題嗎?

+0

多邊形是二維還是三維? –

回答

1

是的,您可以使用OGR。它有python綁定。具體來說,幾何類有一個Intersects方法。我並不完全理解你想在第4點和第5點想要什麼。

+0

我真的不認爲OGR是相關的,我正在尋找一般算法,而不是一些應用程序來讀取/寫入GIS特定格式的文件。 – Graviton

+0

恩,我看到你正在尋找一個圖書館,這正是OGR的。它可以完成全矢量操作,而且是許多GIS軟件包的基礎。所以是的,完全相關(除非你想手動)。 – Benjamin

+0

交集方法/函數將解決重疊要求,但僅限於2d並且僅在安裝GEOS時。通常,這意味着從源代碼構建。 Shapely可能是一個更好的選擇http://gispython.org/shapely/docs/1.0/manual.html –

2

這很長,只是因爲問題太大。我試圖根據你的要點對我的評論進行分組。

組件繪製多邊形

我的猜測是,你有有限的成功不提供更多的信息 - 組件繪製多邊形會覺得很連接到您所使用的語言和UI範例你的項目的其餘部分,即。 Web組件的代碼看起來與本地組件非常不同。

也許另一種選擇是將流程的這個元素與您正在嘗試做的其他事情分開。有一些非常棒的預先編輯器可用於創建2d和3d多邊形。

Inkscape是一個矢量圖形編輯器的例子,它可以很容易地輸入2D多邊形,並且具有生成輸出SVG的優點,這個SVG相當容易解析。

三維Blender是一款開源編輯器,可用於生成可導出爲多種格式的任意幾何圖形。

如果您可以使用google-maps API(可能位於本地HTML呈現控件中),並且您有興趣在地圖疊加層上添加空間點,則可能對相關的click-to-draw polygon question on stackoverflow感興趣。根據以往的經驗,其他地圖API如OpenLayers支持類似的方法。

檢查多邊形是否重疊

托馬斯噸他answer提出的觀點,即有一些可以用來解決這個問題以及相關查詢相關謂詞的家庭。如果你真的只是在兩個維度上尋找重疊和其他集合的理論操作(聯合,交集,設置差異),你可以使用General Polygon Clipper

當兩個多邊形不需要時,你可能還需要考慮稍微更通用的問題, t應該重疊或共享一個頂點。您可以使用Minkowski和來擴大(放大)二維和三維多邊形以避免此類問題。 Computational Geometry Algorithms Library具有這些算法的健壯實現。

我認爲你很可能是在尋找一種可以執行頂點焊接的軟件,Christer Ericson的書Real-time Collision Detection包含了對該領域基礎知識的廣泛和非常可讀的描述,以及相關的邊緣問題攫取,裂紋檢測,T型接頭等等。然而,儘管這本書包含了代碼片段,但我知道沒有現成的庫來解決這些問題,特別是,除了基本的頂點焊接之外,沒有給出任何完整的實現。

很明顯,所有的3D軟件包(攪拌機,maya,max,rhino)都包含內置的軟件和工具來解決這個問題。基於頂點

從以往的經驗

集團多邊形,這竟然是耗時開發軟件來解決這方面的問題的部分時間最多的一個。它需要對圖論和算法有合理的理解來穿越邊界。值得依靠一個堅實的幾何圖形庫來爲你做繁重的工作。在過去,我通過igraph獲得了成功。

將更新的多邊形鏈接回原件。

再次,從過去的經驗來看,這只是一個小心的記錄,以及一些非常小心的網格類預先設計。我想提供更多的建議,但即使在過去六個月裏花了很大一部分時間,我仍然努力尋找一個「很好」的方式來做到這一點。

其他意見

如果您與用戶互動,我會強烈建議避免這種問題,即可能通過使用「捕捉」,捨去所有的用戶輸入的點到電網的編輯。這將有望顯着減少您必須完成的工作量。