武玉峰
(遼寧省水利水電科學研究院,遼寧 沈陽 110003)
基于向量的河流岸別判定方法
武玉峰
(遼寧省水利水電科學研究院,遼寧 沈陽 110003)
岸別是河流普查中的一項重要內(nèi)容,在河流普查中,往往有上千條河,如果采用傳統(tǒng)方法去判別不僅費時費力而且很容易出錯?;谶@種需求,在已知河流流向的情況下,利用干流和支流的向量積并通過 ArcPy編程來進行河流岸別的判斷。該方法在遼寧省河流普查中得到了應(yīng)用,并取得了很好的效果。
河網(wǎng);岸別;向量;有向圖;拓撲檢查;Arcpy
河流湖泊情況是國家基本國情資料,屬于重要的基本國情信息。在第一次全國水利普查中對全國河湖基本情況進行了一次大范圍的普查,如果依靠傳統(tǒng)手段,這幾乎是不可能完成的任務(wù),但是隨著信息技術(shù)和空間技術(shù)的飛速發(fā)展,在此次普查中應(yīng)用了很多遙感、地理信息等高新技術(shù),使得這次普查任務(wù)能夠順利完成。
遼寧省在此次普查中,摸清了流域面積為50km2以上河流的基本情況,填補了遼寧省基本國情信息體系中河湖信息的空白,對于經(jīng)濟社會發(fā)展具有十分重要的意義。在此基礎(chǔ)上遼寧省又進行了10km2以上河流的普查。
岸別是河流普查中的一項重要內(nèi)容,普查中對岸別的定義為:本級河流位于上級河流的左岸或右岸。傳統(tǒng)的河流岸別判定方法是采用人工判定,即面向水流的方向,左手邊的岸為左岸,右手邊的岸為右岸。這種方法對數(shù)量較少的河網(wǎng)是可行的,但是在河流普查中,往往有上千條河,如果仍然采用這種傳統(tǒng)方法去判別不僅費時費力而且很容易出錯?;谶@種需求,在已知河流流向的情況下,利用干流和支流的向量積并通過ArcPy編程來進行河流岸別的判斷。
遼寧省流域水系劃分為三大流域七大水系。三大流域分別為遼河流域、黑龍江流域和海河流域。經(jīng)過第一次全國水利普查,全省流域面積大于等于50km2以上的河流共 854條。按河流類型分為三類,山地河流787條,平原河流57條,混合河流1條。按流域面積劃分為三類,大型河流16條(流域面積大于5000km2),中型河流32條(流域面積為1000~5000km2),小型河流74條(流域面積 100~1000km2)。在第一次全國水利普查成果的基礎(chǔ)上,遼寧省對流域面積為10~50km2河流做了進一步普查。
在數(shù)學中,向量是一個具有大小和方向的幾何對象,通常它可以形象的用一條帶箭頭的線段來表示,箭頭所指的方向即為向量的方向,箭頭一端的點是向量的終點,另一端是向量的起點,線段的長度表示向量的大小。在一個向量空間中定義了很多運算,其中,向量積又稱為叉積、矢量積,是本文中用到的運算。向量積定義:的向量積為的方向既垂直于又垂直于指向符合右手規(guī)則。當位于的不同側(cè)時,向量積的方向相反,如下圖所示。
對于二維向量,向量積的坐標表達式為:
其中標量ax×by-ay×bx即代表了向量積的方向。我們用代表干流的方向,用代表支流的方向。的方向即可表示支流位于干流的哪一側(cè)。
圖1 二維向量的向量積圖
從 DEM中提取到河網(wǎng)矢量數(shù)據(jù)后,經(jīng)過拓撲檢查無數(shù)據(jù)錯誤,對原始河網(wǎng)進行簡化,將簡化后的河網(wǎng)抽象為有向圖這種邏輯結(jié)構(gòu),并以鏈表的形式將抽象后的圖存儲在內(nèi)存中,最后通過廣度優(yōu)先搜索算法從代表 0級河流的節(jié)點開始遍歷內(nèi)存中的河網(wǎng),在遍歷過程中就可計算出每條河的岸別。
4.1 河網(wǎng)矢量數(shù)據(jù)的提取
DEM(Digital Elevation Model數(shù)字高程模型),包含了豐富的高程信息,從DEM中提取河網(wǎng)的方法已有相當多的國內(nèi)外文獻和資料,也有很多的軟件工具可以使用,例如A rcGis的Hydrology Model(水文分析模塊)、ArcSWAT、River Tools等,無論使用什么工具和方法最終都可從 DEM中提取的河網(wǎng)的矢量數(shù)據(jù),詳細過程本文在這里不再贅述。
4.2 數(shù)據(jù)拓撲檢查
因為河網(wǎng)是從 DEM中自動提取的,由于計算誤差,數(shù)據(jù)誤差以及閾值設(shè)置等因素的影響,不可避免的會有一些錯誤,同時為了與已有的 50km2以上河流數(shù)據(jù)無縫對接,以及保證后面計算結(jié)果的正確,必須利用 arcgis的拓撲工具對這些錯誤進行檢查和修復(fù),為此必須將河網(wǎng)矢量數(shù)據(jù)以數(shù)據(jù)集的形式存儲在Arcgis的Geodatabase中,這樣才可以使用arcgis的拓撲工具。
拓撲工具主要檢查違反以下規(guī)則的數(shù)據(jù)錯誤。
(1)不能與其它要素相交:線不能與另一個圖層中的其它線相交或疊置。第一個圖層中任何與第二個圖層中的線疊置或相交的線都是錯誤的,如圖2.a所示。
(2)不能重疊:一個圖層中的線不能與同一圖層中的線重疊。任何重疊的線都是錯誤的,如圖2.b所示。
(3)不能相交:同一圖層中的線相互之間不能相交或疊置。任何與要素疊置的線或任何相交點都是錯誤的,如圖 2.c。
(4)不能自相交:一個圖層中的線要素不能自相交。任何存在自相交的點都是錯誤的,如圖2.d。
(5)不能自重疊:一個圖層中的線要素不能自疊置,任何存在要素自疊置的線都是錯誤的,如圖2.e。
(6)一個圖層中的線要素不能具有一個以上的構(gòu)成部分。任何具有超過一個構(gòu)成部分的線要素都是錯誤的,如圖 2.f。
圖2 檢查河網(wǎng)數(shù)據(jù)的拓撲規(guī)則圖
規(guī)則(1)用于檢查 10~50km2河流與50km2以上河流的無縫銜接。規(guī)則(2)、(3)、(4)、(5)、(6)則保證了10~50km2河流自身的拓撲正確性。
4.3 數(shù)據(jù)簡化
從DEM中提取出的干流和支流都是極不規(guī)則的曲線,兩條曲線交匯于一點,如果要直接在交匯點處找出能夠代表干流和支流方向的向量是很困難的,所以首先需要把河流的矢量數(shù)據(jù)進行簡化,簡化過程中還要保持干流和支流之間的拓撲關(guān)系。
這一操作可以通過arcgis toolbox的簡化線工具來完成,簡化采用POINT REMOVE算法,最大允許偏移量為 1000m,并勾選“解決拓撲錯誤”選項,圖 3即是簡化前后的撫順市劉家河水系。
4.4 構(gòu)建河網(wǎng)
通過以上步驟,我們已獲取到可以進行實際計算的數(shù)據(jù)。任何利用計算機進行的計算,首先必須要將數(shù)據(jù)載入內(nèi)存,為此必須構(gòu)建一個合理的數(shù)據(jù)結(jié)構(gòu)來存儲整個河網(wǎng),而且這種數(shù)據(jù)結(jié)構(gòu)不僅要存儲河網(wǎng)的基本信息還必須反映河網(wǎng)的拓撲關(guān)系。筆者經(jīng)過多番研究最終采用了“有向圖”這一數(shù)據(jù)結(jié)構(gòu),對河網(wǎng)進行了抽象。有向圖是圖論中的一個重要概念,它的定義如下。
圖3 簡化前后的水系圖
所謂有向圖D是一個有序?qū)Γ╒(D),A(D)),其中V(D)是一個非空有限集,V(D)中的元素稱為頂點,A(D)是由V(D)中的元素組成的一些有序?qū)?gòu)成,并且要求:①構(gòu)成有序?qū)Φ膬蓚€元素不同,②任何兩個有序?qū)Σ煌?。顯然A(D)是一個有限集。A(D)中的元素稱為弧。圖 4所示即為一個典型的有向圖。
圖4 有向圖
基于有向圖的概念,我們將河網(wǎng)的每條河作為有向圖中的一個頂點,河與河之間的上下級關(guān)系用弧來表示,即由下級河流指向上級河流,表示下級河流匯入上級河流。將圖3中的撫順劉家河水系抽象為有向圖如圖5所示。
圖5 用有向圖表示的河網(wǎng)圖
構(gòu)建河網(wǎng)時,從0級入海河流開始,利用空間關(guān)系找出匯入0級河流的一級河流,并與0級河流建立關(guān)系,然后從找到的一級河流開始,利用空間關(guān)系找出匯入一級河流的二級河流并建立關(guān)系,依次類推即可遍歷河網(wǎng)中所有的河流,從而建立虛擬河網(wǎng)。
需要注意的是平原區(qū)的河流,例如引水灌渠等,跨流域引水工程等破壞整個河網(wǎng)的拓撲有序性,因為這些河流數(shù)量較少,可以先從數(shù)據(jù)中排除這些河流再進行計算。
4.5 遞歸遍歷河網(wǎng)并計算岸別
因為在簡化時保留了干支流間的拓撲關(guān)系,所以簡化后的水系也保留了干支流的左右岸關(guān)系。從右側(cè)的簡化圖我們可以很容易的找到代表干支流方向的向量,即在交匯點處的干流線段和支流線段。如下圖 6所示。
圖6 參與計算的向量圖
簡化后的水系都為折線,而且干支流都在折線的節(jié)點處相交,現(xiàn)在我們只需從簡化后的干流的起點出發(fā),遍歷每一個節(jié)點,如果有支流在此節(jié)點匯入,就取出在此節(jié)點相交的兩條線段,并分別讀取干流線段終點坐標(ax1,ay1),干流線段起點坐標(ax2,ay2)、支流線段終點坐標(bx1, by1),支流線段起點坐標(bx2,by2),然后分別計算得干流線段的向量和支流線段的向量:
利用公式(1)計算向量積得:
若n>0則支流位于干流的右岸,若n<0則支流位于干流的左岸。
以上算法全部用Arcpy實現(xiàn),ArcPy是ESRI從ArcGIS 10開始在所有產(chǎn)品中集成的基于Python的站點包,完全代替了之前的ArcGIS VB Scriptmodule。站點包是 Python術(shù)語,表示將附加函數(shù)添加到Python的庫。ArcPy為用戶提供了使用Python語言操作所有地理處理工具(包括擴展模塊)的機會,并提供了多種有用的函數(shù)和類,以用于訪問和處理GIS數(shù)據(jù)。限于篇幅只列出關(guān)鍵代碼片段如下:
……………………………………………
a1=trunk.lastPoint.X-trunk.firstPoint.X
b1=trunk.lastPoint.Y-trunk.firstPoint.Y
a2=endPoint.X-startPoint.X
b2=endPoint.Y-startPoint.Y
#計算方向
n=a1*b2-a2*b1
if n>0:
direct=u“右岸”
else:
direct=u“左岸”
……………………………………………………
在實際編碼過程中,河流岸別是在構(gòu)建河網(wǎng)的過程中進行計算的,而不是在河網(wǎng)構(gòu)建完成后,再對河網(wǎng)進行遍歷,因為構(gòu)建河網(wǎng)的過程實際上就是一個廣度優(yōu)先的遍歷過程。
本文所述的河流岸別的判定是在計算機內(nèi)存中構(gòu)建的抽象河網(wǎng)的基礎(chǔ)上進行的,實際上基于這個抽象河網(wǎng)還可對河流級別、流域面積、彎曲系數(shù)、不均勻系數(shù)、形狀系數(shù)、平均寬度等流域特征參數(shù)進行計算。本算法大大提高了河網(wǎng)岸別判定的工作效率,以本次應(yīng)用研究區(qū)域為例,遼寧省10km2以上的河流約有3536條,利用本算法在普通PC上1分鐘內(nèi)即可完成所有河流岸別的判定,并且準確率達到100%,而且與已有的50 km2以上河流普查成果完全一致,如果采用人工判定,則至少需要一個工作日的時間,而且還不能保證數(shù)據(jù)的準確性。
[1]顧群.泰州市城市水系規(guī)劃河網(wǎng)數(shù)值計算研究[J].水利規(guī)劃與設(shè)計,2014(09).
[2]嚴鋒,郭玉法,劉波,陳斌.GIS技術(shù)在地下水資源研究中的應(yīng)用現(xiàn)狀及前景[J].水利技術(shù)監(jiān)督,2005(05).
[3]遼寧省水利廳.遼寧省水利基礎(chǔ)信息集[M].北京:中國水利水電出版社,2013.
[4]徐俊明.圖論[M].中國科學技術(shù)大學出版社,1998.
[5]嚴蔚敏.數(shù)據(jù)結(jié)構(gòu)[M].清華大學出版社,2007.
[6]朱嘉偉.渠江水系河網(wǎng)探究[J].水利規(guī)劃與設(shè)計,2011(02).
[7]國務(wù)院第一次全國水利普查領(lǐng)導(dǎo)小組辦公室.河湖基本情況普[M].北京:中國水利水電出版社,2010.
[8]陳俊明,林廣發(fā),楊志海,陳瀚閱.數(shù)字河網(wǎng)提取的影響參數(shù)優(yōu)化分析[J].地球信息科學學報,2011,13(01)
[9]董婷婷.基于DEM的清河流域大中小型河流特征值自動提?。跩].水利規(guī)劃與設(shè)計,2014(10).
TV21
:A
:1008-1305(2015)05-0049-04
10.3969/j.issn.1008-1305.2015.05.018
武玉峰(1979年—)男,碩士,工程師。