Python / Shapely触摸包含

时间:2014-08-06 20:34:16

标签: python shapely

我正在尝试编写一种算法,可以检查多边形是否在另一个内,但它们共享一个边框。

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

1 个答案:

答案 0 :(得分:1)

您可以使用DE-9IM模型检查详细的空间关系,其中“相交”,“包含”等基于。这些数据可以从relate获得:

A = poly
B = poly2
rel = A.relate(B)
print(rel)  # 212F11FF2

在JTS TestBuilder中看到: DE-9IM

所以要找到“poly2中的至少一个点在poly中并且它们不交叉(poly内外的点)”并且如果它们“共享边界”,这是空间谓词 - 说这需要所有条件是真的:

  • I(A)∩I(B)= 2或rel[0] == '2'以查找B中的至少一个点是否在A中,并且是否产生了面交叉
  • B(A)∩B(B)= {0,1}或rel[5] in '01'以查看两者是否共享边界(点或线)
  • E(A)∩I(B)= F或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