应用场景与代码优化:将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
应用场景
-
地理空间数据分析
在空间分析中,拆分 MultiPolygon 数据,便于对每个单独多边形进行更细致的分析。例如,对于群岛或多个独立的湖泊数据,每个多边形都可能有不同的空间特征。 -
地图制图与可视化
对于需要对地图上的每个多边形进行标注或颜色区分的情况,拆分 MultiPolygon 可以简化这些操作,提升图形的清晰度与可读性。 -
空间查询与裁剪
当进行空间查询或裁剪操作时,单独处理每个 Polygon 比处理整个 MultiPolygon 更精确,这对于提高计算精度非常有帮助。
解决方案:分割 MultiPolygon 代码
使用步骤
- 确定输入的 Shapefile 文件路径,如:
input_shp
。 - 确定输出的 Shapefile 文件路径,如:
output_shp
。 - 调用函数
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)
注意事项
-
坐标参考系(CRS)处理
输入 Shapefile 文件的坐标系会自动应用到输出文件中。如果需要更改坐标系,可以在处理完成后使用to_crs()
函数进行投影转换。 -
大数据处理性能
对于非常大的 Shapefile 文件,处理时间可能较长。如果遇到性能瓶颈,可以考虑使用并行处理工具(如dask
)。 -
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 。 |
GeoDataFrame | geopandas 的核心数据结构,能够处理空间几何与属性数据。 |
MultiPolygon | shapely 几何类型,表示由多个独立的多边形组成的复杂几何体。 |
to_file() | 将 GeoDataFrame 输出为指定格式的空间文件(如 Shapefile)。 |
iterrows() | 遍历 GeoDataFrame 的每一行,返回行索引与行内容的迭代器。 |
to_crs() | 用于进行坐标系转换,将几何数据重新投影到指定的 CRS。 |
如果这对您有所帮助,希望点赞支持一下作者! 😊


