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
相关产品推荐
相关产品推荐

