PostgreSQL PostGIS pgrouting 泰国(thailand)全国路网分析(1)数据准备

部分图片源自网络,如有侵权,请与作者联系删除侵权的图片。
因水平有限,如有错漏,请联系作者修改,email:81855841@qq.com。

1 数据准备

1.1 从OSM下载泰国(thailand)SHP数据

  https://www.openstreetmap.org

1.2 点击”导出按钮”

选择从”Geofabrik 下载”->”Asia”->”Thailand”->”thailand-latest-free.shp.zip”开始下载地图数据。

1.2.1 点击”导出按钮”

这里写图片描述

1.2.2 “Geofabrik 下载”

这里写图片描述

1.2.3 “Asia”

这里写图片描述

1.2.4 “Thailand”

这里写图片描述

1.2.5 “thailand-latest-free.shp.zip”

这里写图片描述

特别注意:下载的数据空间参考为WGS84,地图单位为度。

2 数据检查处理

pgrouting经过多年的发展,算法和程序已经比较完善,如路网分析结果不正确,请先检查路网数据;
OSM非专业制图人员绘制,因此数据质量较差,不要着急入库,在入库之前可以请专业制图人员按下面的步骤对数据质量进行检查和修改,避免出现拓朴错误、伪节点和道路方向错误等;
产品应该结合道路实际情况,对路网进行处理(例如禁左、单行线、高架桥、道路等级设置、添加没有的道路等),此步是比较耗费人力、物力、财力的,导航准不准主要依赖这个步骤。因为我们只是测试,不管正确与否,因此省略这个步骤;
因为我们要做的是路网分析,因此下载后的OSM数据只要”gis.osm_roads_free_1”(道路)这个图层,原始数据有892093条记录;
几何对象分为POINT、MULTIPOINT、 LINE、MULTILINE、POLYGON、MULTIPOLYGON共6种类型,专业术语统称为要素(Feature),一个图层是由很多要素组成。路网分析只支持LINE,MULTILINE类型的几何对象必须打断转换为LINE。
数据检查处理建议在Arcmap中完成。

2.1 地图单位

根据数据的空间参考不同,地图上的单位也不尽相同(可能为度、米或其它。WGS84地图单位为度,西安1980地图单位为米)专业术语称为地图单位。

特别注意:在本文章中,因为地图数据为WGS84,以后的地图单位统统为度。

2.2 数据的拓朴检查

对于道路来说,拓朴检查的目的是防止因制图人员绘图发生错误时(应该相接的道路实际上是断开的),导致分析结果错误。如下图:
这里写图片描述
图中假设三条蓝色的道路应该是相通的,但是因为制图人员失误,导致三条蓝色的道路线段在放大后没有连接在一成,因此需要对路网进行拓朴检查,根据检查结果将三条蓝色的道路连接在一起。黄色最外层圆圈部份为拓朴检查的直径,这里假设为0.000010度。
拓朴检查建议采用arcmap,输入检查半径0.000005度,检查完毕后,arcmap会将错误的线段标注,制图人员将错误的地方修正后即可。
pgrouting中的pgr_createTopology函数也可以完成这个功能,但是还是建议在Arcmap中检查,方便制图人员纠正错误。

2.3 MULTI转换为Simple

这里写图片描述
一条线段组成一个要素,称之为LINE或SIMPLELINE(注意:路网分析只支持此种类型

这里写图片描述
多条线段组成一个要素,称之为MULTILINE(注意:路网分析必须转换为LINE类型

2.4 伪节点

这里写图片描述
上图红色线段红框中的线段应该合并,它们之间断开是没有意义的,反而会增加路网分析的成本。两条线路相交的点(细圆圈中的那个点)专业术业称之为伪节点。在arcmap中检查和消除伪节点,伪节点要多次拓朴检查,直至没有伪节点。

2.5 道路方向错误

道路是具有方向性的,pgrouting生成路网时会用到ST_StartPoint和ST_EndPoint函数,如绘制错误,会导致分析结果错误,方向错误没有太好的办法检查 ,只能通过多次随机测试来检查正确与否。如下图就是因为制图人员绘制错误的道路:
这里写图片描述

3 路网数据分类处理

OSM道路分类信息请参看。OSM数据解包后文件命名不规范,因此将图层“gis.osm_roads_free_1”复制到“/home/kmcb”并重命名为roads。

3.1 检查数据库是否安装了PostGIS

连接到指定的数据库,执行以下命令,如执行成功会输入版本信息,表示PostGIS已经安装成功了。

select PostGIS_Full_Version()

3.2 原始数据入库

shp2pgsql -s 4326 -c -g geom -I -W "UTF-8" "/home/kmcb/roads.shp" public.roads | psql -h localhost -U test -d test

注意:
-s 4326 表示WGS84,注意和自己的图层空间参考匹配;
-c 表示创建一个新表,如果已经数据库已经存在public.roads,请先删除它,否则报错;
-I 在空间字段上创建空间索引;
-g geom 指明空间字段名称。
-W 指明其它字段的编码类型,汉字一般使用GBK,如有汉字注意修改编码类型;
shp文件必须是完整路径;
public.ways表示导入到数据库中的模式和表名称。
执行shp2pgsql之前,最好设置数据库免密码登录,以免不必要的错误。

3.2 根据分类重新导出道路

导出”高速公路/快速公路、主干道路/城市快速路、主要道路、次要道路、普通街道、通往高速公路/快速公路的道路/出入口、连接主干道路与其他主干道路或较低级道路的连接路、连接主要道路与其他主要道路或较低级道路的连接路、连接次要道路与其他次要道路或较低级道路的连接路”9类道路。

pgsql2shp -f "/home/kmcb/road1.shp" -h localhost -u test -P 123 test "select * from roads where fclass=ANY(array['motorway','trunk','primary','secondary','tertiary','motorway_link','trunk_link','primary_link','secondary_link']::text[])"

上例中导出的图层名称为”road1”,位置在“/home/kmcb/”,连接的数据库为test,通过一个查询而不是表导出。
注意pgsql2shp必须用-P参数指定数据库密码,数据库名称不能使用-d参数。

3.3 按第2章中的内容处理道路road1

打断所有道路(MULTI转换为Simple);
合并所有伪节点(重复操作,直至没有伪节点);
处理完成后的示例数据在这里下载,共81904行记录。这个数据是不准确的,仅用于测试。

4 shp导入导出帮助

4.1 使用SQL转储文件

使用SQL转储文件,ways.sql保存在当前目录

shp2pgsql -D -a -s 4326 -g the_geom -W UTF-8 "E:\shp\roads.shp" public.ways > ways.sql

SQL转储文件使用追加数据的方式,因此在导入数据之前需要我们手动创建数据表(注意:shp中的线段一般都是MultiLine)。

drop table if exists ways;
create table ways(
    objectid serial not null,
    shape_leng double precision not null,   --导入的数据包含这个字段,实际不需要,导入完成后删除
    constraint pk_ways_objectid primary key (objectid)
);
select AddGeometryColumn ('public','ways','the_geom',4326,'MultiLineString',2);

导入数据

psql -h 主机ip -U 用户名 -d 数据库 -f ways.sql

4.2 shp2pgsql完整命令帮助:

-s [:] 设置 srid 字段。默认为0。(可选,不能与-d 一起使用)。
(d|a|c|p)这些是互斥选项,只能选择其中之一:
  -d 删除该表, 然后重新创建。
  -a 追加到当前表中, 图层字段必须与表架构完全相同。
  -c 创建一个新表并填充它, 如果不指定任何选项, 这是默认值。
  -p 准备模式, 只创建表。
-g 指定空间列的名称。
-D 使用 postgresql 转储格式 (默认为 SQL insert 语句)。
-e 单独执行每个语句, 不使用事务。 与-d 不兼容。
-G 使用地理类型 (需要 lon/lat data 或-s)。
-k 保持 postgresql 的标识符大小写。
-i dbf字段中的所有integer类型(smallint,int,int64)导入后都使用int4类型。
-I 在空间列上创建一个空间索引。
-m 指定一个文件, 其中包含一组 (long) 列名映射到10个字符 DBF 列名。文件的内容是一个或多个由空格分隔的两行名称, 没有尾随或前导空格。例如:
  COLUMNNAME DBFFIELD1
  AVERYLONGCOLUMNNAME DBFFIELD2
-S 生成单个(SIMPLE)要素, 而不是MULTI要素。
-t 强制几何要素为 “2D”、”3DZ”、”3DM” 或 “4D” 之一
-w 输出 WKT 而不是 WKB。 请注意, 这可能导致坐标漂移。
-W 指定属性列的字符编码。(默认值: “UTF-8”)
-N 空几何处理策略(insert*,skip,abort).。
-n 只导入 DBF 文件。
-T 指定表的表空间。请注意, 除非也使用 x 标志, 否则索引仍将使用默认表空间。
-X 指定索引表空间。这适用于主键和空间索引 (如果使用了 I 标志)。
-? 显示此帮助。

4.3 pgsql2shp完整命令帮助:

-f 使用此选项指定要创建的文件的名称
-h <主机>允许您指定与默认设备以外的其他计算机上的数据库的连接
-p <端口>允许您指定一个非默认的数据库端口
-P <密码>使用指定的密码连接到数据库
-u 以指定的用户身份连接到数据库
-g 指定要导出的几何列
-b 使用二进制游标
-r Raw mode
-k 保留PostgreSQL标识符的情况
-m 指定一个文件,其中包含(长)列名映射到10个字符的DBF列名称的映射。文件的内容是由空格分隔的两个名字的一行或多行,没有尾随或前导空格。例如:
COLUMNNAME DBFFIELD1
AVERYLONGCOLUMNNAME DBFFIELD2
-? 显示此帮助。

未完,待续。。。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值