IDL开发(一)——水体营养指数

IDL开发——水体营养指数


前言

利用IDL实现水质评价,包括:叶绿素浓度的反演、悬浮物浓度、总磷浓度、总氮浓度、高猛酸盐浓度的反演,将反演后的叶绿素 a 浓度、高锰酸盐浓度、总磷浓度、总氮浓度和透明度 5 个指标进行营养状态指数计算。
参考文献:谭小琴,罗勇,赵铮,甘先霞,张洪吉,陈建华.基于高分遥感的河流水质反演研究——以金马河温江段为例[J].环境生态学,2020,2(07):29-36.


一、实现功能

输入叶绿素浓度、悬浮物浓度文件,自动计算总磷浓度、总氮浓度、高猛酸盐浓度的反演,将反演后的叶绿素 a 浓度、高锰酸盐浓度、总磷浓度、总氮浓度和透明度 5 个指标进行营养状态指数计算。最后按照营养状态分级显示水质评价结果
在这里插入图片描述

二、IDL代码

1.主窗体

在主窗体中写明各base成分,标注event。

wButton3 = WIDGET_BUTTON(wtemp3, value = '水质评价', event_pro = 'TLI')

2.TLI event事件代码

pro TLI,ev
  COMPILE_OPT IDL2
  ENVI,/RESTORE_BASE_SAVE_FILES
  ENVI_Batch_init

  filename=ENVI_PICKFILE(title='请输入叶绿素a浓度文件',filter='*.tif')
  ENVI_OPEN_FILE,filename,r_fid=fid,/no_realize
  ENVI_FILE_QUERY,fid,ns = numSample,nl = numLine,nb = numBand,$
    data_type=dataType,dims = dims
    
  filename2=ENVI_PICKFILE(title='请输入悬浮物浓度文件',filter='*.tif')
  ENVI_OPEN_FILE,filename2,r_fid=fid2,/no_realize
  ENVI_FILE_QUERY,fid2,ns = numSample,nl = numLine,nb = numBand,$
    data_type=dataType,dims = dims2

  mapInfo = ENVI_GET_MAP_INFO(FID=fid)
  imageData = FLTARR(numSample,numLine,numBand)
  
  imageData[*,*,0] = ENVI_GET_DATA(fid = fid,dims = dims,pos = 0)
  imageData_SS = FLTARR(numSample,numLine,numBand)
  imageData_SS[*,*,0] = ENVI_GET_DATA(fid = fid2,dims = dims,pos = 0)
  ;****************************************计算各个指数*******************
  TP1= FLTARR(numSample,numLine,1)
 ; imageData[*,*,0] = ENVI_GET_DATA(fid = fid,dims = dims,pos = 0)
  TP1 = (-0.00078)*float(imageData[*,*,0]*1.0)+0.0417
  ;*********************************************************************
  TN1= FLTARR(numSample,numLine,1)
  ;imageData[*,*,0] = ENVI_GET_DATA(fid = fid,dims = dims,pos = 0)
  TN1 = 3.166-0.03479*float(imageData[*,*,0]*1.0)
  ;*********************************************************************
  CODmn1= FLTARR(numSample,numLine,1)
  ;imageData[*,*,0] = ENVI_GET_DATA(fid = fid,dims = dims,pos = 0)
  CODmn1 = 0.050*float(imageData[*,*,0]*1.0)+4.543
  ;*********************************************************************
  TLI_Chla= FLTARR(numSample,numLine,1)
  TLI_CODMn= FLTARR(numSample,numLine,1)
  TLI_TP= FLTARR(numSample,numLine,1)
  TLI_TN= FLTARR(numSample,numLine,1)
  TLI_SD= FLTARR(numSample,numLine,1)
  TLI1=FLTARR(numSample,numLine,1)
  TLI_PLOT=BYTARR(numSample,numLine,1)
  TLI_Chla= 10*(2.5+1.086*alog(float(imageData[*,*,0]*1.0)))
  TLI_CODMn= 10*(2.5+1.086*alog(float(CODmn1)))
  TLI_TP= 10*(9.436+1.624*alog(float(TP1)))
  TLI_TN= 10*(5.453+1.694*alog(float(TN1)))
  TLI_SD= 10*(5.118-1.94*alog(imageData_SS[*,*,0]*1.0))
  
  TLI1=0.2662*FLOAT(TLI_Chla)+0.1878*FLOAT(TLI_CODMn)+0.1790*FLOAT(TLI_TP)+0.1834*FLOAT(TLI_TN)+0.1834*FLOAT(TLI_SD)

  max_v=max(TLI1)
  print,max_v
  dst=[[0.0,30.0,50,50,75],$
    [30.0,50,175,175,50],$
    [50.0,60.0,150,200,50],$
    [60.0,70.0,75,200,25],$
    [70.0,max_v,0,175,0]]
    
    
    
   ;**************************************************密度分割****************************************************
   
    
   sz2=size(dst)
   n_ds=sz2[2]

   sz=size(TLI1)
   ns=sz[1]&nl=sz[2]
   result_r=bytarr(ns,nl)
   result_g=bytarr(ns,nl)
   result_b=bytarr(ns,nl)

   ;密度分割
   for i=0,n_ds-1 do begin
     w=where(TLI1 gt dst[0,i] and TLI1 le dst[1,i],count)
     if count gt 0 then begin
       result_r[w]=dst[2,i]
       result_g[w]=dst[3,i]
       result_b[w]=dst[4,i]
     endif
   endfor

   tli_outmap=bytarr(3,ns,nl)
   tli_outmap[0,*,*]=result_r
   tli_outmap[1,*,*]=result_g
   tli_outmap[2,*,*]=result_b

    ;tli_outmap=density_slice(TLI1,dst)
    sz3=size(tli_outmap)
    ns3=sz3[2] & nl3=sz3[3]
 
  W1=window(window_title='水体营养状态分级',dimension=[numSample,numLine*1.25])
  ;i1=image(TLI_PLOT,/current,dimension=[numSample,numLine],$
  i1=image(tli_outmap,dimension=[ns3,nl3],margin=0,window_title='TLI Level',position=[0,0.2,1,1],/order)
   ;tickname=[dst[0,0],transpose(dst[1,*])]
   ;tickname=string(tickname,format='(f6.2)') 
   tickname=['Level 1:0','Level 2:30','Level 3:50','Level 4:60','Level 5:70']
   tab_dst=dst[2:4,*]
  c1=colorbar(position=[0.05,0.1,0.95,0.15],title='TLI',$
   rgb_table=tab_dst,tickname=tickname,taper=0,/border)

  DELVAR,imageData

  o_file=dialog_pickfile(title='图像文件保存为')
  write_image,o_file,'tiff',TLI1
  
end
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值