我有一个包含大量多边形的列表(>10^6),其中大多数是非交叉的,但其中一些多边形是另一个多边形的孔洞(约10^3个案例)。下面是一张图片来解释这个问题,小多边形是大多边形中的一个孔洞,但两者都是多边形列表中的独立多边形。
现在,我希望能够高效地确定哪些多边形是孔洞并减去这些孔洞,即减去完全位于另一个多边形内部的小多边形,并返回一个“清理过”的多边形列表。 孔洞和父多边形对应关系应该转换成如下形式(也就是将孔洞从父多边形中减去):
虽然stackoverflow和gis.stackexchange.com上有很多类似的问题,但我没有找到一个实际解决这个问题的问题。以下是一些相关的问题:
1. https://gis.stackexchange.com/questions/5405/using-shapely-translating-between-polygons-and-multipolygons
2. https://gis.stackexchange.com/questions/319546/converting-list-of-polygons-to-multipolygon-using-shapely
下面是一段示例代码。
from shapely.geometry import Point
from shapely.geometry import MultiPolygon
from shapely.ops import unary_union
import numpy as np
#Generate a list of polygons, where some are holes in others;
def generateRandomPolygons(polygonCount = 100, areaDimension = 1000, holeProbability = 0.5):
pl = []
radiusLarge = 2 #In the real dataset the size of polygons can vary
radiusSmall = 1 #Size of holes can also vary
for i in range(polygonCount):
x, y = np.random.randint(0,areaDimension,(2))
rn1 = np.random.random(1)
pl.append(Point(x, y).buffer(radiusLarge))
if rn1 < holeProbability: #With a holeProbability add a hole in the large polygon that was just added to the list
pl.append(Point(x, y).buffer(radiusSmall))
return pl
polygons = generateRandomPolygons()
print(len(pl))
现在我该如何创建一个新的多边形列表,将孔洞去除。Shapely提供了从一个多边形中减去另一个多边形(difference)的函数,但是是否有类似于多个多边形列表的函数(可能类似于unary_union),可以去除重叠的部分?另外,如何高效地确定哪些是孔洞,并从大的多边形中删除它们?