带转向限制的pg_trsp多对多路径查询报错求助与解决
用pgRouting的pgr_trsp批量生成多OD对最短路径的问题与解决
单个OD对的正常查询
单个起终点(OD)对的pgr_trsp查询可正常执行,SQL语句如下:
SELECT * FROM pgr_trsp ( 'SELECT id::integer, source::integer, target::integer, cost, reverse_cost FROM edges_df', 97270, 97269, True, True, 'SELECT to_cost, target_id::int4, via_path from restrictions' ) a
批量查询的错误情况
尝试批量处理多OD对时,执行查询后报错:pgr_trsp(unknown, bigint[], bigint[], boolean, boolean, unknown),以下是两种尝试过的错误查询:
从表生成起点/终点数组的查询
SELECT * FROM pgr_trsp ( 'SELECT id::integer, source::integer, target::integer, cost, reverse_cost FROM edges_df', array(SELECT vertex_id FROM od_vertex_id), array(SELECT vertex_id FROM od_vertex_id), True, True, 'SELECT to_cost, target_id::int4, via_path from restrictions' )
手动指定顶点ID数组的查询
SELECT * FROM pgr_trsp ( 'SELECT id::integer, source::integer, target::integer, cost, reverse_cost FROM edges_df', 97270, ARRAY[97269, 27268], True, True, 'SELECT to_cost, target_id::int4, via_path from restrictions' ) a
已验证数组格式正确,但仍出现相同错误。
最终解决方法
2024-11-06更新:已找到可行的批量查询语句,SQL如下:
SELECT a.* FROM pgr_trsp( $$SELECT id::integer, source::integer, target::integer, cost, reverse_cost FROM edges_df$$, $$select to_cost as cost, via_path::int4 as target_id, ARRAY[target_id::integer] as path from restrictions$$, $$ select * from od_matrix where pair_rank>={rank_min} and pair_rank<={rank_max}$$ ) a
语句说明
- 第一部分:定义边网络数据源,需包含边的ID、起点、终点、正向成本、反向成本字段
- 第二部分:定义转向限制数据,注意字段映射为
cost(原to_cost)、target_id(原via_path)、path(原target_id组成的数组) - 第三部分:指定存储OD对的表,通过
rank_min和rank_max参数分批处理OD对,避免请求规模过大导致性能问题
内容的提问来源于stack exchange,提问作者MatPl
相关产品推荐
相关产品推荐

