李煒喆
(廣東一覽綜合交通規(guī)劃設(shè)計(jì)研究有限公司,廣東廣州510310)
節(jié)點(diǎn)重要度法是公路網(wǎng)規(guī)劃布局的重要方法之一,其重點(diǎn)是在節(jié)點(diǎn)重要度定量描述和層次劃分的基礎(chǔ)上,以路線(xiàn)重要度為指標(biāo),求解得出路網(wǎng)的逐層布局重要度最大樹(shù)。隨著鄉(xiāng)村振興戰(zhàn)略深入推進(jìn),農(nóng)村公路網(wǎng)規(guī)劃愈發(fā)得到重視。節(jié)點(diǎn)重要度法同樣廣泛運(yùn)用于農(nóng)村公路網(wǎng)規(guī)劃布局。目前,已有較多文獻(xiàn)研究農(nóng)村公路網(wǎng)節(jié)點(diǎn)重要度最大樹(shù)求解理論方法,但有較少研究文獻(xiàn)對(duì)方法如何在計(jì)算機(jī)中快速運(yùn)算求解并可視化呈現(xiàn)結(jié)果展開(kāi)論述。
針對(duì)上述問(wèn)題,本文主要研究基于A(yíng)rcPy的農(nóng)村公路網(wǎng)重要度最大樹(shù)求解實(shí)現(xiàn)方法,為重要度最大樹(shù)如何在計(jì)算機(jī)中實(shí)現(xiàn)求解和可視化呈現(xiàn)結(jié)果提供可行的思路與方法。方法輸出的結(jié)果為ArcGIS線(xiàn)要素類(lèi)文件,可與ArcGIS中其他公路網(wǎng)規(guī)劃有關(guān)數(shù)據(jù)共同呈現(xiàn),有利和便于后續(xù)結(jié)合其他各因素進(jìn)一步深化路網(wǎng)規(guī)劃布局方案。
公路網(wǎng)節(jié)點(diǎn)重要度主要受節(jié)點(diǎn)區(qū)域政治、經(jīng)濟(jì)、文化和產(chǎn)業(yè)等各方面因素影響。農(nóng)村地區(qū)受基礎(chǔ)統(tǒng)計(jì)數(shù)據(jù)較少所限,一般采用人口、工農(nóng)業(yè)產(chǎn)值等指標(biāo)衡量節(jié)點(diǎn)重要度[1]。在鄉(xiāng)村振興戰(zhàn)略背景下,農(nóng)村地區(qū)既重視民生經(jīng)濟(jì)發(fā)展,也愈發(fā)重視文化方面發(fā)展。因此本文提出在人口和工農(nóng)業(yè)產(chǎn)值指標(biāo)基礎(chǔ)上,增加鄉(xiāng)村旅游點(diǎn)、歷史古村和革命老區(qū)分布數(shù)量等反映農(nóng)村文化發(fā)展的指標(biāo),以更多元地衡量農(nóng)村節(jié)點(diǎn)重要度。其計(jì)算公式如下所示:
式中:Ii為節(jié)點(diǎn) i的重要度;Pi、Gi、Ai、Ti、Vi和Ri分別為節(jié)點(diǎn)的人口數(shù)、工業(yè)產(chǎn)值、農(nóng)業(yè)產(chǎn)值、旅游景點(diǎn)、古村落和革命老區(qū)分布數(shù)量;為節(jié)點(diǎn)平均人口數(shù)量(其余指標(biāo)同);aj(j=1,2,…,6)為第j項(xiàng)指標(biāo)權(quán)重。
動(dòng)態(tài)聚類(lèi)法是節(jié)點(diǎn)層次劃分分析的數(shù)理統(tǒng)計(jì)方法之一,是根據(jù)一批樣本(研究區(qū)域內(nèi)各節(jié)點(diǎn))在性質(zhì)(重要度)上的疏密程度進(jìn)行分類(lèi)的定量分析方法[2]。Kmeans是簡(jiǎn)單有效的聚類(lèi)算法之一,其主要思想是利用k個(gè)質(zhì)心將離散的數(shù)據(jù)點(diǎn)聚類(lèi)分成k個(gè)簇,不同簇之間數(shù)據(jù)點(diǎn)性質(zhì)差異較大,而同一簇?cái)?shù)據(jù)點(diǎn)性質(zhì)相近[3]。因此本文采用Kmeans聚類(lèi)算法進(jìn)行節(jié)點(diǎn)層次劃分。
確定節(jié)點(diǎn)間路線(xiàn)的交通需求強(qiáng)度是公路網(wǎng)布局的重要一環(huán)。根據(jù)農(nóng)村公路規(guī)劃的特點(diǎn),路線(xiàn)的交通需求強(qiáng)度可通過(guò)“通道強(qiáng)度”指標(biāo)來(lái)衡量。通道強(qiáng)度與路線(xiàn)起終點(diǎn)的重要度、路線(xiàn)距離有關(guān),其數(shù)值關(guān)系模型形如重力模型[4],其計(jì)算公式如下:
式中:IMij為節(jié)點(diǎn)i、j之間的通道強(qiáng)度;Ii,Ij為節(jié)點(diǎn)i,j的重要度;Lij為節(jié)點(diǎn)i,j間的距離;k為路線(xiàn)行政級(jí)別和功能修正系數(shù)。
矩陣是儲(chǔ)存和表示路線(xiàn)重要度的理想形式,以i行j列儲(chǔ)存節(jié)點(diǎn)i與j之間的路線(xiàn)重要度,可得到表示整個(gè)區(qū)域路網(wǎng)兩兩節(jié)點(diǎn)間路線(xiàn)重要度的矩陣,即路線(xiàn)重要度矩陣。
路線(xiàn)重要度矩陣又可抽象看成一張具有n個(gè)節(jié)點(diǎn)的連通網(wǎng)圖,其各邊權(quán)值即為路線(xiàn)重要度。在實(shí)際公路網(wǎng)規(guī)劃布局建設(shè)中,考慮經(jīng)濟(jì)性原則,一般希望盡量滿(mǎn)足交通需求情況下以最短的路徑連通所有節(jié)點(diǎn)。即從連通網(wǎng)圖中選取保持所有節(jié)點(diǎn)連通且滿(mǎn)足交通需求強(qiáng)度最大化的最少的邊。該路網(wǎng)規(guī)劃布局思路與圖論中的最小生成樹(shù)思想相符。因此,問(wèn)題可轉(zhuǎn)化為求解連通網(wǎng)圖的重要度最大樹(shù)。將路線(xiàn)重要度取倒數(shù),則可用求解最小生成樹(shù)的方法求解重要度最大樹(shù)。
求解最小生成樹(shù)的方法一般有Kruskal和Prim算法。Prim算法適合于求解稠密圖(邊數(shù)接近于完全圖),其運(yùn)算效率優(yōu)于Kruskal算法[5]。
在公路網(wǎng)布局實(shí)際工作中,一般適宜采用逐層展開(kāi)布局路網(wǎng)的方法,即首先從最頂層節(jié)點(diǎn)進(jìn)行路網(wǎng)布局優(yōu)化,然后在該層次布局結(jié)果基礎(chǔ)上,進(jìn)行下一層次節(jié)點(diǎn)的路網(wǎng)布局優(yōu)化,并考慮上一層次對(duì)下一層次節(jié)點(diǎn)的影響,如此類(lèi)推,逐層展開(kāi)布局路網(wǎng)[6]。因此本文采用基于Prim算法的路網(wǎng)逐層展開(kāi)布局的方法求解重要度最大樹(shù)[7]。
ArcPy是ArcGIS內(nèi)置的一個(gè)以成功的arcgisscripting模塊為基礎(chǔ)并繼承了arcgisscripting功能進(jìn)而構(gòu)建的站點(diǎn)包,以實(shí)用高效的方式通過(guò)Python執(zhí)行地理數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動(dòng)化創(chuàng)建基礎(chǔ)[8]。其使用的Python是一種通用的程序語(yǔ)言,具有編寫(xiě)大型應(yīng)用程序的功能。
一般收集得到的研究區(qū)域節(jié)點(diǎn)基礎(chǔ)數(shù)據(jù)為Excel表格形式或儲(chǔ)存于A(yíng)rcGIS點(diǎn)要素類(lèi)屬性表,因此首先通過(guò)Excel的函數(shù)功能或?qū)傩员淼淖侄斡?jì)算器求得各節(jié)點(diǎn)重要度,然后通過(guò)節(jié)點(diǎn)層次劃分功能模塊腳本程序,依據(jù)節(jié)點(diǎn)重要度進(jìn)行聚類(lèi)分層,則可得到包含節(jié)點(diǎn)基礎(chǔ)數(shù)據(jù)、重要度和層級(jí)等字段的數(shù)據(jù)表。將此數(shù)據(jù)表導(dǎo)入Arc-GIS,通過(guò)讀取節(jié)點(diǎn)要素類(lèi)字段數(shù)據(jù)、計(jì)算路線(xiàn)重要度、重要度最大樹(shù)求解和結(jié)果可視化等功能模塊腳本程序,求得重要度最大樹(shù)屬性表和線(xiàn)要素類(lèi)文件。具體技術(shù)路線(xiàn)如圖1所示。
圖1 技術(shù)路線(xiàn)
路線(xiàn)重要度及路線(xiàn)重要度矩陣通過(guò)簡(jiǎn)單算術(shù)運(yùn)算和循環(huán)語(yǔ)法則可求得,運(yùn)算實(shí)現(xiàn)方法相對(duì)簡(jiǎn)單。因此本文重點(diǎn)研究實(shí)現(xiàn)節(jié)點(diǎn)層次劃分、讀取節(jié)點(diǎn)要素類(lèi)字段數(shù)據(jù)、重要度最大樹(shù)求解和結(jié)果可視化等關(guān)鍵功能模塊的腳本程序。
為便于儲(chǔ)存、管理和調(diào)用節(jié)點(diǎn)和路線(xiàn)屬性數(shù)據(jù),腳本程序中自定義了節(jié)點(diǎn)類(lèi)node和路線(xiàn)類(lèi)edge,其定義的屬性如表1所示。另外在編寫(xiě)腳本程序前,首先梳理基礎(chǔ)數(shù)據(jù)、過(guò)程數(shù)據(jù)和結(jié)果數(shù)據(jù),明確相關(guān)數(shù)據(jù)的字段屬性名稱(chēng)、數(shù)據(jù)類(lèi)型,統(tǒng)一程序變量名稱(chēng),以規(guī)范不同軟件和各模塊間數(shù)據(jù)調(diào)用接口,如表2所示。
表1 自定義節(jié)點(diǎn)類(lèi)和路線(xiàn)類(lèi)屬性
表2 數(shù)據(jù)字段名稱(chēng)與類(lèi)型
2.3.1 節(jié)點(diǎn)層次劃分
根據(jù)節(jié)點(diǎn)層次劃分方法,輸入節(jié)點(diǎn)重要度數(shù)組,使用KMeans聚類(lèi)方法劃分層級(jí)。模塊程序主要引用Python的sklearn.cluster庫(kù)中的KMeans函數(shù)。主要代碼如下:
import numpy as np
from sklearn.cluster import KMeans
npArr=np.array(P_Impt_Arr)
npArr=npArr.reshape((-1,1))#因Kmeans函數(shù)輸入數(shù)組形式要求,將數(shù)組轉(zhuǎn)換為1列多行
KM=KMeans(n_clusters=4)#n_clusters為分類(lèi)數(shù),以分4類(lèi)為例
KM.fit(npArr)
Kresult=KM.labels_ #labels_屬性即為節(jié)點(diǎn)分層結(jié)果數(shù)組
2.3.2 讀取節(jié)點(diǎn)要素類(lèi)字段數(shù)據(jù)
使用ArcPy的FeatureClassToNumPyArray函數(shù),將要素類(lèi)轉(zhuǎn)換為NumPy結(jié)構(gòu)數(shù)組,從而獲取節(jié)點(diǎn)要素類(lèi)的字段數(shù)據(jù)用于其他功能模塊的運(yùn)算。NumPy是Python的一個(gè)支持多維度數(shù)組和矩陣運(yùn)算處理的拓展程序庫(kù),在A(yíng)rcGIS中常用作與要素類(lèi)或表相互轉(zhuǎn)換。主要代碼如下:
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為節(jié)點(diǎn)要素類(lèi)文件路徑
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 重要度最大樹(shù)求解
基于Prim算法的路網(wǎng)逐層展開(kāi)布局重要度最大樹(shù)的求解思路與實(shí)現(xiàn)流程如圖2所示。根據(jù)思路流程,編寫(xiě)腳本程序,以節(jié)點(diǎn)類(lèi)數(shù)組和路線(xiàn)重要度矩陣為輸入?yún)?shù),最終輸出返回重要度最大樹(shù)路線(xiàn)集合。由于文章篇幅所限,該模塊只列出程序?qū)崿F(xiàn)流程圖。
圖2 基于Prim算法重要度最大樹(shù)求解程序?qū)崿F(xiàn)流程
2.3.4 結(jié)果可視化
使用ArcPy的NumPyArrayToTable函數(shù)將求得的重要度最大樹(shù)路線(xiàn)集合轉(zhuǎn)化為ArcGIS屬性表,其包含的字段數(shù)據(jù)有:路線(xiàn)編號(hào)、路線(xiàn)起終點(diǎn)編號(hào)、起終點(diǎn)坐標(biāo)、重要度和層級(jí),具體名稱(chēng)和數(shù)據(jù)類(lèi)型如表2所示。然后根據(jù)屬性表的路線(xiàn)起終點(diǎn)坐標(biāo)數(shù)據(jù),使用ArcGIS的XYTo-Line_management——XY轉(zhuǎn)線(xiàn)數(shù)據(jù)管理工具,生成線(xiàn)要素類(lèi)文件。生成后,ArcGIS自動(dòng)導(dǎo)入線(xiàn)要素類(lèi)文件,將重要度最大樹(shù)求解結(jié)果可視化呈現(xiàn)。主要代碼如下:
#輸入節(jié)點(diǎn)類(lèi)數(shù)組P_Arr和重要度最大樹(shù)路線(xiàn)集合MIT_Set為參數(shù)
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)
#將路線(xiàn)類(lèi)數(shù)組轉(zhuǎn)化為numpy數(shù)組,其中u4、f8表示數(shù)據(jù)類(lèi)型與精度
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′)]))
#在當(dāng)前ArcGIS工作空間路徑下創(chuàng)建重要度最大樹(shù)結(jié)果屬性表
MIT_T_Path=apy.env.workspace+ ′MIT_T.dbf′
apy.da.NumPyArrayToTable(XY2L_Arr,MIT_T_Path)
#獲取當(dāng)前節(jié)點(diǎn)要素類(lèi)空間參考,確保線(xiàn)與節(jié)點(diǎn)要素類(lèi)為同一空間參考
SR=apy.Describe(apy.env.workspace+ ′P.shp′).spatialReference
#在當(dāng)前ArcGIS工作空間路徑下創(chuàng)建重要度最大樹(shù)結(jié)果線(xiàn)要素類(lèi)文件
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函數(shù),以L(fǎng)ID為索引,將賦有路線(xiàn)編號(hào)、重要度和層級(jí)屬性值的L_ExtArr數(shù)組對(duì)應(yīng)添加至線(xiàn)要素類(lèi)屬性表,則可根據(jù)重要度或?qū)蛹?jí)屬性以分類(lèi)方式顯示重要度最大樹(shù)路網(wǎng)。
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′)
本文以佛山市高明區(qū)為例,使用上述重要度最大樹(shù)求解方法和腳本程序進(jìn)行農(nóng)村公路網(wǎng)布局實(shí)例應(yīng)用。
實(shí)例中選擇高明區(qū)4個(gè)鎮(zhèn)街級(jí)節(jié)點(diǎn)和61個(gè)村居級(jí)節(jié)點(diǎn)作為農(nóng)村公路網(wǎng)節(jié)點(diǎn)。節(jié)點(diǎn)基礎(chǔ)數(shù)據(jù)儲(chǔ)存于Excel表,選擇其中的人口、農(nóng)業(yè)產(chǎn)值、鎮(zhèn)街工業(yè)產(chǎn)值、旅游景點(diǎn)、古村落和革命老區(qū)分布數(shù)量等數(shù)據(jù)計(jì)算出各節(jié)點(diǎn)重要度。根據(jù)節(jié)點(diǎn)重要度,通過(guò)節(jié)點(diǎn)層次劃分模塊程序,將節(jié)點(diǎn)劃分為非常重要、重要、較重要和一般4個(gè)層級(jí),各層節(jié)點(diǎn)數(shù)量分別為:1、3、4和57個(gè)。至此得到具有基礎(chǔ)數(shù)據(jù)、重要度和劃分層級(jí)的節(jié)點(diǎn)數(shù)據(jù)表。將數(shù)據(jù)表導(dǎo)入ArcGIS并創(chuàng)建點(diǎn)要素類(lèi)文件。因篇幅所限,部分節(jié)點(diǎn)運(yùn)算數(shù)據(jù)如表3所示。
在A(yíng)rcGIS中,檢查當(dāng)前地圖工作空間路徑無(wú)誤后,選擇菜單欄的“地理處理”——“Python”,打開(kāi)Python腳本執(zhí)行窗口。在窗口中加載將讀取節(jié)點(diǎn)要素類(lèi)字段數(shù)據(jù)、重要度最大樹(shù)求解和結(jié)果可視化等功能模塊整合為一體的腳本程序文檔并運(yùn)行。運(yùn)行約18 s后,程序和軟件生成并導(dǎo)入重要度最大樹(shù)線(xiàn)要素類(lèi)文件。最后根據(jù)節(jié)點(diǎn)和路線(xiàn)層級(jí)字段分類(lèi)顯示節(jié)點(diǎn)和路線(xiàn),得出如圖3所示布局結(jié)果。
由圖3可見(jiàn),求得的高明區(qū)農(nóng)村公路主骨架路網(wǎng)形式主要為:區(qū)內(nèi)4個(gè)重要鎮(zhèn)街由主要干道相互串連,其他節(jié)點(diǎn)路線(xiàn)主要匯聚于就近的重要鎮(zhèn)街節(jié)點(diǎn),再通過(guò)主要干道通往其他地方節(jié)點(diǎn)。其中,石水、明西、明東和南洲等村居節(jié)點(diǎn)分布有區(qū)內(nèi)重點(diǎn)旅游景點(diǎn)、農(nóng)業(yè)園區(qū)和革命老區(qū);因此,與鎮(zhèn)街節(jié)點(diǎn)連接的路線(xiàn)層級(jí)相應(yīng)提高,以滿(mǎn)足旅游、農(nóng)產(chǎn)品輸出或地方發(fā)展需求。求解結(jié)果符合當(dāng)?shù)厣鐣?huì)經(jīng)濟(jì)實(shí)際情況。
表3 高明區(qū)農(nóng)村公路節(jié)點(diǎn)重要度運(yùn)算表
圖3 高明區(qū)農(nóng)村公路逐層展開(kāi)布局重要度最大樹(shù)
本文首先分析節(jié)點(diǎn)重要度法求解農(nóng)村公路布局重要度最大樹(shù)的基本思路和原理方法。然后在理論分析基礎(chǔ)上,提出通過(guò)ArcPy編寫(xiě)腳本程序求解農(nóng)村公路網(wǎng)重要度最大樹(shù)和可視化的方法。最后結(jié)合實(shí)例分析,驗(yàn)證方法可行性。結(jié)果表明,該方法可快速求得路網(wǎng)重要度最大樹(shù),并通過(guò)生成輸出的ArcGIS線(xiàn)要素類(lèi)文件可視化呈現(xiàn)結(jié)果。
求得重要度最大樹(shù)只是農(nóng)村公路網(wǎng)規(guī)劃布局的重要環(huán)節(jié)之一,要獲得路網(wǎng)規(guī)劃布局初步方案,還需要結(jié)合現(xiàn)狀路網(wǎng)、高快速路和普通干線(xiàn)公路規(guī)劃路網(wǎng)、地形地物、土地利用、區(qū)域城市和交通發(fā)展趨勢(shì)與戰(zhàn)略等等因素綜合考慮,在重要度最大樹(shù)主骨架基礎(chǔ)上進(jìn)一步深化路線(xiàn)布局。
廣東交通職業(yè)技術(shù)學(xué)院學(xué)報(bào)2020年2期