如何将含MultiPolygon列表的DataFrame转为GeoJSON导入QGIS?
将含MultiPolygon列表的Pandas DataFrame转为GeoJSON(适用于QGIS导入)
用geopandas结合shapely可以快速完成转换,核心是把DataFrame中的MultiPolygon坐标列表转为标准地理几何对象,再导出GeoJSON。
步骤1:安装依赖库
pip install geopandas shapely
步骤2:数据转换与导出
假设你的DataFrame结构如下(gid为唯一标识,multi_polygons列存储MultiPolygon的坐标列表,格式符合GeoJSON规范):
| gid | multi_polygons |
|---|---|
| 1 | [[[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]]] |
| 2 | [[[[102.0, 0.0], [103.0, 0.0], [103.0, 1.0], [102.0, 1.0], [102.0, 0.0]]]] |
执行以下代码完成转换:
import pandas as pd import geopandas as gpd from shapely.geometry import MultiPolygon, Polygon # 示例DataFrame(替换成你的实际数据) df = pd.DataFrame({ 'gid': [1, 2], 'multi_polygons': [ [[[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]]], [[[[102.0, 0.0], [103.0, 0.0], [103.0, 1.0], [102.0, 1.0], [102.0, 0.0]]]] ] }) def coords_to_multipolygon(coords_list): """将GeoJSON格式的坐标列表转为shapely MultiPolygon对象""" polygons = [] # 遍历MultiPolygon中的每个Polygon for poly_coords in coords_list: # 第一个环是外环,后续是内环(孔洞) outer_ring = poly_coords[0] holes = poly_coords[1:] if len(poly_coords) > 1 else [] # 确保环闭合(首尾坐标一致) if outer_ring[0] != outer_ring[-1]: outer_ring.append(outer_ring[0]) for hole in holes: if hole[0] != hole[-1]: hole.append(hole[0]) polygons.append(Polygon(outer_ring, holes=holes)) return MultiPolygon(polygons) # 转换几何列 df['geometry'] = df['multi_polygons'].apply(coords_to_multipolygon) # 转为GeoDataFrame,指定坐标系(QGIS常用WGS84:EPSG:4326) gdf = gpd.GeoDataFrame(df, geometry='geometry', crs='EPSG:4326') # 导出为GeoJSON gdf.to_file('polygons_output.geojson', driver='GeoJSON')
关键注意事项
- 坐标顺序:GeoJSON要求经度在前,纬度在后,如果你的原始数据是[纬度, 经度],需要在转换函数中调换顺序,比如
coord = (coord[1], coord[0]) - 环闭合性:shapely要求Polygon的环必须首尾坐标一致,代码中已添加自动闭合逻辑,可根据实际情况调整
- 坐标系设置:必须指定正确的CRS(如EPSG:4326),否则QGIS导入后可能出现位置偏移
- 无效几何处理:如果转换后存在无效几何,可通过
gdf = gdf[gdf.is_valid]过滤后再导出
QGIS导入验证
导出的GeoJSON文件直接拖入QGIS即可查看,若看不到多边形,可尝试:
- 检查坐标系是否匹配(右键图层→属性→坐标系)
- 使用
Zoom to Layer Extent定位到多边形范围
内容的提问来源于stack exchange,提问作者Công Lý
相关产品推荐
相关产品推荐

