ENVI二次开发时的波段运算表达式语句合理性检测方法与ENVI检测方法探讨
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 ENVI> isWrite = Execute(varName+"=" + Str1) % Variable is undefined: A. ENVI> print,isWrite |
该错误提示与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):
控制台输出如下:
INVAR INVAR INVAR INVAR |
由上面的输出看来ENVI下初步给定的是5*5的浮点型随机数组,随机变量构建代码如下:
ENVI> s = float(fix(randomu(aa,5,5)*255)) ENVI> print,s ENVI> s = float(fix(randomu(aa,5,5)*255)) ENVI> print,s ENVI> s = float(fix(randomu(aa,5,5)*255)) ENVI> print,s ENVI> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界