如何使用Osmosis从OSM数据库提取Multipolygon数据并解决提取缺失问题
解决OSM PBF提取Multipolygon类型对象缺失的问题
我明白你遇到的困扰——OSM里的Multipolygon都是以**关系(Relation)**形式存储的,标签通常直接挂在Relation上,而不是单个Way上,你之前的命令要么没正确捕获这类Relation,要么在处理关联元素时顺序出错,导致漏提了目标对象。
先修正你的Osmosis命令
你之前的命令在处理Relation时存在两个关键问题:一是没有同时覆盖amenity=townhall和townhall=yes的Relation,二是--used-way和--used-node的顺序不对(必须先获取Relation关联的Way,再获取Way关联的Node)。试试这条命令:
osmosis --read-pbf nord-pas-de-calais-latest.osm.pbf \ --log-progress \ --tf accept-ways amenity=townhall \ --tf accept-relations amenity=townhall,townhall=yes \ --bounding-box top=50.794448377057 left=2.78824307841151 bottom=50.4995835747462 right=3.2719212468744 \ --used-way \ --used-node \ --write-xml extraction_test_townhall.osm
命令解释:
--tf accept-relations amenity=townhall,townhall=yes:明确捕获带这两个标签的关系,这是提取Multipolygon市政厅的核心——因为大部分大型市政厅的边界都是用Relation定义的Multipolygon--used-way放在--used-node之前:Osmosis处理依赖关系是顺序敏感的,必须先获取Relation关联的所有Way,再去获取这些Way对应的节点- 保留
--tf accept-ways:兼容那些用单个Way(Polygon)标记的小型市政厅
更推荐的工具:osmium-tool
如果Osmosis的参数顺序总是让你踩坑,试试osmium-tool——它专门为OSM数据处理设计,语法更直观,自动处理元素间的依赖关系,不需要手动加--used-way/--used-node:
osmium extract --bbox 2.788243,50.499584,3.271921,50.794448 \ --filter 'n["amenity"="townhall"] or w["amenity"="townhall"] or r["amenity"="townhall"] or r["townhall"="yes"]' \ nord-pas-de-calais-latest.osm.pbf \ -o townhall_extracted.osm
这条命令会一次性提取所有符合标签的节点、Way和Relation,并且自动包含它们的关联元素,完全不会漏提Multipolygon类型的对象。
你之前的命令哪里错了?
- 关系提取命令里重复了
--tf accept-relations townhall=yes,导致过滤逻辑冗余,还可能干扰正常匹配 - 分开提取再合并的方式容易遗漏关联元素——比如Relation关联的Way如果没有被正确包含,合并后的文件里就会出现不完整的Multipolygon
--used-way和--used-node的顺序颠倒,Osmosis无法正确递归获取依赖元素
内容的提问来源于stack exchange,提问作者ROME
相关产品推荐
相关产品推荐

