Geopandas:将单个多边形转换为多多边形,并保持单个多边形拓扑?

时间:2020-11-12 20:06:09

标签: geopandas

我认为这是可能的。示例:我在一个地理数据框中有多边形,有些多边形具有相同的属性数据,它们只是具有相同数据的单独的多边形,每个多边形在gdf中都有自己的行。

我想将这些多边形组合成一个多面体,以便它们在gdf中仅占据1行。 这两个多边形重叠,我不想将它们溶解在一起,我希望它们保留2个单独的实体。

有单个多边形,我认为即使它们是单数形式,也必须将它们转换为多多边形,因为最终它们将被导出以供GIS软件使用,每个数据集一种几何类型。

我已经达到.dissolve(by='ID'),但如上所述,我不想更改多边形的几何形状。

建议?

1 个答案:

答案 0 :(得分:1)

您可以改编Geopandas的dissolve来生成MultiPolygon而不是一元联合。我改编的原始代码为here

import geopandas as gpd
from shapely.geometry import Polygon, MultiPolygon


def groupby_multipoly(df, by, aggfunc="first"):
    data = df.drop(labels=df.geometry.name, axis=1)
    aggregated_data = data.groupby(by=by).agg(aggfunc)

    # Process spatial component
    def merge_geometries(block):
        return MultiPolygon(block.values)

    g = df.groupby(by=by, group_keys=False)[df.geometry.name].agg(
        merge_geometries
    )

    # Aggregate
    aggregated_geometry = gpd.GeoDataFrame(g, geometry=df.geometry.name, crs=df.crs)
    # Recombine
    aggregated = aggregated_geometry.join(aggregated_data)
    return aggregated
df = gpd.GeoDataFrame(
    {"a": [0, 0, 1], "b": [1, 2, 3]},
    geometry=[
        Polygon([(0, 0), (1, 0), (1, 1)]),
        Polygon([(1, 0), (1, 0), (1, 1)]),
        Polygon([(0, 2), (1, 0), (1, 1)]),
    ],
)

grouped = groupby_multipoly(df, by='a')
grouped
                                            geometry  b
a                                                       
0  MULTIPOLYGON (((0.00000 0.00000, 1.00000 0.000...  1
1  MULTIPOLYGON (((0.00000 2.00000, 1.00000 0.000...  3

如果将MultiPolygon中的merge_geometries更改为GeometryCollection,则应该能够将任何类型的几何图形合并为一行。但这可能不受某些文件格式的支持。