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

简介: 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月前
|
数据采集 JSON API
深入解析:使用 Python 爬虫获取淘宝店铺所有商品接口
本文介绍如何使用Python结合淘宝开放平台API获取指定店铺所有商品数据。首先需注册淘宝开放平台账号、创建应用并获取API密钥,申请接口权限。接着,通过构建请求、生成签名、调用接口(如`taobao.items.search`和`taobao.item.get`)及处理响应,实现数据抓取。代码示例展示了分页处理和错误处理方法,并强调了调用频率限制、数据安全等注意事项。此技能对开发者和数据分析师极具价值。
|
11月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
9月前
|
数据采集 安全 数据挖掘
淘宝天猫宝贝详情页面商品评论采集接口全解析
淘宝天猫商品评论采集接口为电商数据挖掘提供了重要工具。通过分析海量评论,消费者可获取购买决策参考,商家能优化产品与服务,市场研究者则能洞察行业趋势与竞品表现。该接口支持Python请求,助力开发者构建智能分析应用,推动电商生态中各方价值提升。使用时需遵守平台规则,确保数据安全与合法利用。
293 15
|
9月前
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
|
10月前
|
弹性计算 运维 网络安全
阿里云轻量应用服务器产品解析与搭建个人博客网站教程参考
轻量应用服务器(Simple Application Server)作为阿里云面向单机应用场景推出的云服务器产品,以其一键部署、一站式管理、高性价比等特性,深受个人开发者、中小企业及入门级用户的喜爱。本文将全面解析阿里云轻量应用服务器的产品优势、应用场景、使用须知,以及使用轻量应用服务器搭建个人博客网站的详细教程,帮助用户更好地了解和使用这一产品。
|
9月前
|
存储 缓存 监控
如何高效爬取天猫商品数据?官方API与非官方接口全解析
本文介绍两种天猫商品数据爬取方案:官方API和非官方接口。官方API合法合规,适合企业长期使用,需申请企业资质;非官方接口适合快速验证需求,但需应对反爬机制。详细内容涵盖开发步骤、Python实现示例、反爬策略、数据解析与存储、注意事项及扩展应用场景。推荐工具链包括Playwright、aiohttp、lxml等。如需进一步帮助,请联系作者。
|
12月前
|
缓存 网络协议 安全
融合DNS技术产品和生态
本文介绍了阿里云在互联网基础资源领域的最新进展和解决方案,重点围绕共筑韧性寻址、赋能新质生产展开。随着应用规模的增长,基础服务的韧性变得尤为重要。阿里云作为互联网资源的践行者,致力于推动互联网基础资源技术研究和自主创新,打造更韧性的寻址基础服务。文章还详细介绍了浙江省IPv6创新实验室的成立背景与工作进展,以及阿里云在IPv6规模化部署、DNS产品能力升级等方面的成果。此外,阿里云通过端云融合场景下的企业级DNS服务,帮助企业构建稳定安全的DNS系统,确保企业在数字世界中的稳定运行。最后,文章强调了全链路极致高可用的企业DNS解决方案,为全球互联网基础资源的创新提供了中国标准和数字化解决方案。
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
915 29
|
9月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
389 4
|
9月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多
  • DNS