我想获得几个重叠矩形的外边界。
我编写了一个函数来计算给定矩形的邻居,但我想知道是否有办法获得相邻矩形的外边界。
这就是我所拥有的:
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。
以下是此功能涵盖的案例:
该函数只返回直接邻居,但我希望有一个函数来返回所有邻接矩形的外边界:
在这种情况下,输入将是所有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 :(得分: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,其组件可以轻松访问,如上面的代码所示。然后,您可以过滤组件,例如包含您的参考矩形等