-6

我有基于道路类型的速度限制的 postgis 道路网络表数据库。通过使用 Dijkstra 或任何其他算法,我可以得到两点之间的最短路径/路线。现在我想获得可以在 10 分钟内从某个位置(点)经过的可能路径。因为我有一个基于道路类型的速度限制,所以生成的路径可能不是相同的长度。在这种情况下,单一来源所有目的地算法可能会有所帮助,但我的目的地点可能作为网络中的节点可用,也可能不可用因为我的时间成本。请帮我。

4

1 回答 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 回答