You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pgAdmin中基于pgRouting实现路网等时线可视化的SQL问题求助

pgRouting道路网等时线生成SQL修复方案

你编写的代码存在4类核心问题,修正后即可正常生成目标等时线:

  • 语法类错误:多处混用中文单引号、错用$$字符串闭合符、混入乱码字符,会直接触发SQL解析失败
  • 字段映射错误:建表时将通行时间字段命名为time_access,后续批量生成等时线时错误写为access_time,会触发字段不存在报错;传给pgr_pointsAsPolygon的id字段误用了序列值seq,应该使用顶点IDnode
  • 单位与参数错误:设定40km/h行驶速度时,未提前将道路长度换算为秒级通行时间成本,pgr_drivingDistance的距离阈值参数和时间单位不匹配,无法得到2/5/10/15分钟的正确范围
  • 函数入参格式错误:pgr_pointsAsPolygon要求传入的子查询必须严格返回整数型id、浮点型x坐标、浮点型y坐标三列,原代码存在类型转换缺失、列顺序不匹配的问题

修正后可直接运行的代码

前置准备:换算时间成本

如果你的osmpgr.ways表还没有按40km/h生成秒级通行成本字段,先执行以下语句(前提是表内已有米级长度字段length_m):

-- 40km/h换算为m/s约为11.11m/s,通行时间=道路长度/行驶速度,单位为秒
ALTER TABLE osmpgr.ways ADD COLUMN IF NOT EXISTS cost_s double precision;
ALTER TABLE osmpgr.ways ADD COLUMN IF NOT EXISTS reverse_cost_s double precision;
UPDATE osmpgr.ways 
SET cost_s = length_m / (40/3.6),
    reverse_cost_s = length_m / (40/3.6)
WHERE cost_s IS NULL;

步骤1:生成全量可达节点成本表

以顶点ID=36为起点,搜索最大范围覆盖15分钟(900秒),生成节点通行时间表:

DROP TABLE IF EXISTS dd_caserne;
CREATE TABLE dd_caserne AS
SELECT 
  di.seq AS id,
  di.node,
  di.edge,
  di.agg_cost AS time_access,
  v.the_geom AS geom
FROM pgr_drivingDistance(
  'SELECT gid as id, source, target, cost_s as cost, reverse_cost_s as reverse_cost FROM osmpgr.ways',
  36, -- 起始点对应的路网顶点ID
  900, -- 最大搜索阈值:15分钟对应900秒
  true -- 启用双向通行规则
) AS di 
INNER JOIN osmpgr.ways_vertices_pgr AS v 
ON di.node = v.id;

步骤2:生成指定时间间隔等时线

直接生成2分钟、5分钟、10分钟、15分钟四个间隔的等时面,避免逐秒生成浪费性能:

WITH time_intervals AS (
  SELECT unnest(ARRAY[120,300,600,900]) AS target_second,
         unnest(ARRAY['2分钟','5分钟','10分钟','15分钟']) AS time_label
)
SELECT 
  ti.time_label,
  ti.target_second AS time_access,
  ST_SetSRID(
    pgr_pointsAsPolygon(
      'SELECT node::integer AS id, 
              ST_X(geom)::double precision AS x, 
              ST_Y(geom)::double precision AS y 
       FROM dd_caserne 
       WHERE time_access <= ' || ti.target_second::text
    ),
  4326) AS geom
FROM time_intervals ti
ORDER BY ti.target_second DESC;

使用说明

  • 如果需要生成固定步长的等时线做动画效果,可以把CTE中的时间数组替换为generate_series(60,900,60)按1分钟步长生成,不要使用1秒步长,数据量过大会严重拖慢运行速度
  • pgr_pointsAsPolygon默认生成凸包型等时线,如果需要更贴合道路网边界的凹包效果,可以将几何生成部分替换为ST_ConcaveHull(ST_Collect(geom), 0.95),0.95为凹包收缩系数,可根据平滑度需求在0-1之间调整
  • 运行前确认ways_vertices_pgr表的坐标系SRID确实为4326,否则会出现坐标偏移问题

内容的提问来源于stack exchange,提问作者lirim bokshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:45:15