分享

IDL下实现ENVI的波段运算表达式语句合理性检测

 宇尘一粒 2011-11-14
 
查看文章
 
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))[0eq -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)



控制台输出如下:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多