TM3、4波段GeoTiff数据计算NDVI

 

源码:

       1:  PRO TIFF_NDVI,F1,F2,FOUT 
       2:  F1 = DIALOG_PICKFILE(TITLE = 'B4 TIFF',FILTER='*.TIF',/READ) 
       3:  F2 = DIALOG_PICKFILE(TITLE = 'B3 TIFF',FILTER='*.TIF',/READ) 
       4:  FOUT =DIALOG_PICKFILE(TITLE = 'RESULT PATH',FILTER='*.TIF',/WRITE) 
       5:  IF(FILE_TEST(F1) GT 0 AND FILE_TEST(F2) GT 0) THEN BEGIN 
       6:    B1 = READ_TIFF(F1,GEOTIFF=GE1) 
       7:    B2 = READ_TIFF(F2,GEOTIFF=GE2) 
       8:  HELP,B1,B2 
       9:    C = 0.001 
      10:  WRITE_TIFF,FOUT,-1.0>( (FLOAT(B1)-FLOAT(B2))/(FLOAT(B1)+FLOAT(B2) + C) )<1.0,/FLOAT,GEOTIFF=GE2 
      11:  PRINT,'OK 
      12:  ENDIF 
      13:  END 

解释:

1> IDL是解释型语言,声明一个函数可以用“Pro或Function空格函数名,参数”的形式,函数块以End结束;如“PRO TIFF_NDVI,F1,F2,FOUT”,其中pro是声明符,TIFF_NDVI是函数名,f1,f2,fout是函数的参数。pro和function暂且都称为函数,除了声明符不同,在调用时也要注意。如下

pro test ,a
a = 2
print,a
end
functiontest,a
a = 4
print,a
return,a
end
IDL> a = 0
IDL> print,a
     0
IDL> test,a
     2
IDL> g = test(a)
     4
IDL> print,g
     4
即function函数会return值,在调用function时函数参数都要用小括号括起来,同时需要有一个变量接收返回值
注意:IDL虽然对大小写不敏感,但建议将变量名小写,函数和参数名大写

2> IDL的函数调用完毕,会改变传入参数的值,类似于“传址调用”,上面代码:

IDL> a = 0
IDL> print,a
     0
IDL> test,a
     2
可以发现a在调用test函数后,值发生了改变,这个很值得注意。

3> F1 = DIALOG_PICKFILE(TITLE = 'B4 TIFF',FILTER='*.TIF',/READ) 这一句就是调用 DIALOG_PICKFILE函数返回tiff文件的路径,下两句也是获取tiff文件路径

4> IF(FILE_TEST(F1) GT 0 AND FILE_TEST(F2) GT 0) THEN BEGIN

选择分支if语句一般形式为
if statement then begin
....
endif else begin
....
endelse
FILE_TEST(F1) GT0 ,FILE_TEST是一个function,用来检测文件是否已存在,存在返回1,否则返回0值

5> B1 = READ_TIFF(F1,GEOTIFF=GE1): 一句用READ_TIFF 这一function来读取tiff文件中的数据,geotiff参数用来提取tiff文件的地理信息,下一句作用类似;

6> HELP,B1,B2用来查询变量的维数信息,print函数用来输出变量值,如果变量不是数组,那么用help可直接输出变量的值。注意help一个结构体变量需加参数“/struct”

7> WRITE_TIFF,FOUT,-1.0>( (FLOAT(B1)-FLOAT(B2))/(FLOAT(B1)+FLOAT(B2) + C) )<1.0,/FLOAT,GEOTIFF=GE2这一句用来计算ndvi并保存为geotiff文件

WRITE_TIFF函数是一个pro,需要至少2个顺序参数,第一位是保存路径,第二位是数据变量;其他用“=”相连的参数顺序可随意,/float表示输出浮点型数据,geotiff用来追加地理信息。

-1.0>( (FLOAT(B1)-FLOAT(B2))/(FLOAT(B1)+FLOAT(B2) + C) )<1.0是计算ndvi的算式,可理解2步运算
x = (float(b1) – float(b2)  )/ (float(b1) + float(b2) + c) 计算ndvi
x = -1.0> x<1.0,将x与-1.0比较取大值,接着与1.0比较取小值,换句话说,就是将ndvi限定在[-1,1]区间。<是求小运算符,>是求大运算符

posted @ 2013-11-18 14:58  ZinkSor  阅读(1310)  评论(0编辑  收藏  举报