我有基于道路类型的速度限制的 postgis 道路网络表数据库。通过使用 Dijkstra 或任何其他算法,我可以得到两点之间的最短路径/路线。现在我想获得可以在 10 分钟内从某个位置(点)经过的可能路径。因为我有一个基于道路类型的速度限制,所以生成的路径可能不是相同的长度。在这种情况下,单一来源所有目的地算法可能会有所帮助,但我的目的地点可能作为网络中的节点可用,也可能不可用因为我的时间成本。请帮我。
问问题
552 次
1 回答
2
pgr_drivingDistance
使用cost
您提供的值,并以您隐式指定的单位,这意味着当您添加一列时<traveling_time>
(请注意,我在示例中使用秒)作为遍历边缘所需的时间(给定长度和速度限制)并选择因为cost
,函数结果将代表相等的驾驶时间限制。
至于算法无法“及时”完全遍历下一条边的部分,您需要自己添加。这里的一般想法是识别所有可能连接到结果集中的末端顶点pgr_drivingDistance
但不等于任何相关边的边,并沿着这些线插入一个新的端点。
- 更新 -
下面的查询是一个疯狂的尝试,根本没有经过测试,但理论上应该 经过测试并返回一个多边形,所有边和部分边都表示沿着您的网络进行的 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提供了一组要考虑边缘间点的函数;如果可以选择更新(相当过时的)PostGIS / pgRouting版本,请考虑使用这些功能。
于 2018-08-04T13:40:02.957 回答