||
函数:考虑到IDL版本以及函数的优劣,我这里采用了老版的函数
ENVI_CONVERT_FILE_MAP_PROJECTION
与新版的函数相比,它可以定义所需的投影,以及输出的格网大小(新版似乎没有这个)
使用语法如下:
ENVI_CONVERT_FILE_MAP_PROJECTION, DIMS=data_dims, FID=data_fid, $
O_PIXEL_SIZE=target_pixel_size, O_PROJ=target_prj, OUT_NAME=res_name, $
POS=[0]
配套使用的函数:
用于获取期望的投影函数
ENVI_GET_PROJECTION
语法如下:
target_prj=ENVI_GET_PROJECTION(FID=target_fid, PIXEL_SIZE=target_pixel_size)
其中,FID是输入,PIXEL_SIZE为输出(意思是前者是set, 后者是get)
值得注意的是ENVI函数一直保持着变量位于右边的风格,这与 MATLAB, c等风格完全相反。
2. 批量
剩下的工作就很简单了, 就是for 循环 处理文件了,测试通过的代码如下:
pro reprojection
COMPILE_OPT IDL2
envi, /restore_base_save_files
envi_batch_init, log_file='batch.txt'
targetfile=FILE_SEARCH('希望的投影坐标的文件') 主要是提供投影信息
datapath=FILE_SEARCH('待投影的文件', $
count=count_all)
respath='E:\Yinxcao\beijng_res\region\dsm\prj'
;Open target file to get projection information
IF FILE_TEST(targetfile) EQ 0 THEN BEGIN
PRINT, targetfile+' don not exist'
RETURN
ENDIF ELSE BEGIN
ENVI_OPEN_FILE, targetfile, R_FID=target_fid
targetprj=ENVI_GET_PROJECTION(FID=target_fid, PIXEL_SIZE=targetpixel)
ENDELSE
;Loop over all files
FOR I=0,count_all-1 DO BEGIN
filename=datapath[i]
basename=FILE_BASENAME(filename)
resname=FILEPATH(basename+'_prj', ROOT_DIR=respath)
;Test if the file has been processed
IF FILE_TEST(resname) THEN CONTINUE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;start reprojection
;Open files
ENVI_OPEN_FILE, filename, R_FID=data_fid
ENVI_FILE_QUERY, data_fid, DIMS=data_dims
ENVI_CONVERT_FILE_MAP_PROJECTION, DIMS=data_dims, FID=data_fid, $
O_PIXEL_SIZE=targetpixel, O_PROJ=targetprj, OUT_NAME=resname, $
POS=[0]
;remove files from memory
PRINT, basename+' finish'
ENVI_FILE_MNG, FID= data_fid, /REMOVE
ENDFOR
ENVI_FILE_MNG, FID= target_fid, /REMOVE
envi_batch_exit
end
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-4-26 16:57
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社