pgrouting 路由方法不提供最短路径

Posted

技术标签:

【中文标题】pgrouting 路由方法不提供最短路径【英文标题】:pgrouting routing methods don't deliver shortest path 【发布时间】:2021-12-09 05:08:27 【问题描述】:

起初,我对路由很陌生,需要在我的学士论文中使用它,所以我学习它的时间很有限。如果有更多信息我可以提供以找到问题,或者如果您只是有一个想法,请告诉我。谢谢!

我对 postgis 扩展 pgrouting 提供的路由方法有疑问,结果远非最短路径。

我正在使用一个包含带有 pgrouting 扩展名的 postgis 的 docker 容器: https://hub.docker.com/r/pgrouting/pgrouting/

我的图表是使用 osm2po 在 Geofabrik.de 的“Niedersachsen”地图上创建的。

我只是按照 osm2po quickstart 中给出的教程创建了一个图表并将其放入我的数据库中。

我的表构建为:

CREATE TABLE hh_2po_4pgr(id integer, osm_id bigint, osm_name character varying, osm_meta character varying, osm_source_id bigint, osm_target_id bigint, clazz integer, flags integer, source integer, target integer, km double precision, kmh integer, cost double precision, reverse_cost double precision, x1 double precision, y1 double precision, x2 double precision, y2 double precision);
SELECT AddGeometryColumn('hh_2po_4pgr', 'geom_way', 4326, 'LINESTRING', 2);

我唯一配置的是将我的成本和 reverse_cost 设置为距离。但如果没有这种变化,问题仍然存在。我还做了 pgr_anaalyzeGraph,它给了我一个 OK,这通常表明该图应该配置得很好。

当我现在启动这样的查询时:

SELECT * FROM pgr_astar('SELECT id, source, target, cost, x1, y1, x2, y2 FROM hh_2po_4pgr', 232516, 213104, FALSE, 2);

它给了我看似随机的路线,要么是空的,要么是很长的路。 我正在测试的身份非常接近,并且都通过街道相连。 在这种情况下,它应该是一条几百米的路线,但我得到的路线有 1000 多个路段,几乎 100 公里。

注意:我还尝试了其他功能,例如 pgr_djjkstra。

【问题讨论】:

尝试在pgr_astar 边缘sql 中指定reverse_cost 感谢您的回复。我试过了,它似乎什么都没有改变。可能是因为 reverse_cost 包含与 cost 相同的值? 通过手动遵循几条路径,仔细检查图形是否正确构建(例如:源/目标确实使用 id,而不是 osm_id 等)。 关于代价,不,有些函数将查询中没有reverse_cost视为“不使用反向段”,这通常意味着使用非常复杂的路径连接两个附近的点 好的,所以我检查了我的成本和 reverse_cost 列,所有值似乎都正常。我使用真实的 ID,当我检查源 ID 和目标 ID 时,我得到了附近的街道。所以ID似乎也是正确的。在构建图表时还有其他可能出错的地方吗?我最近尝试使用 .gph 文件和 osm2po 内置路由,效果很好。我只是拿了同一个进程创建的 .sql 文件。 【参考方案1】:

解决方案:

SELECT source FROM hh_2po_4pgr ORDER BY geom_way <-> ST_SetSRID(ST_Point(:pointX, :pointY),4326);

SELECT target FROM hh_2po_4pgr ORDER BY geom_way <-> ST_SetSRID(ST_Point(:pointX, :pointY),4326);

使用这些 SELECT 语句来获取正确的 ID,以便在您的 pgrouting 函数中使用。

如果有人对 pgrouting 有任何问题,请联系我。如果我查看我的 *** 消息,我会尽力帮助您。似乎文档和教程有点烦人。

【讨论】:

以上是关于pgrouting 路由方法不提供最短路径的主要内容,如果未能解决你的问题,请参考以下文章

Bellman-Ford算法——为什么要循环V-1次?图有n个点,又不能有回路,所以最短路径最多n-1边。又因为每次循环,至少relax一边所以最多n-1次就行了!

POSTGIS拓扑:pgRouting最短路径分析

PgRouting求解大数据量最短路径

PgRouting求解大数据量最短路径

postgresql+postgis+pgrouting实现最短路径查询---线数据的处理和建立拓扑

图-最短路径-Dijkstra及其变种