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

使用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的源码:

  1. 找到处理关系的核心代码(通常在OsmParser.cpp或类似文件中)
  2. 找到判断是否处理关系的逻辑(比如判断关系类型是否在配置列表中的代码)
  3. 移除或修改该判断条件,让程序对所有OSM关系都调用AddRelation函数执行插入操作
  4. 重新编译安装修改后的osm2pgrouting工具

修改后,重新执行导入命令,osm_relations表就会填充所有OSM文件中的关系数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:58:22