ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析

1. 课堂内容

批量重投影

这里是重投影的整体思路:


1. 获取Modis Swath数据(这里只获取Lat、Lon、Aod(气溶胶厚度)三个数据集以及aod数据集的两个属性),并对aod数据进行简单的处理

2. 调用二次开发接口以Lat、Lon数据作为原材料创建Glt文件

3. 调用二次开发接口以Glt文件作为参照,对Aod数据进行重投影并输出


这里主要是二次开发接口比较陌生,其实就是调用包我感觉。

另外对于二次接口的使用比较陌生可以使用ENVI先进行重投影的操作然后将ENVI的重投影操作和IDL的代码进行对比的话,你会发现代码和ENVI的重投影操作有很多相似之处,这将会有助于你理解代码的操作和运行


2. ENVI实操与IDL编程

function get_hdf4_ds, file_path, ds_name
  ; 构建函数, 用于得到hdf4文件中数据集的数据
  ; 获取文件id
  file_id = hdf_sd_start(file_path, /read)
  ; 获取数据集index
  ds_index = hdf_sd_nametoindex(file_id, ds_name)
  ; 获取数据集的id
  ds_id = hdf_sd_select(file_id, ds_index)  ; 传入数据集的id以及数据集的名称
  ; 获取数据集的数据
  hdf_sd_getdata, ds_id, ds_data
  ; 传入数据集id,在传入一个变量用于接函数获取的该数据集的数据
  ; 关闭已经打开数据集以及文件
  hdf_sd_endaccess, ds_id
  hdf_sd_end, file_id
  ; 返回值
  return, ds_data
end
function get_hdf4_att_info, file_path, ds_path, att_name
  ; 构建函数: 用于获取hdf4文件的数据集的相关属性
  ; 获取文件id
  file_id = hdf_sd_start(file_path, /read)
  ; 获取数据集的index
  ds_index = hdf_sd_nametoindex(file_id, ds_path)
  ; 获取数据集的id
  ds_id = hdf_sd_select(file_id, ds_index)
  ; 获取该数据集下的属性的index
  att_index = hdf_sd_attrfind(ds_id, att_name)
  ; 获取该数据集的某一属性内容
  hdf_sd_attrinfo, ds_id, att_index, data=att_data
  ; 关闭数据集以及文件
  hdf_sd_endaccess, ds_id
  hdf_sd_end, file_id
  ; 返回值
  return, att_data
end
pro week_four_study1
  ; 对modis产品(HDF4)进行重投影(两步走, 创建glt文件,借glt文件投影)
  ; 记录一下开始时间
  start = systime(1)
  ; 由于这里需要使用envi的api接口,所以需要声明
  compile_opt idl2
  envi,/restore_base_save_files
  envi_batch_init
  ; 首先获取modis文件中的lon、lat(前面两个数据是用于创建glt即地理信息查找表)、aod数据,并存储在硬盘中,方便后续envi的api去调用文件
  ; 路径
  in_path = 'D:/IDL_program/experiment_data/chapter_3/modis_swath'
  out_path = 'D:/IDL_program/experiment_data/chapter_3/modis_swath/geo_out'
  ; 假如out_path目录不存在,那么创建
  if file_test(out_path, /directory) eq 0 then begin
    file_mkdir, out_path
  endif
  ; 获取in_path中的所有modis数据(即获取hdf4文件)
  ; 获取所有hdf4文件的路径(以array形式返回)
  file_path_array = file_search(in_path, '*.hdf')  ; 传入目录,传入需要查找的hdf4文件的后缀即.hdf
  ; 获取该目录下的所有hdf4文件的个数
  file_count = n_elements(file_path_array)
  ; 获取lon、lat、aod数据集以及aod数据集的几个属性
  for file_i = 0, file_count - 1 do begin
    ; 该循环下的文件的路径
    file_path = file_path_array[file_i]
    ; 获取数据集数据
    lon_data = get_hdf4_ds(file_path, 'Longitude')
    lat_data = get_hdf4_ds(file_path, 'Latitude')
    aod_data = get_hdf4_ds(file_path, 'Image_Optical_Depth_Land_And_Ocean')
    ; 获取aod数据集的属性(_FillValue, scale_factor)
    aod_fv = get_hdf4_att_info(file_path, 'Image_Optical_Depth_Land_And_Ocean', '_FillValue')
    aod_sf = get_hdf4_att_info(file_path, 'Image_Optical_Depth_Land_And_Ocean', 'scale_factor')
    ; 需要注意,这里返回的属性值是数组形式array(即便它只有一个float数),所以下面使用需要注意
    ; 对aod数据进行处理
    aod_data = (aod_data ne aod_fv[0]) * aod_fv[0] * aod_sf[0]  ; 注意aod_fv和aod_sf均是数组
    ; 输出路径(也许你会发现,每次循环会把之前的目录覆盖,但是不要担心,我们在本循环中就会使用到现在存储的数据)
    lon_path = out_path + '/lon_out.tiff'
    lat_path = out_path + '/lat_out.tiff'
    aod_path = out_path + '/aod_out.tiff'
    ; 存储三个数据集的数据
    write_tiff, lon_path, lon_data, /float
    write_tiff, lat_path, lat_data, /float
    write_tiff, aod_path, aod_data, /float
    ; 将存储的文件给envi的api调用(或者说我们告诉api他需要的文件在哪里)
    envi_open_file, lon_path, r_fid=lon_id
    envi_open_file, lat_path, r_fid=lat_id
    envi_open_file, aod_path, r_fid=aod_id
    ; 传入存储数据集的路径,由关键字传参(r_fid=)得到该数据集(或者说是存储的tiff文件)的id(用变量lon_id等接收)
    ; 输出glt文件的路径
    out_path_glt = out_path + '/glt.img'
    out_path_glt_hdr = out_path + '/glt.hdr'  ; 没有这个行不行,等会儿试一下
    ; 输入输出投影信息
    in_prj = envi_proj_create(/GEOGRAPHIC)  ; 输入是经纬度
    out_prj = envi_proj_create(/GEOGRAPHIC)  ; 输出也是经纬度
    ; 创建glt文件
    envi_glt_doit, $  ; $ 表示换行
      i_proj=in_prj, x_fid=lon_id, y_fid=lat_id, x_pos=0, y_pos=0, $  ; 创建glt需要传入的相关信息
      o_proj=out_prj, pixel_size=pixel_size, rotation=0.0, $  ; 输出glt需要传入的相关信息
      out_name=out_path_glt, r_fid=glt_id  ; 这个也是,输出的路径以及返回的创建好的glt文件的id
    ; 输出重投影结果的路径
    out_georef_path = out_path + '/' + file_basename(file_path, '.hdf') + '_georef.img'
    out_georef_hdr_path = out_path + '/' + file_basename(file_path, '.hdf') + '_georef.hdr'
    ; 使用glt文件进行重投影
    envi_georef_from_glt_doit, $
      glt_fid=glt_id, pos=0, $  ; 传入glt文件的id以及图层数(由于只有一层填0即可)
      fid=aod_id, $  ; 传入待投影的aod文件的id
      out_name=out_georef_path, r_fid=georef_id  ; 传入已经投影好的文件所存放的路径,以及返回该文件的id
    ; 关闭已经打开的文件
    envi_file_mng, id=lon_id, /remove
    envi_file_mng, id=lat_id, /remove
    envi_file_mng, id=aod_id, /remove
    envi_file_mng, id=glt_id, /remove
    envi_file_mng, id=georef_id, /remove
    ; 重投影中间产生了一些文件需要删除,因为我们只需要重投影文件,至于经纬度文件、glt文件如果你想保留那么请不要删除
    file_delete, [lon_path, lat_path, aod_path, out_path_glt, out_path_glt_hdr]
    ; 记录一下结束时间
    stop = systime(1)
  endfor
  print, stop - start
end


编译运行:





目录
相关文章
|
9天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
28 3
|
1月前
|
自动驾驶 安全 物联网
|
11天前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
2月前
|
网络协议 安全 Linux
网卡接口跃点数:概念与重要性解析
在计算机网络中,跃点数(Hop Count)是指数据包从源设备传输到目标设备时经过的路由器或网关数量,是衡量路径长度的关键指标。本文详细介绍了跃点数的概念、计算方法及其在网络管理中的重要性,包括性能评估、故障排除、网络优化及路由选择等方面的应用。通过使用traceroute或tracert命令,网络管理员可以轻松获取跃点数信息,并据此优化网络结构,提高数据传输效率和安全性。尽管跃点数是重要指标,但仍需与其他因素结合分析以全面评估网络性能。
|
2月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
3月前
|
存储 安全 程序员
|
3月前
|
存储 数据采集 API
提升店铺好评秘籍:淘宝商品评论接口与电商 API 接口的深度解析
该接口名为item_review,用于获取淘宝商品评论信息,支持HTTP GET或POST请求,体验API为c0b.cc/R4rbK2。主要请求参数包括商品ID(num_iid)、排序方式(sort)、页码(page)。响应参数涵盖评论内容(rate_content)、评论日期(rate_date)、评论图片(pics)、买家昵称(display_user_nick)、商品属性(auction_sku)
|
29天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
64 0
|
29天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
51 0
|
29天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
58 0

推荐镜像

更多
下一篇
无影云桌面