热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【IDL代码库】一个完整的ENVI扩展工具源码

以TVDIVTCI扩展工具为例,为广大遥感爱好者提供一个完整ENVIIDL二次开发示例,包括算法编写、数据分块处理、绘图、IDL界面搭建、事件响应和自定义ENVITask等内容。扩

以TVDI VTCI扩展工具为例,为广大遥感爱好者提供一个完整ENVI/IDL二次开发示例,包括算法编写、数据分块处理、绘图、IDL界面搭建、事件响应和自定义ENVITask等内容。

扩展工具见:http://blog.sina.com.cn/s/blog_764b1e9d0102y95q.html。

完整源码下载:https://pan.baidu.com/s/1REgEB0R3yWOeLIRASi44xg 提取码:cuk6

以下仅贴出关键代码,作者水平有限,难免有不足,还望指正。

;+

; :Author: Hanzt

; :Email: hanzt@esrichina.com.cn

; :Description

; 通过拟合干、湿边方程,求TVDI或VTCI指数

;-

;关键代码



查看代码


pro TVDItask, $
raster1=raster1, $
raster2=raster2, $
TVDI=TVDI, $
minimum=minimum, $
isRaster1Ref=isRaster1Ref, $
step=step, $
resampling=resampling, $
output_Raster=output_Raster,$
display=display
COMPILE_OPT idl2
e =envi(/current)

if raster1.uri eq raster2.uri then begin
void=DIALOG_MESSAGE('The input NDVI and LST raster must be different!',$
/info)
task=envitask('tvditask')
task.raster1=raster1
task.minimum=minimum
task.step=step
task.resampling=resampling
task.display=display
r=e.ui.selecttaskparameters(task)
if r eq 'OK' then task.execute else return
endif

if (TVDI eq 'TVDI') then TVDI=1 else TVDI=0

;初始化进度条
Channel = e.GetBroadcastChannel()
Abort = ENVIAbortable()
Start = ENVIStartMessage('TVDI-VTCI Task', Abort)
Channel.Broadcast, Start
Progress = ENVIProgressMessage('Executing...' , $
0, Abort)

;获取两景影像公共区域,并使得结果行列数完全一致
overLay=GetRasterOverlay( $
raster1, $
raster2, $
isRaster1Ref=isRaster1Ref,$
resampling=resampling)
if n_elements(overLay) ne 2 then return
if isRaster1Ref then refRaster=overLay[0] else refRaster=overLay[1]

;初始化一个浮点型Raster存储结果
rasternew=enviraster( $
uri=output_Raster, $
INHERITS_FROM=refRaster, $
INTERLEAVE='BSQ', $
DATA_TYPE=4)
IF overLay[0].metadata.HasTag('data ignore value') THEN $
dataIgnoreValue=overLay[0].metadata['data ignore value']
;设置分块大小
tileSize=[2048,2048]

tileSize[0] = overLay[0].ncolumns gt tileSize[0] ? tileSize[0] : overLay[0].ncolumns
tileSize[1] = overLay[0].nRows gt tileSize[1] ? tileSize[1] : overLay[0].nRows
xTiles=overLay[0].CreateTileIterator(tile_Size=tileSize)
yTiles =overLay[1].CreateTileIterator(tile_Size=tileSize)
x=!null
y=!null

;两次分块
;第一次获取参与拟合的NDVI和LST数组
;第二次分块计算TVDI或VTCI指数

;获取参与拟合的NDVI和LST数组
for i=0,xTiles.ntiles-1 do begin
percentProgress = Round(i* 100.0/(xTiles.ntile*2))
Progress.Percent = percentProgress
Channel.Broadcast, Progress
IF (Abort.Abort_Requested) THEN BEGIN
Finish = ENVIFinishMessage(Abort)
Channel.Broadcast, Finish
return
BREAK
ENDIF
xTmp=xTiles.next()
yTmp=yTiles.next()
x=[x,xTmp[0:*:step]]
y=[y,yTmp[0:*:step]]
endfor
if isa(dataIgnoreValue,/number) then $
xIndex=where(x ne dataignorevalue and x gt minimum) else $
xIndex=where( x gt minimum)
NanIndex1=finite(x)
NanIndex2=finite(y)
nanIndex=where(NanIndex1 eq 0 or NanIndex2 eq 0)
if nanIndex[0] ne -1 then xindex=setdifference(xIndex,nanIndex)
x=x[xindex]
y=y[xindex]
;获取回归参数
h=para_tvdi(x,y,minimum=minimum)
_Min=h['Min']
_Max=h['Max']
_mina=_Min[0]
_minb=_Min[1]
_maxa=_Max[0]
_maxb=_Max[1]
xTiles.reset
yTiles.reset

;求得回归参数后分块计算TVDI或VTCI
for i=0,xTiles.ntiles-1 do begin
percentProgress = Round((i+xtiles.ntiles)* 100.0/(xTiles.ntile*2))
Progress.Percent = percentProgress
Channel.Broadcast, Progress
IF (Abort.Abort_Requested) THEN BEGIN
Finish = ENVIFinishMessage(Abort)
Channel.Broadcast, Finish
return
BREAK
ENDIF
x=xTiles.next()
y=yTiles.next()
r=cal_TVDI_VTCI(_mina,_minb,_maxa,_maxb,x,y,TVDI=TVDI)
if isa(dataIgnoreValue,/NUMBER) then begin
index=where(x eq dataIgnoreValue)
if index[0] ne -1 then r[index]=dataIgnoreValue
endif
rasternew.settile,r,xTiles
endfor

;更新结果波段名称
if TVDI then bnames=['TVDI'] else bnames=['VTCI']

IF rasternew.metadata.HasTag('BAND NAMES') then $
rasternew.metadata.UpdateItem,'BAND NAMES',bnames ELSE $
rasternew.metadata.Additem,'BAND NAMES',bnames
rasternew.save

;进度条结束
Finish = ENVIFinishMessage(Abort)
Channel.Broadcast, Finish

;是否在ENVI中显示结果
if display then begin
View = e.GetView()
Layer = View.CreateLayer(rasternew)
View.Zoom, /FULL_EXTENT
endif

;绘制散点图和报表
xArr=h['xArr']
minYarr=h['minYarr']
maxYarr=h['maxYarr']
plotWetDry,xArr,minYarr,maxYarr
end

 

 



推荐阅读
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • 从批量eml文件中提取附件的Python代码实现方法
    本文介绍了使用Python代码从批量eml文件中提取附件的实现方法,包括获取eml附件信息、递归文件夹下所有文件、创建目的文件夹等步骤。通过该方法可以方便地提取eml文件中的附件,并保存到指定的文件夹中。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
author-avatar
乐民修德
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有