Python基于uuid匹配批量更新GeoJSON要素属性的实现方法
原代码错误原因
你的双层循环逻辑存在问题:判断条件使用相同索引i同时取GeoJSON要素和属性表条目,仅当两个列表的uuid顺序完全一致时才能匹配成功,顺序不一致则完全无法匹配;同时双层循环的时间复杂度为O(n*m),数据量大时效率极低。
最优实现方案
先将属性列表转换为uuid为键的字典,将查找效率提升到O(1),仅需单次遍历即可完成所有属性更新:
# 构建uuid为键的属性映射表 msi_uuid_map = {item['uuid']: item for item in msi} # 遍历GeoJSON更新属性 for feature in mtx['features']: current_uuid = feature['properties']['uuid'] if current_uuid in msi_uuid_map: # 已存在的字段会覆盖,不存在的字段会新增 feature['properties'].update(msi_uuid_map[current_uuid])
双层循环修正版(仅作逻辑参考,不推荐大数据量使用)
如果坚持用双层循环实现,修改逻辑如下:
for feat in mtx['features']: for msi_item in msi: if feat['properties']['uuid'] == msi_item['uuid']: feat['properties'].update(msi_item) # 找到匹配后直接跳出内层循环,减少无效遍历 break
注意事项
如果需要保持原有字段类型,可在update前手动处理类型转换,比如示例中属性表的lane为字符串类型、km为带后缀0的字符串,直接update会覆盖GeoJSON中原有的数值类型。
内容的提问来源于stack exchange,提问作者gis_mapper
相关产品推荐
相关产品推荐

