并行计算后解包结果报ValueError,如何存储多个geodataframe/geoseries变量
问题原因与解决方案
解包报错修复
你触发解包报错的核心原因是返回的t是zip生成的迭代器:zip(list_of_Polygon,list_of_Polygon,list_of_Point,column_Point)生成的迭代器,每个迭代元素是对应下标四个序列的元素组成的元组,而非四个独立序列本身。直接对迭代器执行a,b,c,d = t是尝试把迭代器的所有元素拆分为4个变量,只要迭代器长度不等于4就会抛出该报错。
修复方案如下:
# 解包zip迭代器得到四个独立元组,如需转列表可在外层加list() a,b,c,d = zip(*t) # 如果需要列表格式的返回结果 a,b,c,d = map(list, zip(*t))
多GeoDataFrame/GeoSeries保存方案
常用的保存方案如下:
- 单文件多图层存储(优先推荐):使用GeoPackage格式,可将多个GeoDataFrame/GeoSeries存入同一个文件的不同图层,没有Shapefile的字段长度、属性类型限制,兼容大部分GIS工具。
示例代码:import geopandas as gpd # 存入同一个GeoPackage的不同图层 gdf1.to_file("geo_output.gpkg", layer="polygon_layer", driver="GPKG") gdf2.to_file("geo_output.gpkg", layer="point_layer", driver="GPKG") gs.to_file("geo_output.gpkg", layer="line_series", driver="GPKG") # 读取指定图层 gdf1 = gpd.read_file("geo_output.gpkg", layer="polygon_layer") - 全对象序列化存储:如果需要保留对象的全部原生属性,不需要和外部GIS工具兼容,可以把多个对象存入字典/列表后用pickle序列化。
示例代码:import pickle # 保存 save_container = { "polygon_gdf": gdf1, "point_gdf": gdf2, "custom_series": gs } with open("geo_data.pkl", "wb") as f: pickle.dump(save_container, f) # 读取 with open("geo_data.pkl", "rb") as f: load_container = pickle.load(f) gdf1 = load_container["polygon_gdf"] - 跨工具兼容存储:如果需要给其他工具传递数据,可选择GeoJSON格式,单个GeoJSON存储一个空间对象,多个对象可以单独存为文件或者打包压缩。大体积数据不推荐该方案,GeoJSON无压缩会占用较多存储空间。
- 大规模数据存储:数据量较大的场景可以直接存入PostGIS等空间数据库,使用geopandas内置的
to_postgis方法即可将不同的GeoDataFrame存入对应数据表。
内容的提问来源于stack exchange,提问作者user16708120
相关产品推荐
相关产品推荐

