2017-02-17 192 views
0

給定一個多邊形列表,我試圖找出所有不同的非重疊區域的邊界。相交多邊形的非重疊區域的邊界

polygon_lst = [] 
for xyloc in xylocs: 
    polygon_lst.append(Polygon(xyloc)) 

這與this類似的問題。不過,我得到一個錯誤,當我運行unary_union操作:

from shapely.geometry import LineString 
layer = polygon_lst 
rings = [LineString(list(pol.exterior.coords)) for pol in layer] 
from shapely.ops import unary_union, polygonize 

ERROR:shapely.geos:TopologyException: found non-noded intersection between LINESTRING (103.333 327.917, 103 328) and LINESTRING (104.2 327.2, 103 328) at 103.00000000000006 328

我都試過,我創建相互重疊的頂部的所有多邊形的面具一種替代方法。然後,我嘗試通過Canny檢測器提取不同的區域,並在opencv中找到Contour函數。然而,由這種方法產生的邊界是連接的(不是每個不同區域的邊界)而且是非閉合的。

enter image description here enter image description here

會是什麼,我可以去尋找這些非重疊區域及其邊界的好辦法?

回答

0

對任意多邊形的布爾運算比第一次出現要困難得多,主要是因爲退化問題。

如果您將多邊形渲染到緩衝區,則填充邊距,然後繪製輪廓,即可實現目標。

在二進制圖像庫 (您需要drawbinary.c繪製多邊形並執行泛洪填充,binaryutils.c或chaincodes.c來獲取輪廓,這取決於你想要它們(作爲xys的列表或作爲上下,左右命令的鏈)

https://github.com/MalcolmMcLean/binaryimagelibrary