电影新少林寺剧情介绍:IDL下实现ENVI的波段运算表达式语句合理性检测

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 10:48:55
Learning ENVI&IDL
学习、研究ENVI&IDL+ArcGIS 外加些转载的^_^ 转帖请注明出自本博客! http://bbs.esrichina-bj.cn/ESRI/?fromuid=9806
主页博客相册|个人档案 |好友 |i贴吧
查看文章
IDL下实现ENVI的波段运算表达式语句合理性检测
2011年10月21日 星期五 20:20
ENVI的波段运算功能很强大,若输入表达式中有错误则无法add。这个检测是怎么实现的呢?如果在IDL下进行ENVI二次开发的时候,如何实现这个功能。
首先启动ENVI+IDL,进行波段运算,输入b1*a,然后点击Add。

IDL的控制台上会输出如下信息:
% Variable is undefined: A.
ENVI>
由此,联想到ENVI是否进行了一个测试调用,根据调用的返回值来判断该表达式是否合法。在IDL下进行测试:
ENVI> str1 ='b1*a'
ENVI> varname = Var_Extract(str1)
ENVI> isWrite = Execute(varName+"=indgen(5,5)")
ENVI> print,isWrite
1
ENVI> isWrite = Execute(varName+"=" + Str1)
% Variable is undefined: A.
ENVI> print,isWrite
0
该错误提示与ENVI的波段运算错误提示是对应的。应该就是用的这个Execute返回值来判断表达式是否正确。
其中调用到的函数来自YangHS,如下:
Function VarFind,Str
Compile_opt strictarr
Len = StrLen(Str)
RetValue = 'b'
RefArr = Strtrim(Indgen(10),2)
if Len eq 1 then Return,RetValue
for i=1,Len-1 do begin
Char = StrMid(Str,i,1)
if (Where(RefArr eq Char))[0] eq -1 then break
RetValue = RetValue+Char
endfor
;
Return,RetValue
End
Function Var_Extract,ExpStr
Compile_opt strictarr
ExpStr = STRLOWCASE(ExpStr)
StrArray = StrSplit(ExpStr,'b',/extract)
StrArray = 'b'+StrArray
;
for i=0,N_Elements(StrArray)-1 do begin
StrArray[i] =  VarFind(StrArray[i])
endfor
;
LenArr = StrLen(StrArray)
index = Where(LenArr ne 1,count)
if count gt 0 then RetArr=StrArray[index] else RetArr=''
;
uniqIndex = Uniq(RetArr)
RetArr = RetArr[uniqIndex]
Return,RetArr
End
那么继续探讨下表达式变量的初值设置,编写一简单的波段运算函数test_bandmathVar。
function test_bandmathVar,inVar
help,inVar,out = outD
print,outD
print,inVar
return,inVar
end
编译后在波段运算中输入test_bandmathVar(b1):

控制台输出如下: