2017-03-15 155 views
0

我想獲得幾個重疊矩形的外邊界。計算相鄰矩形的邊界

我寫了一個函數來計算給定的矩形的鄰居,但我想看看是否有辦法獲得相鄰矩形的外邊界。

這是我有:

def get_neighboring_rectangles (r, rectList): 
overlapDict = {} 
rminX, rmaxX, rminY, rmaxY = return_bbox_of_rectangle(r) 
for rectCheck,ri in rectList: 
    if r == rectCheck: continue 
    rcminX, rcmaxX, rcminY, rcmaxY = return_bbox_of_rectangle(rectCheck) 
    for d in ['E', 'W', 'N', 'S']: 
     if not ((rcmaxY < rminY or rcminY > rmaxY) or (rcmaxY == rminY) or (rcminY == rmaxY)): 
      if d == 'W' and rcmaxX == rminX: 
       if d not in overlapDict: overlapDict[d] = [] 
       overlapDict[d].append((rectCheck,ri)) 
      if d == 'E' and rcminX == rmaxX: 
       if d not in overlapDict: overlapDict[d] = [] 
       overlapDict[d].append((rectCheck,ri)) 
     if not ((rcmaxX < rminX or rcminX > rmaxX) or (rcmaxX == rminX) or (rcminX == rmaxX)): 
      if d == 'S' and rcmaxY == rminY: 
       if d not in overlapDict: overlapDict[d] = [] 
       overlapDict[d].append((rectCheck,ri)) 
      if d == 'N' and rcminY == rmaxY: 
       if d not in overlapDict: overlapDict[d] = [] 
       overlapDict[d].append((rectCheck,ri)) 
return overlapDict 

上述程序返回每個方向上的鄰居:E,W,N,S。

下面是此功能覆蓋情況:

Adjacent rectangle in S direction

函數只返回什麼是近鄰,但我希望有一個功能來返回所有對接矩形的外邊界:

Abutting rectangles

在這種情況下,輸入將所有3個矩形的邊界列表:

[[(0,0) (7,0) (7,4) (0,4)] [(4,4) (7,4) (7,6) (4,6)] [(1,6) (7,6) (7,10) (1,10)]] 

預期輸出 - [(0,0) (7,0) (7,10) (1,10) (1,6) (4,6) (4,4) (0,4)]

而且,請注意,有可能是不對接了上述3個矩形的第四矩形。理想情況下,第四個邊界應該返回原樣。 (我可以使用我的鄰居檢測算法完成)

我有點失落,我該如何解決這個問題。有沒有一個Python庫具有這種功能?

+0

嘿,你可以添加輸入的預期輸出? – Neil

+0

感謝您指出。我現在添加了它。 – sanjay

回答

2

我不知道,如果你堅持一個定製的解決方案,但如果沒有,那麼也許shapely包可以提供接近這個實用的工具:

from shapely.geometry import MultiPolygon, Polygon, box 
from shapely.ops import unary_union 

L = [box(0, 0, 7, 4), box(4, 4, 7, 6), box(1, 6, 7, 10), box(100, 100, 110, 110)] 
P = unary_union(L) 
if P.geom_type == 'Polygon': 
    P = MultiPolygon([P]) 

for Q in P: 
    print(list(Q.exterior.coords)) 

這給:

[(110.0, 100.0), (110.0, 110.0), (100.0, 110.0), (100.0, 100.0), (110.0, 100.0)] 
[(7.0, 4.0), (7.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 4.0), (4.0, 6.0), (1.0, 6.0), (1.0, 10.0), (7.0, 10.0), (7.0, 6.0), (7.0, 4.0)] 

在這裏,L包含您的問題的矩形列表(框),以及一個不接觸任何其他的矩形的框。函數unary_union計算所有這些函數的聯合,因此通常情況下,結果是一個MultiPolygon,它的組件可以輕鬆訪問,如上面的代碼所示。然後,您可以過濾組件,例如包含您的參考矩形等。

+0

感謝您的指針。我嘗試在我的環境中進行勻稱安裝,但我缺少一些C二進制文件,而且我沒有管理員權限來執行此操作。 :( – sanjay

+0

我有matplotlib和開羅可用......不知道他們是否可以幫助解決這個問題。 – sanjay