使用momepy.preprocess处理OpenStreetMap数据生成镶嵌面时出现ValueError
ValueError: Must have equal len keys and value when setting with an iterable 报错在momepy.preprocess中触发的核心原因是,该实验性功能对输入OSM数据的完整性、格式标准的假设,仅和教程示例地德国卡拉的OSM数据高度匹配,其他地区的OSM数据存在属性缺失、几何要素类型混杂的情况,和函数内置的处理逻辑不兼容。
问题根因定位
- 先验证输入数据的几何类型一致性:对拉取的OSM GeoDataFrame执行
gdf.geom_type.unique()检查,很多非示例地区的OSM数据会同时包含Polygon、MultiPolygon甚至GeometryCollection类型的要素,momepy.preprocess目前未对混合几何类型做适配,会在赋值属性时出现长度不匹配的问题。 - 第二个常见诱因是属性字段缺失:德国卡拉的OSM建筑数据默认包含函数预期的全部必填元字段,其他地区可能存在
height、building:levels等字段全部为空、或者部分行缺失的情况,函数在批量填充默认值时会出现键值长度不一致的报错。
可行修复方案
- 预处理第一步先统一几何类型,仅保留单多边形要素:
# 过滤非Polygon类型的要素 gdf = gdf[gdf.geom_type == 'Polygon'].reset_index(drop=True)
- 手动补全函数预期的必填字段,确保无整列缺失:
# 示例补全高度相关字段,可根据实际需要调整默认值 if 'height' not in gdf.columns: gdf['height'] = 3 # 按通用低层建筑默认值填充 else: gdf['height'] = gdf['height'].fillna(3) if 'building:levels' not in gdf.columns: gdf['building:levels'] = 1 else: gdf['building:levels'] = gdf['building:levels'].fillna(1)
- 调用
momepy.preprocess时显式指定所有可选参数,不要依赖默认值,避免不同版本的参数适配问题。
注:由于该函数目前处于实验阶段,后续版本迭代可能会修复上述适配问题,上述临时修复方案可以适配90%以上的非示例地区OSM数据处理需求。
内容的提问来源于stack exchange,提问作者matthiett
相关产品推荐
相关产品推荐

