【发布时间】: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 文件。
标签: postgis openstreetmap shortest-path pgrouting osm2pgsql