查找单个地理数据框中所有多边形中包含的重叠区域
Find overlapping region contained in all polygons within single geodataframe
我试图找到一种方法来仅显示地理数据框中所有多边形共享的重叠区域。我的地理数据框包括来自 json 文件的多边形和多边形对象。我现在的实现涉及一个循环来遍历数据框中的每个多边形,但是,这对于大量多边形来说非常慢,而且它给了我每一对重叠,这不是我想要的。
poly1 = Polygon((-119.74583075160622, 35.66006995660339), (-116.30697167993921,35.66006995660339),(-116.30697167993921,34.64381654506288),(-119.74583075160622, 34.64381654506288), (-119.74583075160622,35.66006995660339))
poly2 = Polygon((-118.33337318007834,34.66887933945114),(-117.85950530106018,35.64583276246657),(-117.46804922708861,35.34949851066835),(-116.97357839680875,35.50618853311429),(-116.49971051779052,34.43697449261936),(-116.7881518354538,34.52755087908893),(-118.33337318007834,34.66887933945114))
poly3 = Polygon((-118.73689979855544,34.71741592303824),(-118.0153587441971,35.95953776175309),(-117.45151590111556,34.512388830922866),(-118.27885217295977,34.67014942956098),(-118.73689979855544,34.71741592303824))
以上是我的 gdf 中这个例子的内容。
overlaps =[]
for index, row in gdf.iterrows():
for jindex, jrow in gdf.iloc[index+1:].iterrows():
overlaps.append(jrow["geometry"].intersection(row["geometry"]))
可以有超过 3 个具有共享区域的重叠多边形,但是,可以假设每个额外的多边形将共享一个公共区域而不是异常值。
我希望它只显示多边形(1、2 和 3)内的重叠区域。不是每对:(1 和 2)(1 和 3)等...
有没有办法让我也可以使用 sjoin 来比较每个多边形,因为 sjoin 更快?
没有 minimal reproducible example,我无法证实这一点,但理论上你可以使用 functools.reduce()
:
一个接一个地链接交叉点
import functools
functools.reduce(lambda poly1, poly2: poly1.intersection(poly2), gdf["geometry"])
为了确保我正确理解问题,假设您有多边形 A
、B
和 C
-- 您想要这三个的交集?
如果是这样,那么我上面的建议 应该 有效,因为交集是关联的,即 A ∩ B ∩ C = A ∩ (B ∩ C) = (A ∩ B) ∩ C
.
我试图找到一种方法来仅显示地理数据框中所有多边形共享的重叠区域。我的地理数据框包括来自 json 文件的多边形和多边形对象。我现在的实现涉及一个循环来遍历数据框中的每个多边形,但是,这对于大量多边形来说非常慢,而且它给了我每一对重叠,这不是我想要的。
poly1 = Polygon((-119.74583075160622, 35.66006995660339), (-116.30697167993921,35.66006995660339),(-116.30697167993921,34.64381654506288),(-119.74583075160622, 34.64381654506288), (-119.74583075160622,35.66006995660339))
poly2 = Polygon((-118.33337318007834,34.66887933945114),(-117.85950530106018,35.64583276246657),(-117.46804922708861,35.34949851066835),(-116.97357839680875,35.50618853311429),(-116.49971051779052,34.43697449261936),(-116.7881518354538,34.52755087908893),(-118.33337318007834,34.66887933945114))
poly3 = Polygon((-118.73689979855544,34.71741592303824),(-118.0153587441971,35.95953776175309),(-117.45151590111556,34.512388830922866),(-118.27885217295977,34.67014942956098),(-118.73689979855544,34.71741592303824))
以上是我的 gdf 中这个例子的内容。
overlaps =[]
for index, row in gdf.iterrows():
for jindex, jrow in gdf.iloc[index+1:].iterrows():
overlaps.append(jrow["geometry"].intersection(row["geometry"]))
可以有超过 3 个具有共享区域的重叠多边形,但是,可以假设每个额外的多边形将共享一个公共区域而不是异常值。
我希望它只显示多边形(1、2 和 3)内的重叠区域。不是每对:(1 和 2)(1 和 3)等...
有没有办法让我也可以使用 sjoin 来比较每个多边形,因为 sjoin 更快?
没有 minimal reproducible example,我无法证实这一点,但理论上你可以使用 functools.reduce()
:
import functools
functools.reduce(lambda poly1, poly2: poly1.intersection(poly2), gdf["geometry"])
为了确保我正确理解问题,假设您有多边形 A
、B
和 C
-- 您想要这三个的交集?
如果是这样,那么我上面的建议 应该 有效,因为交集是关联的,即 A ∩ B ∩ C = A ∩ (B ∩ C) = (A ∩ B) ∩ C
.