pgRouting - 具有转弯限制的多对多

问题描述 投票:0回答:1

我需要一些帮助来正确编写查询,以使用 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) 

Query results

我还尝试了另一种方法,我为自己指定带有顶点 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 表并将请求数量保持在可操作的大小。

sql postgresql gis pgrouting osm2pgsql
1个回答
1
投票

经过多次尝试和错误终于找到了答案。 看起来在进行多对多请求时不需要方向/成本的布尔参数。此外,还需要按此特定顺序提供参数:

  1. 边桌,
  2. 转向限制表,其中target_id是一个整数并且 路径整数数组 a,
  3. 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
© www.soinside.com 2019 - 2024. All rights reserved.