我正在尝试基于 OSM 数据运行 pgRouting,但在正确运行时遇到了一些问题。
我在 Ubuntu 机器上安装了 PostgreSQL 9.5。PostGIS_full_version 回来了
- "POSTGIS="2.2.2 r14797"
- GEOS="3.4.2-CAPI-1.8.2 r3921"
- PROJ="Rel. 4.8.0,2012 年 3 月 6 日"
- GDAL="GDAL 1.11.2,发布于 2015/02/10"
- LIBXML="2.9.1"
- LIBJSON="0.11.99"
- 拓扑栅格",
并且 pgRouting 安装在 2.2.3 版本中。
我在 2.1 版中使用 osm2pgrouting 从 Geofabrik 导入 osm 文件并构建拓扑。
导入后,表格中的“长度”列包含非常小的值,而应该具有以公里为单位的距离信息。与“length_m”列的比较表明,以米为单位的距离或以公里为单位的距离是错误的。基于这个讨论,我可以解决距离问题。
但是,“成本”列似乎是“长度”列的副本,并且在上面链接的讨论中,成本列没有重新计算,我不确定是否也应该这样做。
因此,我添加了另一列('to_cost'),其中包含重新计算的距离。以下 SQL 查询利用了这一点:
SELECT SUM(distance) as "Distance (km)", SUM(zeit) as "Time (min)" FROM
(SELECT b.length as distance, b.length/b.maxspeed_forward*60 as zeit
FROM pgr_dijkstra('SELECT gid::integer as id,
source::integer,
target::integer,
to_cost as cost,
reverse_cost
FROM ways',
728126, 508421, true, false) a,
ways b
WHERE a.id1=b.gid::integer) AS my routing;
返回的距离为 232.388203319894 公里,此行程所需的时间(以分钟为单位)为 275.537860166885 分钟。
我试图在OpenStreetMap计算相同的路线,在这里我得到了一条稍长但更快的路线返回。因此,我想知道我是否在这里做正确的事情。
此外,当我使用 'cost' 列和来自 osm2pgrouting 的导入数据而不是 'to_cost' 列时,无论我说 reverse_cost 是真还是假,我都会得到 123.397950457207 公里。
使用“to_cost”列并将 reverse_cost 设置为 true,然后我得到的距离只有 143.048209059395 公里,时间值为 169.415916099922 分钟。