【发布时间】:2022-11-11 06:21:32
【问题描述】:
我有两个不同的 GeoDataFrames:其中一个包含一个大网格中的多边形正方形。另一个包含更大和更少的多边形。 我希望计算每个网格正方形与其他较大正方形的重叠面积。
为此,我做了一个简单的循环方法
for _, patch in tqdm(layer.iterrows(), total=layer.shape[0], desc=name):
# Index of intersecting squares
idx = joined.intersects(patch.geometry)
intersection_polygon = joined[idx].intersection(patch.geometry)
area_of_intersection = intersection_polygon.area
joined.loc[idx, "value"] += area_of_intersection
为了加快这种方法的速度,我将包含较大补丁的layer DataFrame 转换为 Dask-DataFrame。
我通过以下方式实现它:
def multi_area(patch, joined=None):
# Index of intersecting squares
idx = joined.intersects(patch.geometry)
intersection_polygon = joined[idx].intersection(patch.geometry)
area_of_intersection = intersection_polygon.area
joined.loc[idx, "value"] += area_of_intersection
return joined["value"]
layer_dask = dask_geopandas.from_geopandas(layer, npartitions=8)
with ProgressBar():
joined["value"] = layer_dask.apply(multi_area, meta=joined, joined=joined, axis=1).compute(scheduler='multiprocessing')
但是,这会返回错误 AttributeError: 'GeoDataFrame' object has no attribute 'name',此时我不确定这是否是最佳方法,以及我做错了什么。
我将要做的工作将有 4 亿个方格,所以我计划稍后在较小的区域上批量计算,因为我想不出更聪明的方法来做这件事......
【问题讨论】:
-
阅读有关 geopandas 空间连接的文档:geopandas.org/en/stable/gallery/spatial_joins.html。不要使用交叉口
-
谢谢,迈克尔。但是,我仍然需要计算网格和补丁之间的重叠区域。我猜我现在可以简化这个过程,因为补丁和网格是通过空间连接连接的。但这对我来说并不完全清楚。我仍然需要运行“覆盖”,不是吗?然后据此计算面积。这也很耗时。
-
好吧,`gpd.overlay(df_grid, df_layer, how="intersection")` 根据底层网格分割图层。但是现在我想将与每个网格正方形相交的图层的面积相加,并将其放在网格行中。我不确定如何以有效的方式做到这一点。空间连接高度优化,但覆盖?我需要对数百万个网格正方形进行此计算。
标签: python pandas dask geopandas dask-dataframe