利用IDL批量将栅格数据从地理坐标系投影到投影坐标系

很多遥感影像下载后是地理坐标系的,但是在很多计算中,是需要投影才可以进行,在这里以NASADEM投影为例

将一副已经投影好的影像作为参考,引入投影参数

  ;定义投影
  File = 'C:\Users\DELL\Desktop\test\ty\DEM_Mercator.tif'
  ENVI_OPEN_FILE, File ,r_fid=fid
  o_proj = ENVI_GET_PROJECTION(FID = fid)
  ; o_proj = ENVI_PROJ_CREATE(/geographic)

批量读入数据

 CD,'C:\Users\DELL\Desktop\test\'
  BINFiles = FILE_SEARCH("*.tif")
  FileCount = N_ELEMENTS(BINFiles)
  IF FileCount EQ 0 THEN RETURN

逐景影像投影

 FOR NX = 0,FileCount -1 DO BEGIN
    FileName = BINFiles[NX]
    ENVI_OPEN_FILE, FileName ,r_fid=fid
    IF (fid EQ -1)THEN BEGIN
      ENVI_BATCH_EXIT
      RETURN
    ENDIF
    ; Setupthe values for the keywords
    ENVI_FILE_QUERY, fid[0], dims=dims, nb=nb
    pos = LINDGEN(nb)
;    indexstr = STRPOS(FileName,'.tif')
;    out_name = STRMID(FileName,0,indexstr) +'_Geo.tif'
    out_name = 'C:\Users\DELL\Desktop\test\result\'+STRMID(FileName,0,7) +'_Geo.tif'
    ;设置输出像元大小
    o_pixel_size = [30,30];


    ENVI_CONVERT_FILE_MAP_PROJECTION, fid=fid, $
      pos=pos, dims=dims, o_proj=o_proj, $
      o_pixel_size=o_pixel_size, $
      out_name=out_name, warp_method=2, $
      resampling=0, background=-9999
    ENVI_FILE_MNG,id = fid,/remove
    
    print,FileName

 完整代码:

PRO CONVERT_FILE_MAP_PROJECTION
  ; Firstrestore all the base save files.
  COMPILE_OPT IDL2
  ENVI,/restore_base_save_files
  e = ENVI(/headless)
  ;Initialize ENVI and send all errors
  ; andwarnings to the file batch.txt
  ENVI_BATCH_INIT, log_file='batch.txt'
  ; Open theinput file
  ;定义投影
  File = 'C:\Users\DELL\Desktop\test\ty\DEM_Mercator.tif'
  ENVI_OPEN_FILE, File ,r_fid=fid
  o_proj = ENVI_GET_PROJECTION(FID = fid)
  ; o_proj = ENVI_PROJ_CREATE(/geographic)

  CD,'C:\Users\DELL\Desktop\test\'
  BINFiles = FILE_SEARCH("*.tif")
  FileCount = N_ELEMENTS(BINFiles)
  IF FileCount EQ 0 THEN RETURN

  FOR NX = 0,FileCount -1 DO BEGIN
    FileName = BINFiles[NX]
    ENVI_OPEN_FILE, FileName ,r_fid=fid
    IF (fid EQ -1)THEN BEGIN
      ENVI_BATCH_EXIT
      RETURN
    ENDIF
    ; Setupthe values for the keywords
    ENVI_FILE_QUERY, fid[0], dims=dims, nb=nb
    pos = LINDGEN(nb)
;    indexstr = STRPOS(FileName,'.tif')
;    out_name = STRMID(FileName,0,indexstr) +'_Geo.tif'
    out_name = 'C:\Users\DELL\Desktop\test\result\'+STRMID(FileName,0,7) +'_Geo.tif'
    ;设置输出像元大小
    o_pixel_size = [30,30];


    ENVI_CONVERT_FILE_MAP_PROJECTION, fid=fid, $
      pos=pos, dims=dims, o_proj=o_proj, $
      o_pixel_size=o_pixel_size, $
      out_name=out_name, warp_method=2, $
      resampling=0, background=-9999
    ENVI_FILE_MNG,id = fid,/remove
    
    print,FileName
  ENDFOR
  ; ExitENVI
  ENVI_BATCH_EXIT
  print,'finish'
END

 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IDL可以使用GDAL库来实现矢量文件裁剪栅格数据的功能。下面是一个基本的IDL代码示例,演示如何使用GDAL库来裁剪栅格数据: ```IDL ;加载GDAL库 lib = 'gdal' result = lib_load(lib) ;打开栅格数据 filename = 'raster.tif' dataset = gdal_open(filename) ;打开矢量文件 vectorfile = 'vector.shp' vector_dataset = ogr_open(vectorfile) ;获取矢量文件的空间参考系统 spatialRef = ogr_getspatialref(vector_dataset) ;将矢量文件的空间参考系统转换为栅格数据的空间参考系统 targetSpatialRef = gdal_getspatialref(dataset) transform = ogr_createcoordinatetransform(spatialRef, targetSpatialRef) ;获取矢量文件的几何体 layer = ogr_getlayer(vector_dataset, 0) feature = ogr_getfeature(layer, 0) geometry = ogr_getgeometry(feature) ;将矢量文件的几何体转换为栅格数据的像素坐标系 envelope = ogr_getenvelope(geometry) ulx = envelope[0] uly = envelope[3] lrx = envelope[2] lry = envelope[1] geoTransform = gdal_getgeotransform(dataset) pixulx = (ulx - geoTransform[0]) / geoTransform[1] pixuly = (uly - geoTransform[3]) / geoTransform[5] pixlrx = (lrx - geoTransform[0]) / geoTransform[1] pixlry = (lry - geoTransform[3]) / geoTransform[5] width = pixlrx - pixulx height = pixlry - pixuly ;创建输出栅格数据 outputFilename = 'output.tif' format = 'GTiff' driver = gdal_getdriverbyname(format) options = ['COMPRESS=LZW'] outputDataset = gdal_createdataset(outputFilename, width, height, gdal_getbandcount(dataset), gdal_getdatatype(dataset), options) gdal_setgeotransform(outputDataset, geoTransform) gdal_setspatialref(outputDataset, targetSpatialRef) ;裁剪栅格数据 gdalwarpsrc = gdal_createwarpsrcfromoptions(dataset, options) gdalwarptarget = gdal_createwarptarget(outputDataset) gdalwarpsrc.SetGeoTransform(geoTransform) gdalwarpsrc.SetProjection(gdal_getprojectionref(dataset)) gdalwarptarget.SetGeoTransform(gdal_getgeotransform(outputDataset)) gdalwarptarget.SetProjection(gdal_getprojectionref(outputDataset)) gdalwarper = gdal_createwarper(gdalwarpsrc, gdalwarptarget) gdalwarper.WarpBand(gdal_getrasterband(dataset, 1), gdal_getrasterband(outputDataset, 1), 0, 0) ;关闭栅格数据和矢量文件 gdal_deleteDataset(dataset) ogr_deleteDataSource(vector_dataset) gdal_deleteDataset(outputDataset) ``` 这个示例代码使用GDAL库打开栅格数据和矢量文件,然后获取它们的空间参考系统和几何体,并将矢量文件的空间参考系统转换为栅格数据的空间参考系统。然后,它将矢量文件的几何体转换为栅格数据的像素坐标系,并使用这些坐标来创建输出栅格数据。最后,它使用GDAL库的Warp函数来裁剪栅格数据,将结果保存到输出栅格数据中。完成后,它关闭了所有的栅格数据和矢量文件。 需要注意的是,以上代码示例仅提供了一个基本的框架,实际使用时需要根据自己的需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值