我需要一些帮助来正确编写查询,以使用 pg_trsp 算法生成多个 od 对之间的最短路径。它与这样写的单个 od 配合得很好:
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
但是,当我尝试使用另一个表作为源和目标来概括查询时,出现以下错误: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'
)
我尝试了以下命令来确保我的输入数据格式正确并且看起来正确。
select array(SELECT vertex_id FROM od_vertex_id)
我还尝试了另一种方法,我为自己指定带有顶点 id 的数组,但仍然遇到相同的错误。它确认我的问题与我的 od_vertex_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
根据文档https://docs.pgrouting.org/3.0/en/pgr_dijkstra.html或此处的另一个问题https://gis.stackexchange.com/questions/207813/how-to-use-pgr -dijkstra-many-to-many,我觉得我的方向很好,但还没有开始工作。
任何帮助表示赞赏!
谢谢
于2024年11月6日编辑,我终于成功了!
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
第一部分是边缘网络,第二部分是转弯限制,最后是每行包含 od 对的表。 rank_min 和 max 是附加参数,用于遍历 od 表并将请求数量保持在可操作的大小。
经过多次尝试和错误终于找到了答案。 看起来在进行多对多请求时不需要方向/成本的布尔参数。此外,还需要按此特定顺序提供参数:
由于我有数十万个 od 对,我添加了一个额外的参数来限制 sql 查询中的 od 对的数量,以便输出大小保持合理。 该查询嵌入到一个更大的过程中,以便将输出(边表)插入到临时表中。然后,该临时表被合并到边缘属性并转换为路径。
SELECT a.* FROM pgr_trsp(
$$SELECT id::integer, source::integer, target::integer, cost, reverse_cost FROM edges_df$$,
$$select to_cost as cost, target_id::int4, ARRAY[path::integer] as path from restrictions$$,
$$ select * from od_matrix where pair_rank>={rank_min} and pair_rank<={rank_max}$$
) a