如何获得可以在 10 分钟内从某个位置行驶的道路路径
How to get a road path which can be travelled in 10 minutes from a location
我有 postgis 道路网络 table 数据库,其中包含基于道路类型的速度限制。我可以使用 Dijkstra 或任何其他算法在两点之间获得最短的 path/route。现在我想获得可以在 10 分钟内从一个位置(点)行驶的可能路径。因为我有基于道路类型的速度限制,所以结果路径可能不相同 length.in 这种情况下,单一来源所有目的地算法可能会有帮助,但我的目的地点可能会或可能不会作为节点提供网络因为我的时间成本。请帮助我。
pgr_drivingDistance
使用您提供的 cost
值,并使用您隐式指定的单位,这意味着当您添加列时 <traveling_time>
(请注意,我使用 seconds 在我的示例中)作为遍历边缘所需的时间(给定长度和速度限制)和 select 作为 cost
,函数结果将表示相等的行驶时间限制。
至于算法无法完全遍历下一条边的部分'in time',您需要自己添加。这里的总体思路是识别所有可能连接到 pgr_drivingDistance
结果集中的端点的边,但不等于任何涉及的边,并沿着这些线插入一个新的端点。
- 已更新 -
下面的查询是一个出乎我意料的尝试并且根本没有测试,但是理论上应该 被测试 和 returns 一个多边形 代表沿着你的 600 秒行程的所有完整和部分边缘网络:
WITH
dd AS (
SELECT pg.id1 AS node,
pg.id2 AS edge,
pg.cost
FROM pgr_drivingDistance('SELECT id,
source,
target,
<travel_time_in_sec> AS cost
FROM <edge_table>',
<start_id>,
600,
false,
false
) AS pg
),
dd_edgs AS (
SELECT edg.id,
edg.geom
FROM <edge_table> AS edg
JOIN dd AS d1
ON edg.source = d1.node
JOIN dd AS d2
ON edg.target = d2.node
),
dd_ext AS (
SELECT edg.id,
CASE
WHEN dd.node = edg.source
THEN ST_LineSubstring(edg.geom, 0, (600 - dd.cost) / edg.<travel_time>)
ELSE ST_LineSubstring(edg.geom, 1 - ((600 - dd.cost) / edg.<travel_time>), 1)
END AS geom
FROM dd
JOIN <edge_table> AS edg
ON dd.node IN (edg.source, edg.target) AND edg.id NOT IN (SELECT id FROM dd_edgs)
)
SELECT id,
geom
FROM dd_ext
UNION ALL
SELECT id,
geom
FROM dd_edgs;
CASE
语句决定对于任何后续边,线长度的分数是否将从起点或终点计算。
作为旁注:pgRouting 的当前版本提供了 set of functions,其中要考虑边缘点;如果更新您的(相当过时的)PostGIS/pgRouting 版本是一个选项,请考虑这些功能。
我有 postgis 道路网络 table 数据库,其中包含基于道路类型的速度限制。我可以使用 Dijkstra 或任何其他算法在两点之间获得最短的 path/route。现在我想获得可以在 10 分钟内从一个位置(点)行驶的可能路径。因为我有基于道路类型的速度限制,所以结果路径可能不相同 length.in 这种情况下,单一来源所有目的地算法可能会有帮助,但我的目的地点可能会或可能不会作为节点提供网络因为我的时间成本。请帮助我。
pgr_drivingDistance
使用您提供的 cost
值,并使用您隐式指定的单位,这意味着当您添加列时 <traveling_time>
(请注意,我使用 seconds 在我的示例中)作为遍历边缘所需的时间(给定长度和速度限制)和 select 作为 cost
,函数结果将表示相等的行驶时间限制。
至于算法无法完全遍历下一条边的部分'in time',您需要自己添加。这里的总体思路是识别所有可能连接到 pgr_drivingDistance
结果集中的端点的边,但不等于任何涉及的边,并沿着这些线插入一个新的端点。
- 已更新 -
下面的查询是一个出乎我意料的尝试并且根本没有测试,但是理论上应该 被测试 和 returns 一个多边形 代表沿着你的 600 秒行程的所有完整和部分边缘网络:
WITH
dd AS (
SELECT pg.id1 AS node,
pg.id2 AS edge,
pg.cost
FROM pgr_drivingDistance('SELECT id,
source,
target,
<travel_time_in_sec> AS cost
FROM <edge_table>',
<start_id>,
600,
false,
false
) AS pg
),
dd_edgs AS (
SELECT edg.id,
edg.geom
FROM <edge_table> AS edg
JOIN dd AS d1
ON edg.source = d1.node
JOIN dd AS d2
ON edg.target = d2.node
),
dd_ext AS (
SELECT edg.id,
CASE
WHEN dd.node = edg.source
THEN ST_LineSubstring(edg.geom, 0, (600 - dd.cost) / edg.<travel_time>)
ELSE ST_LineSubstring(edg.geom, 1 - ((600 - dd.cost) / edg.<travel_time>), 1)
END AS geom
FROM dd
JOIN <edge_table> AS edg
ON dd.node IN (edg.source, edg.target) AND edg.id NOT IN (SELECT id FROM dd_edgs)
)
SELECT id,
geom
FROM dd_ext
UNION ALL
SELECT id,
geom
FROM dd_edgs;
CASE
语句决定对于任何后续边,线长度的分数是否将从起点或终点计算。
作为旁注:pgRouting 的当前版本提供了 set of functions,其中要考虑边缘点;如果更新您的(相当过时的)PostGIS/pgRouting 版本是一个选项,请考虑这些功能。