系列文章目录
IDL矢量转分类TIF影像
文章目录
前言
ENVI的矢量栅格化做的非常好,但需要借助中间变量ROI来保证数据的对齐
一、shp2roi2classfication
代码如下:
; Start the application
pro test
;避免出现:% Variable is undefined: ENVITASK.问题
COMPILE_OPT IDL2
;envi, /restore_base_save_files
;envi_batch_init, /NO_STATUS_WINDOW
;原始代码采用的是envi与IDL混合编程,添加“/HEADLESS”不显ENVI示窗口进程
e = ENVI(/HEADLESS)
; 打开输入文件
;这里调用的是envi默认的数据矢量文件
File = Filepath('qb_boulder_msi_vectors.shp', Subdir=['data'], $
Root_Dir='D:\Programfile\Exelis\ENVI53\')
;调用ENVI函数读取矢量文件
;这两有两种操作方式,代码中采用的是初始化e = ENVI(/HEADLESS)
;Vector = envi.OpenVector(File)
Vector = e.OpenVector(File)
; Get the task from the catalog of ENVITasks
; 调用envi VectorAttributeToROIs api
Task = ENVITask('VectorAttributeToROIs')
; Define inputs
;设置需要栅格化的矢量属性
Task.ATTRIBUTE_NAME = 'CLASS_NAME'
;输入矢量
Task.INPUT_VECTOR = Vector
; 定义.xml输出,未指定目录,默认保存在系统临时文件目录中
Task.OUTPUT_ROI_URI = e.GetTemporaryFilename('.xml')
;执行V2R任务
Task.Execute
;打开roi
Rois = e.OpenRoi(Task.OUTPUT_ROI_URI)
;影影像文件目录
File = Filepath('qb_boulder_msi', Subdir=['data'], $
Root_Dir=e.Root_Dir)
Raster = e.OpenRaster(File)
;调用roi2colassification api
Task = ENVITask('ROIToClassification')
;
; Define inputs,包括roi与影像
Task.INPUT_ROI = [Rois[0], Rois[1],Rois[2]]
Task.INPUT_RASTER = Raster
; 定义影像输出文件名
Task.OUTPUT_RASTER_URI = 'E:\IDL\output\test.tif'
; 执行操作
Task.Execute
;任务结束
end
;end
2、IDL&ENVI可视化显示
vector2ROI
;;这部分是IDL与envi混合编程,在envi中进行可视化显示,在(vector2ROI)Task.Execute之后执行
;; Display the result
;
;DisplayFile = Filepath('qb_boulder_msi', Subdir=['data'], $
;
; Root_Dir=e.Root_Dir)
;
;Raster = e.OpenRaster(DisplayFile)
;
;View1 = e.GetView()
;
;Layer1 = View1.CreateLayer(Raster)
;
;VisRois = !NULL
;
;Foreach Roi, Task.OUTPUT_ROI do $
;
; VisRois = [VisRois, Layer1.AddRoi(Roi)]
3、IDL&ENVI可视化显示
roi2classfication
;这部分是IDL与envi混合编程,在envi中进行可视化显示,在(roi2classfication)Task.Execute之后执行
; Get the data collection
;DataColl = e.Data
;envi_batch_exit
; Add the output to the data collection
;可视化
;DataColl.Add, Task.OUTPUT_RASTER
; Display the result
;
;View1 = e.GetView()
;
;Layer1 = View1.CreateLayer(Task.OUTPUT_RASTER)
4、调用pro
;这里需要对数据定义pro传递的函数
pro,test,value1,value2
; test进程名
;value1,value2,变量名
end
;在命令行进行调用
>test,value1,value2
总结
这是一个简单的数据转换处理,主要熟悉ENVI api的调用以及pro函数的定义与调用