河流比降单条计算 课本定义法
文献 参考 基于公共DEM的平原湖泊流域特征提取研究及应用_周星.pdf
输入
河流——要素图层
DEM——栅格图层
#############################################################
# #
# 该工具利用【约翰斯通-克罗斯】方法计算河底平均比降 #
# 在使用的时候必须先选择一条河流,工具会判断输入的河流数量 #
# 大于一条河流时不予以计算 #
# 用于计算的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)
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(float(str(result)))
hmin = min(heightList)
hmax = max(heightList)
arcpy.AddMessage(u'......已经获取了折点的高程值......' + str(heightList))
#子河段长度
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'......河流子河段长度计算完成完成.......长度为:' + str(subRiverList))
zz_list = []
ll_list = []
zzl_list = []
for i in range(0, len(riverPoints)-2):
zz = float(heightList[i]) + float(heightList[i + 1])
zz_list.append(zz)
ll = subRiverList[i]
ll_list.append(ll)
for i in range(0, len(riverPoints)-2):
zzl = zz_list[i] * ll_list[i]
zzl_list.append(zzl)
S =(sum(zzl_list)-2 * hmin * riverLen) / (riverLen * riverLen)
S =round(S, 5)
arcpy.AddMessage(u'......该河流的总长为: ' + str(riverLen)+u' 平均比降为: ' +str(S))
arcpy.AddMessage(u'......计算完毕.......')
else:
arcpy.AddMessage(u'......您选中了 '+str(iputCout) + u' 条河流......')
arcpy.AddMessage(u'......工具已经停止计算,没有算出您想要的结果......')
arcpy.AddMessage(u'......因为您目前选中了多条河流。只能选中一条河流进行计算!......')