我正在尝试编写一种算法,可以检查多边形是否在另一个内,但它们共享一个边框。
from shapely.geometry import Polygon
poly = Polygon(((0, 0), (0, 2), (2, 2), (2, 0)))
poly2 = Polygon(((0, 0), (0, 1), (1, 1), (1, 0)))
# poly.contains(poly2) will return False
除了检查poly2中的至少一个点是否在poly中并且它们不交叉(poly内外的点)之外,还有其他方法吗?
from shapely.geometry import Polygon
poly = Polygon(((0, 0), (0, 2), (2, 2), (2, 0)))
poly2 = Polygon(((0, 0), (0, 1), (1, 1), (1, 0)))
poly3 = Polygon(((0, 0), (0, 1), (-1, 1), (-1, 0)))
# desired result poly.func(poly2) == True poly.func(poly3) == False
答案 0 :(得分:1)
您可以使用DE-9IM模型检查详细的空间关系,其中“相交”,“包含”等基于。这些数据可以从relate
获得:
A = poly
B = poly2
rel = A.relate(B)
print(rel) # 212F11FF2
在JTS TestBuilder中看到:
所以要找到“poly2中的至少一个点在poly中并且它们不交叉(poly内外的点)”并且如果它们“共享边界”,这是空间谓词 - 说这需要所有条件是真的:
rel[0] == '2'
以查找B中的至少一个点是否在A中,并且是否产生了面交叉rel[5] in '01'
以查看两者是否共享边界(点或线)rel[6] == 'F'
以查找B是否不跨越A 所以,制作自己的空间谓词:
def my_criteria(A, B):
rel = A.relate(B)
return rel[0] == '2' and rel[5] in '01' and rel[6] == 'F'
my_criteria(poly, poly2) # True
my_criteria(poly2, poly) # False