如何使用自有数据创建大规模路网拓扑结构
在创建路网拓扑结构之前首先需要安装arcgis
,打断路网的相交线,这一点非常重要
从上路我们可以看出路网交叉口的地方是连接起立的,而且大部分路网数据都是如此,如果想构建路网拓扑结构就必须从交叉口处打断,然后以交叉口作为拓扑顶点,路段作为拓扑边。不管是从openstreetmap
下载的数据还是从其他地方的数据,都会存在这样路网相交的问题。
打断路网相交线
首先打开ArcGis
(安装教程参考:ArcGis安装破解教程)
在图层上右键添加数据,然后将自己需要打断相交线的路网数据添加进来,只支持shp
格式
然后添加两个打开工具栏,编辑器工具栏和拓扑工具栏
点击编辑器-->开始编辑
然后选择需要打断相交线的要素,可以用鼠标在渲染出来的地图数据上框选,我直接全选如下图在数据图层上右键-->选择-->全选
全选之后:
到了这一步就可以开始打断相交线了,点击拓扑工具栏的打断相交线工具开始打断
设置路径相交的容差,默认即可
点击确定就会开始打断相交线了,要素越多打断速度越慢。
完成之后,用鼠标点击路网可以看出已经从交叉口处断开了,到此数据处理完毕
安装Postgresql数据库
建议安装稳定版9.6版本
下载完成后,安装过程省略,无脑安装即可,比mysql简单多了
安装完成之后,需要安装postgis
插件:
打开如下软件
然后选择数据库点下一步:
安装该插件之后就会有一个可以将shp
的数据导入到postgres
的工具了
创建数据库并增加gis功能
可以使用命令行或者是图形化界面创建数据库(我是用的Navicat
)
有了数据库之后,需要给该数据库增加gis
功能,在数据库中允许以下命令:
create extension postgis;
create extension postgis_topology;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
create extension pgrouting;
create extension address_standardizer;
如Navicat新建查询:
或者命令行的方式:
然后导入shp的数据到数据库中,会自动建表,注意:存放shp文件的路径不要包含中文,文件名称不要包含中文,否则会导入失败。如果shp文件中包含中文,建议shp的字符集是GBK
,导入到数据库后会自动转为UTF-8
,否则导入到数据库后会出现中文乱码现象
导入shp数据
打开PostGIS 2.0 Shapefile and DBF Loader Exporter
工具
然后勾选为生成简单的线类型,生成拓扑结构只支持LineString
类型而不支持MuLtiLineString
类型,所以如果这一步不勾选会导致拓扑生成失败
导入数据成功之后就可以生成拓扑结构了
生成路网拓扑结构
- 首先执行命令对数据表添加一个id字段表示拓扑起点即
source
(highway
是表名称)
ALTER TABLE public.highway ADD COLUMN source integer;
- 添加终点id字段,即
target
ALTER TABLE public.highway ADD COLUMN target integer;
- 添加道路权重值字段,即
length
字段
ALTER TABLE public.highway ADD COLUMN length double precision;
- 为
highway
表创建拓扑布局,即为source
和target
字段赋值
SELECT pgr_createTopology('public.highway',0.00001, 'geom', 'gid');
运行结果:
> 注意: PROCESSING:
注意: pgr_createTopology('public.highway', 1e-005, 'geom', 'gid', 'source', 'target', rows_where := 'true', clean := f)
注意: Performing checks, please wait .....
注意: Creating Topology, Please wait...
注意: 1000 edges processed
注意: 2000 edges processed
注意: 3000 edges processed
注意: 4000 edges processed
注意: 5000 edges processed
注意: 6000 edges processed
注意: 7000 edges processed
注意: 8000 edges processed
注意: 9000 edges processed
注意: 10000 edges processed
注意: 11000 edges processed
注意: 12000 edges processed
注意: 13000 edges processed
注意: 14000 edges processed
注意: 15000 edges processed
注意: 16000 edges processed
注意: 17000 edges processed
注意: 18000 edges processed
注意: 19000 edges processed
注意: 20000 edges processed
注意: 21000 edges processed
注意: 22000 edges processed
注意: 23000 edges processed
注意: 24000 edges processed
注意: 25000 edges processed
注意: 26000 edges processed
注意: 27000 edges processed
注意: 28000 edges processed
注意: 29000 edges processed
注意: 30000 edges processed
注意: 31000 edges processed
注意: 32000 edges processed
注意: 33000 edges processed
注意: 34000 edges processed
注意: 35000 edges processed
注意: 36000 edges processed
注意: 37000 edges processed
注意: 38000 edges processed
注意: 39000 edges processed
注意: 40000 edges processed
注意: 41000 edges processed
注意: 42000 edges processed
注意: 43000 edges processed
注意: 44000 edges processed
注意: 45000 edges processed
注意: 46000 edges processed
注意: 47000 edges processed
注意: 48000 edges processed
注意: 49000 edges processed
注意: 50000 edges processed
注意: 51000 edges processed
注意: 52000 edges processed
注意: 53000 edges processed
注意: 54000 edges processed
注意: 55000 edges processed
注意: 56000 edges processed
注意: 57000 edges processed
注意: 58000 edges processed
注意: 59000 edges processed
注意: 60000 edges processed
注意: 61000 edges processed
注意: 62000 edges processed
注意: 63000 edges processed
注意: 64000 edges processed
注意: 65000 edges processed
注意: 66000 edges processed
注意: 67000 edges processed
注意: 68000 edges processed
注意: 69000 edges processed
注意: 70000 edges processed
注意: 71000 edges processed
注意: 72000 edges processed
注意: 73000 edges processed
注意: 74000 edges processed
注意: 75000 edges processed
注意: 76000 edges processed
注意: 77000 edges processed
注意: 78000 edges processed
注意: 79000 edges processed
注意: 80000 edges processed
注意: 81000 edges processed
注意: 82000 edges processed
注意: 83000 edges processed
注意: 84000 edges processed
注意: 85000 edges processed
注意: 86000 edges processed
注意: 87000 edges processed
注意: 88000 edges processed
注意: 89000 edges processed
注意: 90000 edges processed
注意: 91000 edges processed
注意: 92000 edges processed
注意: 93000 edges processed
注意: 94000 edges processed
注意: 95000 edges processed
注意: 96000 edges processed
注意: 97000 edges processed
注意: 98000 edges processed
注意: 99000 edges processed
注意: 100000 edges processed
注意: 101000 edges processed
注意: 102000 edges processed
注意: 103000 edges processed
注意: 104000 edges processed
注意: 105000 edges processed
注意: 106000 edges processed
注意: 107000 edges processed
注意: 108000 edges processed
注意: 109000 edges processed
注意: 110000 edges processed
注意: 111000 edges processed
注意: 112000 edges processed
注意: 113000 edges processed
注意 ----------------------------------
> 时间: 412.473s
- 为
source
和target
字段创建索引
CREATE INDEX source_idx ON highway("source");
CREATE INDEX target_idx ON highway("target");
- 为
length
赋值
update highway set length =st_length(geom);
- 为
highway
表添加reverse_cost
字段并用length
的值赋值
ALTER TABLE highway ADD COLUMN reverse_cost double precision;
UPDATE highway SET reverse_cost =length;
到此路网拓扑结构就创建完毕了。
使用Postgresql的方式创建拓扑
注意: 这些命令是告诉我们如何用Postgresql
自己的方式创建路网拓扑结果,而上面已经使用了arcgis
打断相交线,我做过测试,Postgresql
自己的方式创建拓扑并不理想,所以建议先用arcgis打断相交线在使用postgresql创建拓扑的方式即上面的方式。
pgr_analyzeGraph
用于分析路网拓扑
SELECT pgr_analyzeGraph('highway', 0.00001,'geom','gid','source','target','true')
> 注意: PROCESSING:
注意: pgr_analyzeGraph('highway',1e-005,'geom','gid','source','target','true')
注意: Performing checks, please wait ...
注意: Analyzing for dead ends. Please wait...
注意: Analyzing for gaps. Please wait...
注意: Analyzing for isolated edges. Please wait...
注意: Analyzing for ring geometries. Please wait...
注意: Analyzing for intersections. Please wait...
注意: ANALYSIS RESULTS FOR SELECTED EDGES:
注意: Isolated segments: 2
注意: Dead ends: 15119
注意: Potential gaps found near dead ends: 15
注意: Intersections detected: 23439
注意: Ring geometries: 0
> 时间: 86.004s
- 分析的结果告诉我们,网络有一个缺口和一个交叉点。我们试图解决问题可以使用:
SELECT pgr_nodeNetwork('highway', 0.00001, 'gid', 'geom', 'noded');
> 注意: PROCESSING:
注意: pgr_nodeNetwork('highway', 1e-005, 'gid', 'geom', 'noded', '<NULL>', f)
注意: Performing checks, please wait .....
注意: Processing, please wait .....
注意: Split Edges: 22217
注意: Untouched Edges: 239390
注意: Total original Edges: 261607
注意: Edges generated: 84241
注意: Untouched Edges: 239390
注意: Total New segments: 323631
注意: New Table: public.highway_noded
注意: ----------------------------------
> 时间: 104.325s
- 检查生成的表,查看
pgr_nodeNetwork
执行的结果
SELECT old_id,sub_id FROM highway_noded ORDER BY old_id,sub_id;
- 我们可以创建新网络的拓扑结构
SELECT pgr_createTopology('highway_noded', 0.00001,'geom');
> 注意: PROCESSING:
注意: pgr_createTopology('highway_noded', 1e-005, 'geom', 'id', 'source', 'target', rows_where := 'true', clean := f)
注意: Performing checks, please wait .....
注意: Creating Topology, Please wait...
注意: 1000 edges processed
注意: 2000 edges processed
注意: 3000 edges processed
注意: 4000 edges processed
注意: 5000 edges processed
注意: 6000 edges processed
注意: 7000 edges processed
注意: 8000 edges processed
注意: 9000 edges processed
注意: 10000 edges processed
注意: 11000 edges processed
注意: 12000 edges processed
注意: 13000 edges processed
注意: 14000 edges processed
注意: 15000 edges processed
注意: 16000 edges processed
注意: 17000 edges processed
注意: 18000 edges processed
注意: 19000 edges processed
注意: 20000 edges processed
注意: 21000 edges processed
注意: 22000 edges processed
注意: 23000 edges processed
注意: 24000 edges processed
注意: 25000 edges processed
注意: 26000 edges processed
注意: 27000 edges processed
注意: 28000 edges processed
注意: 29000 edges processed
注意: 30000 edges processed
注意: 31000 edges processed
注意: 32000 edges processed
注意: 33000 edges processed
注意: 34000 edges processed
注意: 35000 edges processed
注意: 36000 edges processed
注意: 37000 edges processed
注意: 38000 edges processed
注意: 39000 edges processed
注意: 40000 edges processed
注意: 41000 edges processed
注意: 42000 edges processed
注意: 43000 edges processed
注意: 44000 edges processed
注意: 45000 edges processed
注意: 46000 edges processed
注意: 47000 edges processed
注意: 48000 edges processed
注意: 49000 edges processed
注意: 50000 edges processed
注意: 51000 edges processed
注意: 52000 edges processed
注意: 53000 edges processed
注意: 54000 edges processed
注意: 55000 edges processed
注意: 56000 edges processed
注意: 57000 edges processed
注意: 58000 edges processed
注意: 59000 edges processed
注意: 60000 edges processed
注意: 61000 edges processed
注意: 62000 edges processed
注意: 63000 edges processed
注意: 64000 edges processed
注意: 65000 edges processed
注意: 66000 edges processed
注意: 67000 edges processed
注意: 68000 edges processed
注意: 69000 edges processed
注意: 70000 edges processed
注意: 71000 edges processed
注意: 72000 edges processed
注意: 73000 edges processed
注意: 74000 edges processed
注意: 75000 edges processed
注意: 76000 edges processed
注意: 77000 edges processed
注意: 78000 edges processed
注意: 79000 edges processed
注意: 80000 edges processed
注意: 81000 edges processed
注意: 82000 edges processed
注意: 83000 edges processed
注意: 84000 edges processed
注意: 85000 edges processed
注意: 86000 edges processed
注意: 87000 edges processed
注意: 88000 edges processed
注意: 89000 edges processed
注意: 90000 edges processed
注意: 91000 edges processed
注意: 92000 edges processed
注意: 93000 edges processed
注意: 94000 edges processed
注意: 95000 edges processed
注意: 96000 edges processed
注意: 97000 edges processed
注意: 98000 edges processed
注意: 99000 edges processed
注意: 100000 edges processed
注意: 101000 edges processed
注意: 102000 edges processed
注意: 103000 edges processed
注意: 104000 edges processed
注意: 105000 edges processed
注意: 106000 edges processed
注意: 107000 edges processed
注意: 108000 edges processed
注意: 109000 edges processed
注意: 110000 edges processed
注意: 111000 edges processed
注意: 112000 edges processed
注意: 113000 edges processed
注意:
> 时间: 480.063s
- 再次分析新创建的拓扑结构
SELECT pgr_analyzeGraph('highway_noded', 0.00001,'geom','id','source','target','true');
> 注意: PROCESSING:
注意: pgr_analyzeGraph('highway_noded',1e-005,'geom','id','source','target','true')
注意: Performing checks, please wait ...
注意: Analyzing for dead ends. Please wait...
注意: Analyzing for gaps. Please wait...
注意: Analyzing for isolated edges. Please wait...
注意: Analyzing for ring geometries. Please wait...
注意: Analyzing for intersections. Please wait...
注意: ANALYSIS RESULTS FOR SELECTED EDGES:
注意: Isolated segments: 2
注意: Dead ends: 15103
注意: Potential gaps found near dead ends: 1
注意: Intersections detected: 27872
注意: Ring geometries: 0
> 时间: 114.565s