摘要:水文分析實戰教程河流平均比降計算本章導讀河流比降指的是河流任意兩端點間的高程差與兩點間的水平距離之比值,簡單的概括為單位河長內的落差,其單位一般都是。讀者可以參考水文分析實戰教程河流提取與河網分級的做法去提取。
ArcGIS水文分析實戰教程(10)河流平均比降計算
河流比降本章導讀:河流比降指的是河流任意兩端點間的高程差與兩點間的水平距離之比值,簡單的概括為單位河長內的落差,其單位一般都是‰ 。 河流(縱)比降對地質災害、水運、水電、礦砂和新構造運動研究有實用價值。比降是水文學上重要的一項指標。在絕大部分的GIS通用平臺上,都沒有實現平均比降的計算,原因在于計算比降的條件比較苛刻,不符合通用GIS的要求。本章同樣是一個實操章節,筆者將會利用ArcGIS軟件,結合其ArcPy編寫一個平均比降計算的工具,在通用GIS軟件上實現河流平均比降計算。 BY 李遠祥
河流比降是很多水文研究者研究的內容,其水文意義非常的大。這里研究的河流比降指的是河流的縱比降,是河流任意兩端點間的高程差與兩點間的水平距離之比值,即單位河長的落差。
正是因為直接表達的是單位河長的落差,所以在水文學上其最直接的影響就是流速,帶來更多的水動力引發的能量轉移,如勢能與動能的轉化(涉及到水電站的建設);河水對河床和河岸的沖刷,影響泥沙量;大面積持續降雨時,洪峰到來的時間和強度等。所以,比降在水文學上從來就不缺少話題。
河流的比降分為床面比降和水面比降。床面比降,用以表示河床縱斷面地形的變化;水面比降即河流中任意兩端點間的瞬時水面高程差與其相應水平距離之比,用以表明河流全程或分段的水面坡度,故又稱水力坡度,通常說的河流比降就是河流水面比降。
在恒定均勻流情況下,水面坡度恰好等于河底坡度。所以,在沒有大量斷面數據支撐的情況下,根據地形和河流線型去研究的河流比降都是床面比降。
筆者在這里研究的都是床面比降,因為只考慮地形與河流本身的幾何形狀,沒有任何的站點數據支撐。但在非洪水情況下,這個床面比降與水面比降基本上是吻合的。
在河流相距較短的兩個點上計算河流比降,意義不是十分大。一般需要計算的是整個河流或者某一河段的平均比降,這對于空間跨度較大的河流來說才有研究價值。
本章研究的內容也就是河流(段)的平均比降。研究河流平均比降的方法有幾種,比較流行的是【約翰斯通-克羅斯】法。其原理是根據比降大致均勻的原則,將河段劃分為若干個子河段,然后去計算整體的平均比降。其公式如下:
公式中個參數如下
S---- 河段平均河底比降
Li----第i個子河段長度
Si----第i個子河段河底比降
N---- 子河段數量
另一種方法是【勞倫斯】法,其需要經驗系數和流速,相對來說比較復雜,需要結合測站的一些數據。由于筆者沒有這些數據,就不作論述。
河流比降與GIS的關系本章考慮的是在ArcGIS中實現【約翰斯通-克羅斯】法的計算。
利用GIS手段來研究水文,其核心方式是使用DEM數據去模擬水文過程。GIS的空間疊加能力非常的管用,非常簡單的就能獲取到河流線對應的DEM像元值,也就是河流對應的高程值,這樣用于計算比降是非常有用的。最起碼解決了河流高程點獲取的問題。
河流沿線高程的獲取,不能直接使用原始的DEM數據。原因有兩點:
如果河流數據與DEM數據不是同一份數據,那么像元點與河流線的重合程度有待商榷。
如果河流數據與DEM數據吻合(或者河流數據直接從DEM數據提取出來的),其高程的獲取所依賴的DEM必須是填洼后的無凹陷點DEM。
河流線屬于一維數據,DEM在平面上屬于二維數據,其相交之后會產生一個像元點的連續像元。如果了解過D8單流向算法的話,就可以很容易理解,如果直接從原始DEM中獲取像元值,其值有可能是一個匯點(凹陷點)。然而使用填洼后的DEM,可以確保該點與周邊一點的高程持平。
下圖是一個測試數據,黃色部分為河流線,點為河流的節點。包含兩份DEM,一份是原始的DEM,一份是填洼過的DEM(Fill_DEM) 。河流是使用了前面章節介紹到的河流提取方法提取出來的線狀河流。讀者可以參考《ArcGIS水文分析實戰教程(6)河流提取與河網分級》的做法去提取。
測試的主要內容是分兩種情況打印河流各節點的高程值。一是獲取原始DEM的高程值,而是獲取填洼后的DEM的高程值。通過高程值進行對比選用不同數據引起的差異。
第一張圖是原始DEM的沿河高程值,第二張圖是填洼后的DEM的沿河高程值。可以看到使用原始DEM的時候,有可能出現下游高程比上游高程還要高的情況,也就是說這個上游地勢低的點剛好就是一個匯(凹陷點)。而填洼后的DEM則會將這個點給填平,確保不會斷流,從而使得下游高程最少不會高于上游高程。對比其他高程值,是沒有變化的,變化的部分就只是出現【匯】的點。
如果原始DEM的精度足夠高的話,這種情況一般很少碰到。但為了穩妥起見,筆者還是建議對原始DEM做填洼,生成無凹陷點的DEM。讀者可以參考之前章節 《ArcGIS水文分析實戰教程(4)地形預處理》
如果所使用的河流是從DEM中提取出來的,那么在矢量河流提取的時候使用【柵格河流矢量化】時是否需要使用【簡化折線】參數,這個參數是默認選上的,如下圖所示:
不選擇簡化折線,河流線會基本上就是按照流量線走向,河流折點密度會比較高;選擇簡化的話,河流線的折點會被抽希一部分。這個怎么取舍?如果在地形變化比較大的情況下,不建議簡化;如果地勢趨平,那就直接簡化線。這種方式會直接影響到最終的比降數值。
下圖黃線部分是簡化節點后的河流線,紅線是沒有簡化節點的河流線,其形狀基本上是重合的,而且在關鍵的河流節點上,也是完全重合。
也就是說,簡化與不簡化,其參與計算的河段數量是不一樣的。上圖數據中簡化后的子河段數為32,不簡化子河段的數量是92 。如果人為計算的話,那么可定是后者的計算量比較大了。
ArcGIS中實現河流平均比降計算ArcGIS 除了前面章節提及到的水文分析工具及其相關工具之外,還有非常龐大的工具集對空間計算進行支撐。由于沒有斷面數據的支撐,這里只考慮通過地形和河流線型進行計算,也就是說實現【約翰斯通-克羅斯】法。
根據【約翰斯通-克羅斯】法的計算公式,可以推導出其分析流程
通過河流線提取河流折點,利用這些折點與DEM數據疊加,獲取高程值
利用河流折點,獲取其坐標值,根據兩點距離公式,計算每一段子河段的長度
根據每個點的高程值,計算出相鄰兩點之間的高差
根據高差與子河段長度,計算出各子河段的河底比降
匯總這些數據計算出整個河段的平均河底比降
在這5各步驟中,只有第1步與ArcGIS工具有關。河流的折點提取,可以使用【數據管理】--【要素】--【要素折點轉點】工具來實現,如下圖所示:
至于利用折點與DEM數據疊加,獲取其高程值,可以使用【數據管理】--【柵格】--【柵格屬性】--【獲取像元值】工具來獲取。這個工具每次只能實現一個坐標點與DEM數據疊加查詢。如下圖
所以,為了方便計算,筆者采用ArcPy去寫一個腳本工具,實現參數的靈活輸入。其中heightList就是用來保存高程值的數組。
# 獲取河流的節點,以用作計算高差和河長 for row in arcpy.da.SearchCursor(outLine1, ["SHAPE@XY"]): # 從點圖層數據獲取所有的點的XY x, y = row[0] #從地形數據中獲取其高程的象元值 pointStr = str(x) +" "+str(y) result = arcpy.GetCellValue_management(dem,pointStr) riverPoints.append(row[0]) heightList.append(str(result))
第2-5步基本上就是一些數學的運算,利用python就很好實現了。為了讓廣大水文研究者用起來,筆者將這段代碼公開,并且制作成為工具。在代碼中筆者已經預留了ArcGIS的工具參數,方便制作成為腳本工具。
河流平均比降【約翰斯通-克羅斯】法的實現代碼如下
############################################################# # # # 該工具利用【約翰斯通-克羅斯】方法計算河底平均比降 # # 在使用的時候必須先選擇一條河流,工具會判斷輸入的河流數量 # # 大于一條河流時不予以計算 # # 用于計算的DEM為無凹陷點DEM # # BY 李遠祥 # # # ############################################################## # -*- coding: gbk -*- import arcpy import math inputLine =arcpy.GetParameterAsText(0) #河流圖層 dem = arcpy.GetParameterAsText(1) #無凹陷點DEM riverLen = 7873.232038 arcpy.AddMessage(u"..................") arcpy.AddMessage(u"......開始執行...........") # 記錄高程值的數據 heightList = [] iputCout=0 mmCursor = arcpy.da.SearchCursor(inputLine, ["SHAPE@LENGTH"]) for row1 in mmCursor: riverLen = row1[0] #順便獲取河流長度 iputCout=iputCout+1 arcpy.AddMessage(u"......獲取了河流長度......") #如果選中的是一個線要素,則執行計算,否者不計算多條河流 if iputCout==1: ##先將線轉為折點 outLine1 = arcpy.FeatureVerticesToPoints_management(inputLine, "in_memory/outline") arcpy.AddMessage(u"......河流線已經轉換為點集.......") #河流節點 riverPoints = [] # 獲取河流的節點,以用作計算高差和河長 for row in arcpy.da.SearchCursor(outLine1, ["SHAPE@XY"]): # 從點圖層數據獲取所有的點的XY x, y = row[0] #從地形數據中獲取其高程的象元值 pointStr = str(x) +" "+str(y) result = arcpy.GetCellValue_management(dem,pointStr) riverPoints.append(row[0]) heightList.append(str(result)) arcpy.AddMessage(u"......已經獲取了折點的高程值......") #子河段長度 subRiverList = [] hDiffList = [] # 計算每一個子河段的長度 for i in range(0,len(riverPoints)-1): x,y = riverPoints[i] x1,y1 = riverPoints[i+1] #計算河段長度 dis =math.sqrt(pow((x1-x),2)+pow((y1-y),2)) subRiverList.append(dis) arcpy.AddMessage(u"......河流子河段長度計算完成完成.......") # 計算從高程從低到高部分的差距 listLen = len(heightList) for j in range(0,listLen-1): h1 = float(heightList[j]) h2 = float(heightList[j+1]) xheight = 0 xheight = h1-h2 hDiffList.append(xheight) arcpy.AddMessage(u"......各折點的高程差計算完成......") # 計算每個河段的比降 subbijiang = [] for i in range(len(hDiffList)): Si= hDiffList[i]/subRiverList[i] subbijiang.append(Si) arcpy.AddMessage(u"......子河段比降計算完成......") # 計算最終的比降 # 計算分子 sumUp = 0 for i in range(len(hDiffList)-1): sumUp = sumUp + subRiverList[i]*pow(subbijiang[i],0.5) S = pow((sumUp/riverLen),2) arcpy.AddMessage(u"......該河流的總長為: " + str(riverLen)+u" 平均比降為: " +str(S)) arcpy.AddMessage(u"......計算完畢.......") else: arcpy.AddMessage(u"......您選中了 "+str(iputCout) + u" 條河流......") arcpy.AddMessage(u"......工具已經停止計算,沒有算出您想要的結果......") arcpy.AddMessage(u"......因為您目前選中了多條河流。只能選中一條河流進行計算!......")
從代碼中可以看到,這個工具針對的是一條河流進行計算的。如果想指定河流的某一段進行計算,那么就需要將河流轉為折點,選擇對應的折點,生成新的河段才能參與計算。這個過程需要用到【點集轉線】工具進行重構要分析的河段。
河流平均比降工具使用可以將上面的python代碼制作成為腳本工具,方便在ArcGIS中進行可視化的調用。工具的制作可以參考筆者另一篇博文《ArcMap自定義腳本工具制作》,里面有詳細的論述。
該工具用到的ArcGIS工具涉及到ArcInfo級別 和 Spatial 擴展模塊,請先確保ArcGIS軟件具備相應的授權。
制作好工具之后可以雙擊調用該工具了,【約翰斯通-克羅斯】法需要用到無凹陷點DEM和河流線型數據。
從上面代碼可以看到,工具會判斷選中的河流數量,如果數量大于1,就不作計算,確保計算的是某一河段。ArcGIS的交互性非常的優秀,只要選中某一條河流,就會將選中的部分作為參數輸入。
對應工具的流程,這里第一步需要選中要分析的一條河流。如下圖
接著雙擊調用工具,兩個參數分別是河流圖層和無凹陷點DEM。一定要注意,這個DEM是填洼過的DEM,不是原始DEM數據。如下圖
點擊確定就可以執行計算結果,結果會在最終的提示框中找到,如下圖所示:
至此,復雜的河流平均比降就計算完畢了!
總結水文分析是一個復雜的過程,需要有深厚的水文學基礎作為背景。而GIS是一個通用工具,提供非常龐大的分析功能。二者要結合起來,不但需要學習兩個專業的知識,還需要具備知識整合的能力。
代碼和制作ArcGIS工具的方法已經在文中貼出來了。讀者可以自行參考制作。當然想省事的話,筆者也已經上傳制作好的工具,可以點擊跳轉到 下載頁面 。為了加強交流,防止伸手,多動手操作,筆者已經將下載分值設置為最高分10分。 積分不夠的讀者請多動手制作 ^_^
如果讀者對水文分析感興趣的話,可以持續關注CSDN的GIS制圖樂園,以及微信公眾號【GIS制圖樂園】。BY 李遠祥
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40624.html
摘要:文章目錄一密度分析原理二點密度分析三線密度分析四核密度分析一密度分析原理密度分析是指根據輸入的要素數據集計算整個區域的數據聚集狀況,從而產生一個聯系的密度表面。 ...
摘要:使用柵格函數支持直接在前端使用柵格函數來重新渲染影像服務。針對數據在柵格函數模版編輯器中使用渲染地貌函數,并且設計好結果的渲染方式。配置柵格函數模版可以在兩種情況下進行。 ArcGIS 柵格函數在線調用詳解 導讀:ArcGIS從10.0版本開始引用鑲嵌數據集,并且第一次在影像中加入柵格函數(raster functions),使得影像的呈現和信息提取與GIS緊密的結合起來,簡單的影像功...
摘要:不建議底圖選擇中存在兩種不同坐標體系,如下圖坐標存在明顯的偏差,火星坐標在采用坐標系的地圖上位置偏上彩色中國天地圖全球衛星地圖例如我們使用的類進行查找,返回的數據都是國際坐標,因此必須進行偏差糾正。 ArcGIS for javascript開發心得 本次實例中采用ArcGIS for javascript3.24版本,由于版本3與4在API等存在較大區別,就不一一列舉,詳細區別看官方...
摘要:月日,在北京舉行的阿里云云數據庫智能未來大會上,阿里云高級產品專家王義成如是說。今天,阿里云發布了,,三款全新的數據庫,正式向開始融合。 摘要: 未來的某一天,量子數據庫是我們改造其他星球的關鍵技術之一。 1月17日,在北京舉行的阿里云2018云數據庫智能未來大會上,阿里云高級產品專家王義成如是說。 除了阿里云的全新一代NoSQL向NewSQL融合,NewSQL產品家族發布,在這場大會...
閱讀 4633·2021-10-25 09:48
閱讀 3214·2021-09-07 09:59
閱讀 2182·2021-09-06 15:01
閱讀 2695·2021-09-02 15:21
閱讀 2735·2019-08-30 14:14
閱讀 2188·2019-08-29 13:59
閱讀 2519·2019-08-29 11:02
閱讀 2537·2019-08-26 13:33