You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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等字段全部为空、或者部分行缺失的情况,函数在批量填充默认值时会出现键值长度不一致的报错。
可行修复方案
  1. 预处理第一步先统一几何类型,仅保留单多边形要素:
# 过滤非Polygon类型的要素
gdf = gdf[gdf.geom_type == 'Polygon'].reset_index(drop=True)
  1. 手动补全函数预期的必填字段,确保无整列缺失:
# 示例补全高度相关字段,可根据实际需要调整默认值
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)
  1. 调用momepy.preprocess时显式指定所有可选参数,不要依赖默认值,避免不同版本的参数适配问题。

注:由于该函数目前处于实验阶段,后续版本迭代可能会修复上述适配问题,上述临时修复方案可以适配90%以上的非示例地区OSM数据处理需求。

内容的提问来源于stack exchange,提问作者matthiett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:09:03