如何使用自有数据创建大规模路网拓扑结构

3975

在创建路网拓扑结构之前首先需要安装arcgis,打断路网的相交线,这一点非常重要 在这里插入图片描述 从上路我们可以看出路网交叉口的地方是连接起立的,而且大部分路网数据都是如此,如果想构建路网拓扑结构就必须从交叉口处打断,然后以交叉口作为拓扑顶点,路段作为拓扑边。不管是从openstreetmap下载的数据还是从其他地方的数据,都会存在这样路网相交的问题。

打断路网相交线

首先打开ArcGis(安装教程参考:ArcGis安装破解教程) 在这里插入图片描述 在图层上右键添加数据,然后将自己需要打断相交线的路网数据添加进来,只支持shp格式 在这里插入图片描述 在这里插入图片描述 然后添加两个打开工具栏,编辑器工具栏和拓扑工具栏 在这里插入图片描述 点击编辑器-->开始编辑 在这里插入图片描述 然后选择需要打断相交线的要素,可以用鼠标在渲染出来的地图数据上框选,我直接全选如下图在数据图层上右键-->选择-->全选 在这里插入图片描述 全选之后: 在这里插入图片描述 到了这一步就可以开始打断相交线了,点击拓扑工具栏的打断相交线工具开始打断 在这里插入图片描述 设置路径相交的容差,默认即可 在这里插入图片描述 点击确定就会开始打断相交线了,要素越多打断速度越慢。

完成之后,用鼠标点击路网可以看出已经从交叉口处断开了,到此数据处理完毕 在这里插入图片描述

安装Postgresql数据库

建议安装稳定版9.6版本

postgresql下载地址

window64位版下载地址

下载完成后,安装过程省略,无脑安装即可,比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字段表示拓扑起点即sourcehighway是表名称)
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表创建拓扑布局,即为sourcetarget字段赋值
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
  • sourcetarget字段创建索引
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