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

You may also like...