資源簡(jiǎn)介
利用ArcGIS計(jì)算河流的平均比降。參考的方法是【約翰斯通-克羅斯】法

代碼片段和文件信息
#############################################################
#???????????????????????????????????????????????????????????#
#???該工具利用【約翰斯通-克羅斯】方法計(jì)算河底平均比降???????????#
#???在使用的時(shí)候必須先選擇一條河流,工具會(huì)判斷輸入的河流數(shù)量?????#
#???大于一條河流時(shí)不予以計(jì)算??????????????????????????????????#
#???用于計(jì)算的DEM為無(wú)凹陷點(diǎn)DEM????????????????????????????????#
#???????????????????????????????????????????????????????????#
#############################################################
#?-*-?coding:?gbk?-*-
import?arcpy
import?math
inputLine?=arcpy.GetParameterAsText(0)?#河流圖層
dem?=?arcpy.GetParameterAsText(1)?#無(wú)凹陷點(diǎn)DEM
riverLen?=?7873.232038
arcpy.AddMessage(u‘..................‘)
arcpy.AddMessage(u‘......開(kāi)始執(zhí)行...........‘)
#?記錄高程值的數(shù)據(jù)
heightList?=?[]
iputCout=0
mmCursor?=?arcpy.da.SearchCursor(inputLine?[“SHAPE@LENGTH“])
for?row1?in?mmCursor:
????riverLen?=?row1[0]??????#順便獲取河流長(zhǎng)度
????iputCout=iputCout+1
arcpy.AddMessage(u‘......獲取了河流長(zhǎng)度......‘)
#如果選中的是一個(gè)線要素,則執(zhí)行計(jì)算,否者不計(jì)算多條河流
if?iputCout==1:
????##先將線轉(zhuǎn)為折點(diǎn)
????outLine1?=?arcpy.FeatureVerticesToPoints_management(inputLine?“in_memory/outline“)
????arcpy.AddMessage(u‘......河流線已經(jīng)轉(zhuǎn)換為點(diǎn)集.......‘)
????#河流節(jié)點(diǎn)
????riverPoints?=?[]
????#?獲取河流的節(jié)點(diǎn),以用作計(jì)算高差和河長(zhǎng)
????for?row?in?arcpy.da.SearchCursor(outLine1?[“SHAPE@XY“]):
????????#?從點(diǎn)圖層數(shù)據(jù)獲取所有的點(diǎn)的XY
????????x?y?=?row[0]
????????#從地形數(shù)據(jù)中獲取其高程的象元值
????????pointStr?=?str(x)?+“?“+str(y)
????????result?=?arcpy.GetCellValue_management(dempointStr)
????????#print?“point??“+?str(vetPointL)??+?“?Height?value?is?:?“?+?str(result)
????????riverPoints.append(row[0])
????????heightList.append(str(result))
????arcpy.AddMessage(u‘......已經(jīng)獲取了折點(diǎn)的高程值......‘)
????#子河段長(zhǎng)度
????subRiverList?=?[]
????hDiffList?=?[]
????#?計(jì)算每一個(gè)子河段的長(zhǎng)度
????for?i?in?range(0len(riverPoints)-1):
????????xy?=?riverPoints[i]
????????x1y1?=?riverPoints[i+1]
????????#計(jì)算河段長(zhǎng)度
????????dis?=math.sqrt(pow((x1-x)2)+pow((y1-y)2))
????????subRiverList.append(dis)
????arcpy.AddMessage(u‘......河流子河段長(zhǎng)度計(jì)算完成完成.......‘)
????#?計(jì)算從高程從低到高部分的差距
????listLen?=?len(heightList)
????for?j?in?range(0listLen-1):
????????h1?=?float(heightList[j])
????????h2?=?float(heightList[j+1])
????????xheight?=?0
????????xheight?=?h1-h2
????????hDiffList.append(xheight)
????arcpy.AddMessage(u‘......各折點(diǎn)的高程差計(jì)算完成......‘)
????#?計(jì)算每個(gè)河段的比降
????subbijiang?=?[]
????for?i?in?range(len(hDiffList)):
????????Si=?hDiffList[i]/subRiverList[i]
????????subbijiang.append(Si)
????arcpy.AddMessage(u‘......子河段比降計(jì)算完成......‘)
????#?計(jì)算最終的比降
????#?計(jì)算分子
????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‘......該河流的總長(zhǎng)為:?‘?+?str(riverLen)+u‘???平均比降為:?‘?+str(S))
????arcpy.AddMessage(u‘......計(jì)算完畢.......‘)
else:
????arcpy.AddMessage(u‘......您選中了?‘+str(iputCout)?+??u‘??條河流......‘)
????arcpy.AddMessage(u‘......工具已經(jīng)停止計(jì)算沒(méi)有算出您想要的結(jié)果......‘)
????arcpy.AddMessage(u‘......因?yàn)槟壳斑x中了多條河流。只能選中一條河流進(jìn)行計(jì)算!......‘)
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2017-07-11?16:49??河流平均比降計(jì)算工具BY李遠(yuǎn)祥\
?????文件???????12800??2017-07-11?16:47??河流平均比降計(jì)算工具BY李遠(yuǎn)祥\平均比降計(jì)算工具By李遠(yuǎn)祥.tbx
?????文件????????3751??2017-07-11?14:01??河流平均比降計(jì)算工具BY李遠(yuǎn)祥\比降計(jì)算腳本.py
評(píng)論
共有 條評(píng)論