将面 Shapefile 拆分属性表多要素 Polygon


应用场景与代码优化:将MultiPolygon拆分为独立Polygon的处理方法

在地理信息系统(GIS)和遥感数据处理中,Shapefile格式的数据文件被广泛用于存储几何信息,如多边形、点和线。然而,在实际处理中,经常遇到 MultiPolygon(多多边形)形式的几何对象。MultiPolygon 是由多个独立的多边形组成的复杂几何体,而在某些分析或绘图操作中,我们需要将其分解为单个 Polygon(多边形)。这篇文章将详细介绍如何使用 Python 的 geopandas 库,分割 Shapefile 文件中的 MultiPolygon,并生成新的 Shapefile 文件,以便于后续处理和分析。

完整版地址

  • 详细原文见:
    • https://mp.weixin.qq.com/s?__biz=Mzk0MTU1MjU5Mw==&mid=2247485098&idx=1&sn=f1b73dceebeb7a79fe5a86e0349542b2&chksm=c2d1e014f5a66902214634ae3d1cad720017c611284f7a5d4b7d9b97960104903aeaab030d46#rd

应用场景

  1. 地理空间数据分析
    在空间分析中,拆分 MultiPolygon 数据,便于对每个单独多边形进行更细致的分析。例如,对于群岛或多个独立的湖泊数据,每个多边形都可能有不同的空间特征。

  2. 地图制图与可视化
    对于需要对地图上的每个多边形进行标注或颜色区分的情况,拆分 MultiPolygon 可以简化这些操作,提升图形的清晰度与可读性。

  3. 空间查询与裁剪
    当进行空间查询或裁剪操作时,单独处理每个 Polygon 比处理整个 MultiPolygon 更精确,这对于提高计算精度非常有帮助。

解决方案:分割 MultiPolygon 代码

使用步骤

  1. 确定输入的 Shapefile 文件路径,如:input_shp
  2. 确定输出的 Shapefile 文件路径,如:output_shp
  3. 调用函数 split_multipolygons(input_shp, output_shp),即可完成分割并保存新的 Shapefile 文件。

代码示例

以下代码展示了如何将 MultiPolygon 对象分割为单独的 Polygon 对象,并将结果输出到新的 Shapefile 文件中:

import geopandas as gpd
from shapely.geometry import MultiPolygon
import pandas as pd


def split_multipolygons(input_shp, output_shp):
    """
    读取Shapefile文件,将其中的MultiPolygon对象拆分为单独的Polygon,并保存为新的Shapefile文件。

    :param input_shp: 输入的Shapefile文件路径
    :param output_shp: 输出的Shapefile文件路径
    """
    # 读取输入Shapefile文件
    gdf = gpd.read_file(input_shp)

    # 创建一个空的列表,用于保存拆分后的数据行
    rows_list = []

    # 遍历每个几何对象,检查是否为MultiPolygon类型
    for idx, row in gdf.iterrows():
        geometry = row['geometry']
        if isinstance(geometry, MultiPolygon):
            # 将MultiPolygon拆分为单独的Polygon
            for poly in geometry.geoms:
                new_row = row.copy()
                new_row['geometry'] = poly
                rows_list.append(new_row)
        else:
            rows_list.append(row)

    # 将结果存储到新的GeoDataFrame中
    new_gdf = pd.concat([pd.DataFrame([row]) for row in rows_list], ignore_index=True)
    new_gdf = gpd.GeoDataFrame(new_gdf, geometry='geometry', crs=gdf.crs)

    # 保存为新的Shapefile文件
    new_gdf.to_file(output_shp)
    

if __name__ == '__main__':
    input_shp = r'C:\xx.shp'  # 输入Shapefile文件路径
    output_shp = r'C:\xx_split.shp'  # 输出Shapefile文件路径
    split_multipolygons(input_shp, output_shp)

注意事项

  1. 坐标参考系(CRS)处理
    输入 Shapefile 文件的坐标系会自动应用到输出文件中。如果需要更改坐标系,可以在处理完成后使用 to_crs() 函数进行投影转换。

  2. 大数据处理性能
    对于非常大的 Shapefile 文件,处理时间可能较长。如果遇到性能瓶颈,可以考虑使用并行处理工具(如 dask)。

  3. Shapefile格式的限制
    Shapefile 文件在字段名称长度、文件大小等方面存在限制,如果数据过于复杂,建议考虑将其转换为其他格式(如 GeoJSON、PostGIS)。

代码解读

split_multipolygons(input_shp, output_shp)

1. 读取Shapefile
gdf = gpd.read_file(input_shp)

该函数使用 geopandas.read_file() 读取 Shapefile 文件,并将其转换为 GeoDataFrame,以便后续处理。

2. 创建空的GeoDataFrame
new_gdf = gpd.GeoDataFrame(columns=gdf.columns, crs=gdf.crs)

创建一个空的 GeoDataFrame,用于保存拆分后的单个 Polygon 数据,同时确保其与原始数据的列结构和坐标系一致。

3. 遍历并拆分MultiPolygon
for idx, row in gdf.iterrows():
    geometry = row['geometry']
    if isinstance(geometry, MultiPolygon):
        for poly in geometry.geoms:
            new_row = row.copy()
            new_row['geometry'] = poly
            rows_list.append(new_row)
    else:
        rows_list.append(row)

遍历每一行数据,检查几何类型是否为 MultiPolygon,并将其拆分为多个 Polygon,否则直接保存该行。

4. 保存结果
new_gdf.to_file(output_shp)

将处理后的 GeoDataFrame 保存为新的 Shapefile 文件,使用 to_file() 函数进行导出。

相关术语与函数

术语/函数解释
gpd.read_file()读取地理空间数据文件(如Shapefile),并转换为 GeoDataFrame
GeoDataFramegeopandas 的核心数据结构,能够处理空间几何与属性数据。
MultiPolygonshapely 几何类型,表示由多个独立的多边形组成的复杂几何体。
to_file()GeoDataFrame 输出为指定格式的空间文件(如 Shapefile)。
iterrows()遍历 GeoDataFrame 的每一行,返回行索引与行内容的迭代器。
to_crs()用于进行坐标系转换,将几何数据重新投影到指定的 CRS。

如果这对您有所帮助,希望点赞支持一下作者! 😊

详细全文-点击查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值