• 计算河流比降 ArcGIS脚本


    河流比降单条计算 课本定义法
    文献 参考 基于公共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'......因为您目前选中了多条河流。只能选中一条河流进行计算!......')
    
  • 相关阅读:
    luogu P1768 天路
    [NOIP2008]双栈排序
    逆元板子集
    [NOIP2015]子串
    [USACO17JAN]Subsequence Reversal
    [NOIP2011] 聪明的质监员
    POJ2987 Firing
    2018.10.20模拟总结
    POJ3469 Dual Core CPU
    真实道路中,如何倒车、侧方停车 哪里是圆心就往哪边大方向 倒车实际是以圆心 画圆后轮进库看左右镜子 别剐蹭
  • 原文地址:https://www.cnblogs.com/hustshu/p/16168372.html
Copyright © 2020-2023  润新知