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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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


编译运行:





目录
相关文章
|
14天前
|
缓存 网络协议 安全
融合DNS技术产品和生态
本文介绍了阿里云在互联网基础资源领域的最新进展和解决方案,重点围绕共筑韧性寻址、赋能新质生产展开。随着应用规模的增长,基础服务的韧性变得尤为重要。阿里云作为互联网资源的践行者,致力于推动互联网基础资源技术研究和自主创新,打造更韧性的寻址基础服务。文章还详细介绍了浙江省IPv6创新实验室的成立背景与工作进展,以及阿里云在IPv6规模化部署、DNS产品能力升级等方面的成果。此外,阿里云通过端云融合场景下的企业级DNS服务,帮助企业构建稳定安全的DNS系统,确保企业在数字世界中的稳定运行。最后,文章强调了全链路极致高可用的企业DNS解决方案,为全球互联网基础资源的创新提供了中国标准和数字化解决方案。
|
14天前
|
存储 搜索推荐 数据挖掘
投资回报与预算考量:CRM产品报价全解析
在当今竞争激烈的商业环境中,CRM系统已成为企业不可或缺的工具。它能有效管理客户信息、提升销售效率、优化服务并增强忠诚度。选择合适的CRM需考虑功能、用户数量、定制需求、技术支持及数据安全等因素,确保在预算内实现最大价值。企业在挑选时应明确需求、比较产品、评估长期回报,并考虑扩展性。最适合自己业务需求的CRM才是最佳选择。
|
2月前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
67 3
|
3月前
|
自动驾驶 安全 物联网
|
2月前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
4月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
103 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
90 0
|
3月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
69 0
|
20天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

推荐镜像

更多