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次就行了!