sunsett的个人博客分享 http://blog.sciencenet.cn/u/sunsett

博文

ENVI/IDL 编程: 批量重投影

已有 6355 次阅读 2019-3-4 20:44 |个人分类:ENVI/IDL|系统分类:科研笔记

  1. 函数:考虑到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




https://blog.sciencenet.cn/blog-3409932-1165647.html

上一篇:从CDSN转到科学网
下一篇:ENVI/IDL 编程:批量修复DEM坏值
收藏 IP: 202.114.121.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-26 16:57

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部