使用osm2pgrouting带--addnodes选项时osm_relations表为空的问题
osm2pgrouting --addnodes 后 osm_relations 表为空的问题解答
问题背景
使用osm2pgrouting处理.osm文件并添加--addnodes选项时,osm_nodes和osm_ways表可正常填充,但osm_relations表始终为空,工具输出也未出现"Final osm_relations:"相关内容。执行命令如下:
osm2pgrouting -f home/map.osm -c "/usr/local/share/osm2pgrouting/mapconfig.xml" -d city_routing -U [username] -W [password] --clean --tags --addnodes
环境版本:
- PostgreSQL 15.3 (Debian 15.3-1.pgdg110+1)
- POSTGIS="3.3.2 4975da8"
- pgRouting 3.4.1
疑问1:源码中的AddRelation函数是否被实际调用?
默认不会被调用。原因如下:
--addnodes选项仅控制是否导入OSM节点数据到osm_nodes表,和关系数据的处理逻辑完全无关。- osm2pgrouting默认仅处理与路由直接相关的关系(比如
type=route的公交、铁路线路等),且需要在mapconfig.xml中配置对应的关系过滤规则。 - 如果你的OSM文件中没有符合配置规则的关系,或者配置文件未启用关系处理,
AddRelation函数根本不会被触发执行,自然不会有数据写入osm_relations表。
疑问2:是否可修改osm2pgrouting代码以实现osm_relations表的填充?
可以实现,有两种方案:
方案1:修改配置文件(无需改源码)
编辑mapconfig.xml,添加或修改关系的过滤规则,让工具处理所有类型的关系,或者指定你需要的关系类型。例如,添加如下配置段:
<relations> <relation id="all_relations" type="*" /> </relations>
这样工具会尝试处理OSM文件中所有类型的关系,触发AddRelation函数执行,从而填充osm_relations表。
方案2:修改源码(彻底自定义)
如果需要更灵活的控制,可以修改osm2pgrouting的源码:
- 找到处理关系的核心代码(通常在
OsmParser.cpp或类似文件中) - 找到判断是否处理关系的逻辑(比如判断关系类型是否在配置列表中的代码)
- 移除或修改该判断条件,让程序对所有OSM关系都调用
AddRelation函数执行插入操作 - 重新编译安装修改后的osm2pgrouting工具
修改后,重新执行导入命令,osm_relations表就会填充所有OSM文件中的关系数据。
内容的提问来源于stack exchange,提问作者theTruthIsOutThere
相关产品推荐
相关产品推荐

