使用pgrouting与pgr_dijkstra时靠左行驶路径异常求助
解决pgrouting适配英国靠左行驶路径生成问题
1. 核查道路单向属性标记
英国道路采用靠左行驶规则,先确认你的道路表oneway字段(通常用1/-1或T/F标记)是否与实际通行方向匹配。如果单向道路的方向标反了,pgr_dijkstra会优先选择“合法”的通行方向,自然会偏移到对向道路上。
- 验证方法:圈出匹配点附近的单向道路,对照实际交通规则核对方向。
- 修复操作:如果方向反向,要么更新
oneway字段值,要么用ST_Reverse(geom)反转道路几何。
2. 优化点到道路的匹配逻辑
点匹配时可能因为道路是双向属性,误匹配到对向车道的节点,导致路径起点/终点落在对向道路:
- 匹配时别只计算点到道路的距离,结合GPS轨迹的航向数据(如果有的话),优先匹配符合靠左行驶的车道侧。
- 用
ST_LineLocatePoint获取点在道路上的位置,再用ST_LineInterpolatePoint生成匹配点,同时校验该点所在的道路方向是否符合行驶规则。
3. 自定义路径成本函数
pgr_dijkstra默认用长度作为权重,你可以自定义成本函数,给违反靠左规则的对向道路设置极高成本,迫使算法选择正确的道路:
CREATE OR REPLACE FUNCTION custom_left_drive_cost(u integer, v integer, edge integer, cost float, reverse_cost float) RETURNS float AS $$ DECLARE var_oneway integer; BEGIN -- 假设oneway=1为正向(靠左行驶方向),oneway=-1为反向 SELECT oneway INTO var_oneway FROM edges WHERE id = edge; -- 正向道路从source到target合法,反向道路从target到source合法 IF (var_oneway = 1 AND u = (SELECT source FROM edges WHERE id = edge)) OR (var_oneway = -1 AND u = (SELECT target FROM edges WHERE id = edge)) THEN RETURN cost; ELSE -- 对向道路设置极高成本,避免被选中 RETURN 999999; END IF; END; $$ LANGUAGE plpgsql;
调用pgr_dijkstra时使用这个自定义成本函数:
SELECT * FROM pgr_dijkstra( 'SELECT id, source, target, cost, reverse_cost FROM edges', start_node_id, end_node_id, directed := true, cost_func := 'custom_left_drive_cost' );
4. 检查道路拓扑构建细节
哪怕连通性没问题,拓扑构建时的节点连接可能存在细微错误,比如双向道路的source/target是否对应正确的行驶方向:
- 用
pgr_analyzeGraph工具分析道路网络的拓扑错误,重点检查单向道路的节点连接是否符合靠左行驶规则。 - 重新运行
pgr_createTopology时,确保工具正确识别单向道路的方向。
5. 过滤路径中的非法路段
如果最终生成的MultiLineString路径混有对向道路,在合并前先过滤掉不符合方向的路段:
- 遍历路径中的每条边,检查其通行方向是否合法,只保留合规的边再合并为MultiLineString。
如果能贴出简化后的GeoJSON关键片段(比如匹配点和错误路径的核心部分),能更精准定位问题,但以上步骤应该能覆盖大部分靠左行驶场景的路径偏移问题。
内容的提问来源于stack exchange,提问作者Goncalo Oliveira
相关产品推荐
相关产品推荐

