基于ArcPy的农村公路布局重要度最大树求解实现方法

2020-07-07 03:32李炜喆
广东交通职业技术学院学报 2020年2期
关键词:公路网路网路线

李炜喆

(广东一览综合交通规划设计研究有限公司,广东广州510310)

节点重要度法是公路网规划布局的重要方法之一,其重点是在节点重要度定量描述和层次划分的基础上,以路线重要度为指标,求解得出路网的逐层布局重要度最大树。随着乡村振兴战略深入推进,农村公路网规划愈发得到重视。节点重要度法同样广泛运用于农村公路网规划布局。目前,已有较多文献研究农村公路网节点重要度最大树求解理论方法,但有较少研究文献对方法如何在计算机中快速运算求解并可视化呈现结果展开论述。

针对上述问题,本文主要研究基于ArcPy的农村公路网重要度最大树求解实现方法,为重要度最大树如何在计算机中实现求解和可视化呈现结果提供可行的思路与方法。方法输出的结果为ArcGIS线要素类文件,可与ArcGIS中其他公路网规划有关数据共同呈现,有利和便于后续结合其他各因素进一步深化路网规划布局方案。

1 节点重要度法思路原理

1.1 节点重要度计算

公路网节点重要度主要受节点区域政治、经济、文化和产业等各方面因素影响。农村地区受基础统计数据较少所限,一般采用人口、工农业产值等指标衡量节点重要度[1]。在乡村振兴战略背景下,农村地区既重视民生经济发展,也愈发重视文化方面发展。因此本文提出在人口和工农业产值指标基础上,增加乡村旅游点、历史古村和革命老区分布数量等反映农村文化发展的指标,以更多元地衡量农村节点重要度。其计算公式如下所示:

式中:Ii为节点 i的重要度;Pi、Gi、Ai、Ti、Vi和Ri分别为节点的人口数、工业产值、农业产值、旅游景点、古村落和革命老区分布数量;为节点平均人口数量(其余指标同);aj(j=1,2,…,6)为第j项指标权重。

1.2 节点层次划分

动态聚类法是节点层次划分分析的数理统计方法之一,是根据一批样本(研究区域内各节点)在性质(重要度)上的疏密程度进行分类的定量分析方法[2]。Kmeans是简单有效的聚类算法之一,其主要思想是利用k个质心将离散的数据点聚类分成k个簇,不同簇之间数据点性质差异较大,而同一簇数据点性质相近[3]。因此本文采用Kmeans聚类算法进行节点层次划分。

1.3 路线重要度计算

确定节点间路线的交通需求强度是公路网布局的重要一环。根据农村公路规划的特点,路线的交通需求强度可通过“通道强度”指标来衡量。通道强度与路线起终点的重要度、路线距离有关,其数值关系模型形如重力模型[4],其计算公式如下:

式中:IMij为节点i、j之间的通道强度;Ii,Ij为节点i,j的重要度;Lij为节点i,j间的距离;k为路线行政级别和功能修正系数。

矩阵是储存和表示路线重要度的理想形式,以i行j列储存节点i与j之间的路线重要度,可得到表示整个区域路网两两节点间路线重要度的矩阵,即路线重要度矩阵。

1.4 重要度最大树求解

路线重要度矩阵又可抽象看成一张具有n个节点的连通网图,其各边权值即为路线重要度。在实际公路网规划布局建设中,考虑经济性原则,一般希望尽量满足交通需求情况下以最短的路径连通所有节点。即从连通网图中选取保持所有节点连通且满足交通需求强度最大化的最少的边。该路网规划布局思路与图论中的最小生成树思想相符。因此,问题可转化为求解连通网图的重要度最大树。将路线重要度取倒数,则可用求解最小生成树的方法求解重要度最大树。

求解最小生成树的方法一般有Kruskal和Prim算法。Prim算法适合于求解稠密图(边数接近于完全图),其运算效率优于Kruskal算法[5]。

在公路网布局实际工作中,一般适宜采用逐层展开布局路网的方法,即首先从最顶层节点进行路网布局优化,然后在该层次布局结果基础上,进行下一层次节点的路网布局优化,并考虑上一层次对下一层次节点的影响,如此类推,逐层展开布局路网[6]。因此本文采用基于Prim算法的路网逐层展开布局的方法求解重要度最大树[7]。

2 重要度最大树求解实现方法

2.1 ArcPy概述

ArcPy是ArcGIS内置的一个以成功的arcgisscripting模块为基础并继承了arcgisscripting功能进而构建的站点包,以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础[8]。其使用的Python是一种通用的程序语言,具有编写大型应用程序的功能。

2.2 技术路线

一般收集得到的研究区域节点基础数据为Excel表格形式或储存于ArcGIS点要素类属性表,因此首先通过Excel的函数功能或属性表的字段计算器求得各节点重要度,然后通过节点层次划分功能模块脚本程序,依据节点重要度进行聚类分层,则可得到包含节点基础数据、重要度和层级等字段的数据表。将此数据表导入Arc-GIS,通过读取节点要素类字段数据、计算路线重要度、重要度最大树求解和结果可视化等功能模块脚本程序,求得重要度最大树属性表和线要素类文件。具体技术路线如图1所示。

图1 技术路线

2.3 关键功能模块实现

路线重要度及路线重要度矩阵通过简单算术运算和循环语法则可求得,运算实现方法相对简单。因此本文重点研究实现节点层次划分、读取节点要素类字段数据、重要度最大树求解和结果可视化等关键功能模块的脚本程序。

为便于储存、管理和调用节点和路线属性数据,脚本程序中自定义了节点类node和路线类edge,其定义的属性如表1所示。另外在编写脚本程序前,首先梳理基础数据、过程数据和结果数据,明确相关数据的字段属性名称、数据类型,统一程序变量名称,以规范不同软件和各模块间数据调用接口,如表2所示。

表1 自定义节点类和路线类属性

表2 数据字段名称与类型

2.3.1 节点层次划分

根据节点层次划分方法,输入节点重要度数组,使用KMeans聚类方法划分层级。模块程序主要引用Python的sklearn.cluster库中的KMeans函数。主要代码如下:

import numpy as np

from sklearn.cluster import KMeans

npArr=np.array(P_Impt_Arr)

npArr=npArr.reshape((-1,1))#因Kmeans函数输入数组形式要求,将数组转换为1列多行

KM=KMeans(n_clusters=4)#n_clusters为分类数,以分4类为例

KM.fit(npArr)

Kresult=KM.labels_ #labels_属性即为节点分层结果数组

2.3.2 读取节点要素类字段数据

使用ArcPy的FeatureClassToNumPyArray函数,将要素类转换为NumPy结构数组,从而获取节点要素类的字段数据用于其他功能模块的运算。NumPy是Python的一个支持多维度数组和矩阵运算处理的拓展程序库,在ArcGIS中常用作与要素类或表相互转换。主要代码如下:

import arcpy as apy import numpy as np

TempArr=apy.da.FeatureClassToNumPyAr

ray(P_Path,['OID@','Name','X','Y','P_Impt','P_Levl'])#P_Path为节点要素类文件路径

P_Arr=[]

for i in TempArr:

p=node(i[0],i[1],i[2],i[3],i[4],i[5])

P_Arr.append(p)

2.3.3 重要度最大树求解

基于Prim算法的路网逐层展开布局重要度最大树的求解思路与实现流程如图2所示。根据思路流程,编写脚本程序,以节点类数组和路线重要度矩阵为输入参数,最终输出返回重要度最大树路线集合。由于文章篇幅所限,该模块只列出程序实现流程图。

图2 基于Prim算法重要度最大树求解程序实现流程

2.3.4 结果可视化

使用ArcPy的NumPyArrayToTable函数将求得的重要度最大树路线集合转化为ArcGIS属性表,其包含的字段数据有:路线编号、路线起终点编号、起终点坐标、重要度和层级,具体名称和数据类型如表2所示。然后根据属性表的路线起终点坐标数据,使用ArcGIS的XYTo-Line_management——XY转线数据管理工具,生成线要素类文件。生成后,ArcGIS自动导入线要素类文件,将重要度最大树求解结果可视化呈现。主要代码如下:

#输入节点类数组P_Arr和重要度最大树路线集合MIT_Set为参数

MIT_Arr=[]

for e in MIT_Set:

Temp=(e.ID, e.SP_ID, P_Arr[e.SP_ID].X,P_Arr[e.SP_ID].Y,e.EP_ID,P_Arr[e.EP_ID].X,P_Arr[e.EP_ID].Y)

MIT_Arr.append(Temp)

#将路线类数组转化为numpy数组,其中u4、f8表示数据类型与精度

XY2L_Arr=np.array (MIT_Arr, np.dtype([(′LID′,′u4′),(′SP_ID′,′u4′),(′SP_X′,′<f8′),(′SP_Y′,′<f8′),(′EP_ID′,′u4′),(′EP_X′,′<f8′),(′EP_Y′,′<f8′)]))

#在当前ArcGIS工作空间路径下创建重要度最大树结果属性表

MIT_T_Path=apy.env.workspace+ ′MIT_T.dbf′

apy.da.NumPyArrayToTable(XY2L_Arr,MIT_T_Path)

#获取当前节点要素类空间参考,确保线与节点要素类为同一空间参考

SR=apy.Describe(apy.env.workspace+ ′P.shp′).spatialReference

#在当前ArcGIS工作空间路径下创建重要度最大树结果线要素类文件

MIT_F_Path=apy.env.workspace + ′MIT_F.shp′

apy.XYToLine_management(MIT_T_Path,

MIT_F_Path, ′SP_X′, ′SP_Y′, ′EP_X′, ′EP_Y′,′GEODESIC′,′LID′,SR)

使用ArcPy的ExtendTable函数,以LID为索引,将赋有路线编号、重要度和层级属性值的L_ExtArr数组对应添加至线要素类属性表,则可根据重要度或层级属性以分类方式显示重要度最大树路网。

ExtImptArr=np.array(L_ExtArr,np.dtype([(′LI D′,′u4′),(′L_Impt′,′<f8′),(′L_Levl′,′u4′)]))

apy.da.ExtendTable(MIT_F_Path, ′LID′,Ext-ImptArr,′LID′)

3 应用实例

本文以佛山市高明区为例,使用上述重要度最大树求解方法和脚本程序进行农村公路网布局实例应用。

实例中选择高明区4个镇街级节点和61个村居级节点作为农村公路网节点。节点基础数据储存于Excel表,选择其中的人口、农业产值、镇街工业产值、旅游景点、古村落和革命老区分布数量等数据计算出各节点重要度。根据节点重要度,通过节点层次划分模块程序,将节点划分为非常重要、重要、较重要和一般4个层级,各层节点数量分别为:1、3、4和57个。至此得到具有基础数据、重要度和划分层级的节点数据表。将数据表导入ArcGIS并创建点要素类文件。因篇幅所限,部分节点运算数据如表3所示。

在ArcGIS中,检查当前地图工作空间路径无误后,选择菜单栏的“地理处理”——“Python”,打开Python脚本执行窗口。在窗口中加载将读取节点要素类字段数据、重要度最大树求解和结果可视化等功能模块整合为一体的脚本程序文档并运行。运行约18 s后,程序和软件生成并导入重要度最大树线要素类文件。最后根据节点和路线层级字段分类显示节点和路线,得出如图3所示布局结果。

由图3可见,求得的高明区农村公路主骨架路网形式主要为:区内4个重要镇街由主要干道相互串连,其他节点路线主要汇聚于就近的重要镇街节点,再通过主要干道通往其他地方节点。其中,石水、明西、明东和南洲等村居节点分布有区内重点旅游景点、农业园区和革命老区;因此,与镇街节点连接的路线层级相应提高,以满足旅游、农产品输出或地方发展需求。求解结果符合当地社会经济实际情况。

4 结语

表3 高明区农村公路节点重要度运算表

图3 高明区农村公路逐层展开布局重要度最大树

本文首先分析节点重要度法求解农村公路布局重要度最大树的基本思路和原理方法。然后在理论分析基础上,提出通过ArcPy编写脚本程序求解农村公路网重要度最大树和可视化的方法。最后结合实例分析,验证方法可行性。结果表明,该方法可快速求得路网重要度最大树,并通过生成输出的ArcGIS线要素类文件可视化呈现结果。

求得重要度最大树只是农村公路网规划布局的重要环节之一,要获得路网规划布局初步方案,还需要结合现状路网、高快速路和普通干线公路规划路网、地形地物、土地利用、区域城市和交通发展趋势与战略等等因素综合考虑,在重要度最大树主骨架基础上进一步深化路线布局。

猜你喜欢
公路网路网路线
广西公路网全领域智慧监测一体化研究
最优路线
『原路返回』找路线
公路网运行监测与应急处置系统实施效果评价
打着“飞的”去上班 城市空中交通路网还有多远
画路线
打造公路网运行的集成技术
省际路网联动机制的锦囊妙计
首都路网 不堪其重——2016年重大节假日高速公路免通期的北京路网运行状况
路网标志该如何指路?