利用postgis生成等时圈
**前言:**上个月参加了WGDC2024地理信息大会,看到一个叫上海浦东城市大脑时空底座中做了等时生活圈的案例,特别感兴趣,因此查阅了资料,结合之前的经验,通过postgis来实现一下。
**目的:**利用路网数据连通性以及poi数据,来计算人行走在5分钟、10分钟以及15分钟所能到达的范围,从而可以知道在此范围内涉及到的poi点的分类。
参考1:使用pgRouting生成可达圈(等时圈) - 简书 (jianshu.com)
参考2:https://blog.csdn.net/weixin_41352552/article/details/124271972
矢量数据准备:
路网数据:可以通过osm网站上下载,也可以用手头的数据,数据最好是密集性高。
poi点数据:本次使用的是张家口市中心城区的数据。
软件准备:
PostgreSQL 12;
Postgis 3.3 ;
操作:
1、环境安装:
首先安装好PostgreSQL和Postgis,对数据库安装扩展插件:
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
2、数据处理
将路网数据和poi点数据导入到数据库中,这里可以使用PostgreSQL自带的插件shp2pgsql-gui.exe
(1)、对路网数据添加字段
-- 添加字段
ALTER TABLE road_lw
ADD COLUMN source INTEGER,--用于保存路径起始顶点的id
ADD COLUMN target INTEGER,-- 用于保存路径终止顶点的id
ADD COLUMN oneway VARCHAR,-- F 正向 T反向 B 双向
ADD COLUMN cost DOUBLE PRECISION,--用于保存路径正向的成本(或者代价)
ADD COLUMN reverse_cost DOUBLE PRECISION;--用于保存路径反向的成本(或者代价)
(2)、对数据做拓扑处理
-- 建立路网拓扑
SELECT pgr_createTopology('road_lw', 0.001,'geom','id','source','target');
-- 路网表
-- 路径之间的容差,两条路径的距离大于这个容差值,就表示它们不相交,否则就是相交
-- 路网表中包含空间信息
-- 路网表ID
-- 保存路径起始顶点的id的列
-- 保存路径终止顶点的id的列
这个时候生成了road_lw_vertices_pgr表,同时road_lw表中source列和target列已经被填满数据。