学习资料
IDL和ENVI的详细文档:查询具体的函数和接口
Documentation Centerhttps://www.l3harrisgeospatial.com/docs/home.html
IDL帮助文档(官方),不太好用,还是我不会用呢
IDL中类定义
IDL中类定义_极天下真_新浪博客IDL中类定义_极天下真_新浪博客,极天下真,http://blog.sina.com.cn/s/blog_16009545f0102xovx.htmlexe封装,传参及使用
一个很完整的小项目
监督分类
pro classfication
COMPILE_OPT IDL2
; envi,/restore_base_files 会默认弹出envi老版的窗口,但是注释掉又会报错
ENVI,/restore_base_files
;读入影像
;file='C:\Users\z6q6k6\Desktop\arcpy\3band_20190408_Zhoushan.tif'
ENVI_OPEN_FILE,file,r_fid=fid
IF fid EQ -1 THEN BEGIN
RETURN
ENDIF
;envi_open_file,file,r_fid=fid
envi_file_query,fid,ns=ns,bl=nl,nb=nb,dims=dims
pos=indgen(nb)
;读入roi文件
;file_roi='C:\Users\z6q6k6\Desktop\arcpy\1.roi'
envi_restore_rois,file_roi
roi_ids=envi_get_roi_ids(fid=fid,roi_colors=roi_colors,roi_names=roi_names)
;添加未识别的一类,并自动赋予黑色
class_names=['Unclassified',roi_names]
num_classes=n_elements(roi_ids)
lookup = BYTARR(3,num_classes+1)
lookup[0,1] = roi_colors
means=fltarr(nb,num_classes)
stdv=fltarr(nb,num_classes)
cov=fltarr(nb,nb,num_classes)
for j=0,num_classes-1 do begin
roi_dims=[envi_get_roi_dims_ptr(roi_ids[j]),0,0,0,0]
envi_doit,'envi_stats_doit',fid=fid,dims=roi_dims,pos=pos,comp_flag=4,mean=c_mean,stdv=c_stdv,cov=c_cov
means[0,j]=c_mean
stdv[0,j]=c_stdv
cov[0,0,j]=c_cov
endfor
; 默认输出路径
out_file='C:\Users\z6q6k6\Desktop\result.tif'
envi_doit,'class_doit',fid=fid,dims=dims,pos=pos,$
r_fid=r_fid,out_name=out_file,method=1,$
mean=means,stdv=stdv,cov=cov,num_classes=num_classes,lookup=lookup,$
class_names=class_names
;method:
;0:平行六面体(监督)
;1:最小距离(监督)
;2:最大似然(监督)
;3:SAM(监督)
;4:ISODATA(无监督)
;5:马哈拉诺比斯(监督)
;6:二进制编码(监督)
;7:K-Means(无监督)
;8:SID(监督)
END
pro classfication_5
;,file,roi_file,out_all,out_ship;
COMPILE_OPT IDL2
;COMPILE_OPT STRICTARR
args = Command_Line_Args(Count=c)
file = args[0]
roi_file = args[1]
out_all = args[2]
out_ship = args[3]
;如果在参数里加/headless 关键字,为不显示ENVI软件
e = ENVI(/headless)
path= routine_filepath('classfication_5')
dir=file_dirname(path)
RESTORE,dir + '\ENVIRandomForestClassification\ENVIRandomForestClassification_V5.3_3\extensions\ENVIRandomForestClassification.sav'
task = ENVITASK('RandomForestClassification')
;file='G:\newdata\2019_Zhoushan.dat'
raster = e.OpenRaster(file)
task.INPUT_RASTER = raster
;roi_file = 'G:\newdata\roi.roi'
roi = e.OpenRoi(roi_file)
task.input_Rois= roi
OutFile_1 = e.GetTemporaryFilename()
Task.OUTPUT_RASTER_URI = OutFile_1
; 错误
catch, error
if error ne 0 then begin
catch, /cancel
print, 'A normal error occured: ' + !error_state.msg
;out_all = 'G:\newdata\all.dat'
raster_1 = e.OpenRaster(OutFile_1)
Task_1 = ENVITask('ClassificationAggregation')
Task_1.INPUT_RASTER = raster_1
Task_1.Minimum_Size = 200
Task_1.OUTPUT_RASTER_URI = out_all ;第一种保存方法,设置输出路径,保存数据
Task_1.Execute
; 水体第一步
OutFile_2 = e.GetTemporaryFilename()
Raster_2 = e.OpenRaster(out_all)
fid = ENVIRasterToFID(Raster_2)
ENVI_File_Query, fid, DIMS=dims
ENVI_Doit, 'Math_Doit', $
FID = [fid], $
DIMS = dims, $
POS = [0], $
EXP = 'b1*(float(b1) eq 3)', $
out_name=OutFile_2
; 水体第二步
OutFile_3 = e.GetTemporaryFilename()
Raster_3 = e.OpenRaster(OutFile_2)
fid = ENVIRasterToFID(Raster_3)
ENVI_File_Query, fid, dims=dims
ENVI_Doit, 'Math_Doit', $
FID = [fid], $
dims = dims, $
POS = [0], $
EXP = 'b1 * float(b1 ne 0) / (b1 ne 0)', $
out_name= OutFile_3
; 建筑第一步
OutFile_4 = e.GetTemporaryFilename()
;OutFile_4 = 'G:\newdata\building_1.dat'
Raster_4 = e.OpenRaster(OutFile_1)
fid = ENVIRasterToFID(Raster_4)
ENVI_File_Query, fid, DIMS=dims
ENVI_Doit, 'Math_Doit', $
FID = [fid], $
DIMS = dims, $
POS = [0], $
EXP = 'b1 * (float(b1) eq 1)', $
out_name=OutFile_4
; 建筑第二步
OutFile_5 = e.GetTemporaryFilename()
;OutFile_5 = 'G:\newdata\building_2.dat'
Raster_5 = e.OpenRaster(OutFile_4)
fid = ENVIRasterToFID(Raster_5)
ENVI_File_Query, fid, dims=dims
ENVI_Doit, 'Math_Doit', $
FID = [fid], $
dims = dims, $
POS = [0], $
EXP = 'b1 * float(b1 ne 0 ) / (b1 ne 0)', $
out_name= OutFile_5
; 结果
raster_6 = e.OpenRaster(OutFile_3)
raster_7 = e.OpenRaster(OutFile_5)
fid = ENVIRasterToFID(raster_6)
ENVI_File_Query, fid, dims=dims
fid1 = fid
fid = ENVIRasterToFID(raster_7)
ENVI_File_Query, fid, dims=dims
ENVI_Doit, 'Math_Doit', $
FID = [fid1, fid], $
dims = dims, $
POS = [0,0], $
EXP = 'float(b1) - b2', $
out_name=out_ship
print,'yes!'
return
endif
task.EXECUTE
e.close
END