2

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

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
4

1 回答 1

2

您可以使用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
于 2014-08-08T03:50:47.373 回答