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

pgrouting routing methods don't deliver shortest path

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

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

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

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

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

我的 Table 构建为:

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);

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

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

解决方案:

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 有任何疑问,请联系我。如果我查看我的 Whosebug 消息,我会尽力帮助您。好像文档和教程有点烦人。