PostgreSQL PostGIS pgrouting 泰国(thailand)全国路网分析(2)入库的数据处理
目录
在《PostgreSQL PostGIS pgrouting 泰国(thailand)全国路网分析(1)数据准备》一节中,我们已经处理好数据,现在开始入库并在数据库中处理数据入库的路网数据。
处理好的从第一章3.3节或这里下载。
1.导入处理好的路网
shp2pgsql -s 4326 -c -g the_geom -I -W "UTF-8" "/home/kmcb/shp/sroads.shp" public.sroads | psql -h localhost -U test -d test
数据导入可以如上例直接导入,如果出错请参考第一章“4.1 使用SQL转储文件”导入。
2.创建空间字段
在导入数据时使用了“-g the_geom”参数指定了原始数据的空间字段名称。shp线数据入库时大多数情况下线段的类型为MULTILINE,因此不能直接使用“the_geom”。现在我们创建新的空间字段:
alter table sroads drop column id; --删除shp线图层自带的id字段
select AddGeometryColumn ('sroads','geom',4326,'LINESTRING',2);
create index gidx_sroads_geom on sroads using gist(geom);
3.检查无效的几何对象
select gid from sroads where ST_IsValid(the_geom) IS FALSE;
如果有无效的几何对象,执行下面的命令删除,否则跳过
with cte as(
select gid from sroads where ST_IsValid(the_geom) IS FALSE
) delete from sroads where gid=ANY((select array_agg(gid) from cte)::integer[]);
4.检查是否有不能转换的线段
with cte as(
select gid,ST_AsText(ST_LineMerge(the_geom)) as geom from sroads
) select gid from cte where geom~'MULTILINESTRING';
如果有不能转换的线段,执行下面的命令删除,否则跳过
delete from sroads where gid=ANY(
(
with cte as(
select gid,ST_AsText(ST_LineMerge(the_geom)) as geom from sroads
) select array_agg(gid) from cte where geom~'MULTILINESTRING'
)::integer[]
);
5.将线段转换为Line
update sroads set geom=ST_LineMerge(the_geom);
删除原有的空间字段
ALTER TABLE sroads DROP COLUMN the_geom;
至此,基础数据处理全部完成。
6.添加路网分析必须的字段
ALTER TABLE sroads
ADD COLUMN source integer, /*当前线段起点连接至上一线段的id*/
ADD COLUMN target integer, /*当前线段终点连接至下一线段的id*/
ADD COLUMN cost double precision, /*正向成本*/
ADD COLUMN cost_time double precision, /*正向成本所需的时间*/
ADD COLUMN rcost double precision, /*反向成本*/
ADD COLUMN rcost_time double precision, /*反向成本所需的时间*/
ADD COLUMN x1 double precision, /*当前线段起点坐标(x)*/
ADD COLUMN y1 double precision, /*当前线段起点坐标(Y)*/
ADD COLUMN x2 double precision, /*当前线段终点坐标(x)*/
ADD COLUMN y2 double precision, /*当前线段终点坐标(y)*/
ADD COLUMN to_cost double precision,
ADD COLUMN rule text,
ADD COLUMN isolated integer;
详细内容请参看pgrouting文档
7.更新属性字段
with base as(
select 'SPHEROID["WGS84",6378137,298.25728]'::spheroid as sph
) update sroads set x1 = st_x(st_startpoint(geom)),
y1 = st_y(st_startpoint(geom)),
x2 = st_x(st_endpoint(geom)),
y2 = st_y(st_endpoint(geom)),
cost = ST_LengthSpheroid(geom, f.sph)::integer,
rcost = ST_LengthSpheroid(geom, f.sph)::integer
from base as f;
cost_len==rcost表示双向通行,如果要单行,只要在其中的一个字段上设置为-1即可。
cost_len和rcost长度单位为米并且只精确到米。
为加快pgr_createTopology的速度,VACUUM一下表
VACUUM FULL ANALYZE VERBOSE sroads;
8.路网创建拓扑
select pgr_createTopology('sroads', 0.000001, the_geom:='geom', id:='gid', source:='source', target:='target');
0.000001在上一章Arcmap中做拓朴检查时输入的值,单位为 0.000001度【在低纬地区(中国)大约是米级精度了】。
创建拓朴成功后,同时会生成一个表,命名格式为“表名_vertices_pgr(sroads_vertices_pgr)”,主要存储线段交汇点数据(几何类型为POINT)。
sroads图层,路网数据
sroads_vertices_pgr图层,是不是很有立体感
9.VACUUM表
由于前面我们做了大量的更新和删除操作,为提高性能对表进行VACUUM 操作,提高路网分析效率。
VACUUM FULL ANALYZE VERBOSE sroads;
VACUUM FULL ANALYZE VERBOSE sroads_vertices_pgr;
至此所有数据准备工作都已经完成了,下一章讲解具体的应用。
未完,待续。。。
转载自:https://blog.csdn.net/kmblack1/article/details/78840274