让AI理解真实世界的位置信息——港口、道路、建筑、工地——OpenStreetMap是最现成的数据源。但直接把原始OSM数据丢给模型,就像给一个人看数据库裸表还指望他出分析报告。能行,但极其痛苦。
我们花了几周搭了一条从OSM到RDF知识图谱的管道。不是 polished 产品,是个能跑的原型,但教训足够真实。这篇分享关键步骤、踩过的坑、以及确实能用的代码。
第一版:bash脚本的幻觉
最初想法很简单:osmconvert 裁区域,osmfilter 抽类别——交通、建筑、兴趣点。filter 字符串看起来该是这样:
filter_string="(building=house,apartments) or (building=yes)"
结果:空文件。没报错。退出码0。
osmfilter 的语法有括号地狱,"and" 这个词也是雷区。新手都会写的 "(A) or (B)" 模式,它不认。我们手动展开逗号分隔值、删掉括号,改成 "building=house or building=apartments or building=yes" 才跑通。
但bash维护是噩梦。每加一个新filter模式都可能搞崩正则解析。没有错误处理,写不了单元测试,调试全靠 echo 碰运气。
转向Python:filter_builder.py 的诞生
核心是把YAML配置里的filter列表转成合法的 osmfilter --keep 字符串。代码逻辑很直接:按等号切分键值,逗号分隔的值展开成多条,最后用 " or " 拼接——不要括号,不要 "and"。
["building=house,apartments", "amenity=school"] 变成 "building=house or building=apartments or amenity=school"。
我们还加了前置校验,在调用 osmfilter 之前就把非法语法拦下来。
这个转向不酷,但省下来的调试时间,够写三篇博客。
热门跟贴