LS因子计算代码(IDL)

本文提供了使用IDL编程语言计算LS因子的详细代码,包括坡度、汇水面积、流向的计算,以及如何构建渠道网络。通过这些步骤,可以对DEM数据进行处理,得出地形的LS因素,用于水文学和地貌分析。
摘要由CSDN通过智能技术生成

LS因子计算代码(IDL)

;*****************************************坡度、汇水面积、流向
function downslope,DEM,cellSize,size1
slopeang=FLTARR(size1[0]+4,size1[1]+4)
celllen=FLTARR(size1[0]+4,size1[1]+4)
outflow=FLTARR(size1[0]+4,size1[1]+4)
slope=FLTARR(3,size1[0]+4,size1[1]+4)
; inflow=outflow
cols =size1[0]+4
rows=size1[1]+4
diagCellSize = cellSize
sqrt(2)
; cellSize_data=[[1/(sqrt(2)*cellSize),1/cellSize,1/(sqrt(2)*cellSize)],[1/cellSize,1/cellSize,1/cellSize],[1/(sqrt(2)*cellSize),1/cellSize,1/(sqrt(2)*cellSize)]]
for i=2,size1[1]+1 do begin
for j=2,size1[0]-1 do begin
flag=0

  bestCellLen = 0.0
  bestDirection =0.0
  bestAngle = 0.0
  angle = 0.0

  c = i * cols + j

  nw = c - cols - 1
  n = c - cols
  ne1 = c - cols + 1
  w = c - 1
  e = c + 1
  sw = c + cols - 1
  s = c + cols
  se = c + cols + 1

; window1=DEM[i-1:i+1,j-1:j+1]
; if (i eq 2 ) then begin
; window1[0,]=DEM[i,j]
; endif
; if (j eq 2 ) then begin
; window1[
,0]=DEM[i,j]
; endif
; if (i eq size1[0]-1 ) then begin
; window1[2,]=DEM[i,j]
; endif
; if (j eq size1[0]-1) then begin
; window1[
,2]=DEM[i,j]
; endif
;
; location=where(DEM eq DEM[i,j])
; ;print,location[0],c
; slope1=float(Atan(abs(-window1+DEM[i,j])cellSize_data)!RADEG)
; ;print,slope1
if (DEM[w] ne -9999 && DEM[w] lt DEM[c])then begin
if (outFlow[w] eq !E_value) then begin

    endif else begin
      angle =(Atan((abs(DEM[c] - DEM[w]) / cellSize)))*!RADEG
      ;print,angle,'W'
      if (angle gt bestAngle) then begin
        bestAngle = angle
        bestDirection = !W_value
        bestCellLen = cellSize
        flag =1
      endif
      if (angle eq 0.0 && ~flag) then begin

        bestAngle = !MIN_SLOPE_value
        bestDirection = !W_value
        bestCellLen = cellSize
        flag = 1
      endif
    endelse
  endif
  if (DEM[nw] ne -9999 && DEM[nw] lt DEM[c])then begin
    if (outFlow[nw] eq !SE_value) then begin

    endif else begin
        angle =(Atan((abs(DEM[c] - DEM[nw]) / diagCellSize)))*!RADEG

;print,angle,‘nW’
if (angle gt bestAngle) then begin
bestAngle = angle
bestDirection = !nw_value
bestCellLen = diagCellSize
flag =1
endif
if (angle eq 0.0 && ~flag) then begin

        bestAngle =  !MIN_SLOPE_value;
        bestDirection = !nw_value
        bestCellLen = diagCellSize;
        flag = 1
      endif
    endelse
  endif
  if (DEM[n] ne -9999 && DEM[n] lt DEM[c])then begin
    if (outFlow[n] eq !S_value) then begin;防对流,

    endif else begin
      angle =(Atan(abs(DEM[c] - DEM[n]) / cellSize))*!RADEG
       ;print,angle,'n'
      if (angle gt bestAngle) then begin
        bestAngle = angle
        bestDirection = !n_value
        bestCellLen = cellSize
        flag =1
      endif
      if (angle eq 0.0 && ~flag) then begin

        bestAngle = !MIN_SLOPE_value
        bestDirection = !n_value
        bestCellLen = cellSize
        flag = 1
      endif
    endelse
  endif
  if (DEM[ne1] ne -9999 && DEM[ne1] lt DEM[c])then begin
    if (outFlow[ne1] eq !SE_value) then begin

    endif else begin
       angle =(Atan(abs(DEM[c] - DEM[ne1]) /  diagCellSize ))*!RADEG
        ;print,angle,'nW'
      if (angle gt bestAngle) then begin
        bestAngle = angle
        bestDirection = !ne_value
        bestCellLen =  diagCellSize
        flag =1
      endif
      if (angle eq 0.0 && ~flag) then begin

        bestAngle =  !MIN_SLOPE_value;
        bestDirection = !ne_value
        bestCellLen = diagCellSize;
        flag = 1
      endif
    endelse
  endif
  if (DEM[e] ne -9999 && DEM[e] lt DEM[c])then begin
    ;  if (outFlow[e] eq !S_value) then begin
    ;
    ;  endif else begin
    angle =(Atan(abs(DEM[c] - DEM[e]) / cellSize)*!RADEG)
    if (angle gt bestAngle) then begin
      bestAngle = angle
      bestDirection = !e_value
      bestCellLen = cellSize
      flag =1
    endif
    if (angle eq 0.0 && ~flag) then begin

      bestAngle = !MIN_SLOPE_value
      bestDirection = !e_value
      bestCellLen = cellSize
      flag = 1
    endif
    ;endelse
  endif
  if (DEM[se] ne -9999 && DEM[se] lt DEM[c])then begin
    ;  if (outFlow[se] eq !SE_value) then begin
    ;
    ;  endif else begin
     angle =(Atan(abs(DEM[c] - DEM[se]) /  diagCellSize )*!RADEG)
    if (angle gt bestAngle) then begin
      bestAngle = angle
      bestDirection = !Se_value
      bestCellLen =  diagCellSize
      flag =1
    endif
    if (angle eq 0.0 && ~flag) then begin

      bestAngle =  !MIN_SLOPE_value;
      bestDirection = !Se_value
      bestCellLen = diagCellSize;
      flag = 1
    endif

; ;endelse
endif
if (DEM[s] ne -9999 && DEM[s] lt DEM[c])then begin
; if (outFlow[e] eq !S_value) then begin
;
; endif else begin
angle =(Atan(abs(

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值