成信大ENVI_IDL第二周实验内容:提取所有MODIS气溶胶产品中AOD+详细解析

简介: 成信大ENVI_IDL第二周实验内容:提取所有MODIS气溶胶产品中AOD+详细解析

1. 实验内容

1.1 提取日期、经纬度、AOD(气溶胶厚度)

    提取/ coarse_data /chapter_1/MODIS_2018_mod04_3k/ 目录下所有 MODIS 气溶胶产品中 Image_Optical_Depth_Land_And_Ocean 数据集内与北京经纬度( 39.90°N , 116.40°E )最接近的点的 AOD 有效结果,并按每行内容为日期号 经度 纬度 AOD 格式输出到 IDL 控制台,如:

• 2018143        106.39740        38.243156       0.21600001

• .

• .

• .

• .

• 2018147        113.02930        37.370262       0.21000001

1.2 输出形式逗号分隔

       将题目1中的输出形式改为用逗号分隔,如:

2013278,116.49,39.91,2.767

1.3 输出日期时转化为年-月-日形式

将题目2中的日期号,转换为年--日的形式输出,同时数值保留4位小数,如:

2013-01-09,116.49,39.91,2.767


2. 知识储备

2.1 本程序会使用的一些函数的介绍


8901558ac92944148c6a75edd06a9e1a.png


ef78db53b63a453990e64cbde2154abb.png


7abb0926888348f1a4229f3c2f88f10e.png


3. 编程

另外,这里因为实验内容中2和3的内容基本相似,而且实验3的内容相对更难,所以这里不演示实验2的操作,相信大家都可以自己写出,加油!(!!!!!!浩楠哥哥好帅!!!!!!!)

3.1 编程内容

; 构建函数——提取文件中的气溶胶厚度数据集(ROD)的数据
function get_ds_data, file_path, file_ds_name
  ; 获取文件file_name以及文件内部file_ds_name的id
  ; 获取文件id
  file_id = hdf_sd_start(file_path, /read)
  ; 获取数据集的index
  file_ds_index = hdf_sd_nametoindex(file_id, file_ds_name)
  ; 获取数据集的id
  file_ds_id = hdf_sd_select(file_id, file_ds_index)
  ; 获取数据集的data
  hdf_sd_getdata, file_ds_id, file_ds_data
  ; 关闭数据集以及文件
  hdf_sd_endaccess, file_ds_id
  hdf_sd_end, file_id
  ; 返回值————数据集的数据
  return, file_ds_data  ; 这里注意return后面有一个半角的逗号
end
; 构建函数————提取文件中的数据集的内部属性的数据
function get_att_data, file_path, file_ds_name, file_ds_att_name
  ; 获取文件的id
  file_id = hdf_sd_start(file_path, /read)
  ; 获取数据集的index
  file_ds_index = hdf_sd_nametoindex(file_id, file_ds_name)
  ; 获取数据集的id
  file_ds_id = hdf_sd_select(file_id, file_ds_index)
  ; 获取数据集下的属性file_ds_att_name的index
  file_ds_att_index = hdf_sd_attrfind(file_ds_id, file_ds_att_name)
  ; 获取指定属性的数据
  hdf_sd_attrinfo, file_ds_id, file_ds_att_index, data=file_ds_att_data
  ; 关闭数据集以及文件————这是习惯
  hdf_sd_endaccess, file_ds_id
  hdf_sd_end, file_id
  ; 返回值————属性
  return, file_ds_att_data  ; 这里注意return后面有一个半角的逗号
end
; 前面是函数构建,现在是程序的开始
pro week_two_test
  ; 本程序旨在解决提取某点的AOD...
  ; 所有文件所在文件夹路径
  folder_path = 'D:\IDL编程设计\实验数据\chapter_1\MODIS_2018_mod04_3k'
  ; 获取文件夹下所有文件的————》通过file_search()函数获取文件夹下所有hdf文件的名称
  file_path_list = file_search(folder_path, '*.hdf', count=file_count)  ; 返回str数组(另外注意这里可以返回获取的文件数量, 使用count=————等价于下面的n_elements())
  ; 上面函数中第一个参数传入文件夹的路径, 第二个参数传入 需要指定获取文件的类型(譬如这里是*.hdf)。 注意,这里搜索的文件不只是本文件夹,还有本文件夹的子文件等等。
  ; 待提取点的经纬度
  extract_lat = 39.90
  extract_lon = 116.40
  ; 寻找距离上面待提取点最近的点的AOD——思路——使用距离公式求得最近的点以及位置(经纬度和行列数), 输出该点的经纬度以及AOD
  ; 首先每个文件都有要获取的数据,所以需要循环
  ; 获取循环所需的文件的个数————》通过n_elements()函数获取数组的元素个数(其实这里多余,只是为了展示既可以像上面count=得到文件数,也可以使用函数获取,当然,现在这种方法普遍性更好)
  file_count = n_elements(file_path_list)  ; 传入一个数组,返回数组的元素个数
  for file_i = 0, file_count - 1 do begin  ; 文件数-1不要忘了
    ; 通过文件名获取日期
    ; 先通过文件的路径获取文件名称
    file_name = file_basename(file_path_list[file_i])
    ; 在处理文件名称获取日期————》通过strmid()函数对字符串进行切片处理
    file_date = strmid(file_name, 10, 7)
    ; 获取该日期的儒略日
    ; 思路:直接获取需要该日期的年月日,而我们发现得到的file_date是年加该年已经过去的天数,所以我们获取上一年的最后一天的儒略日加上年已经过去的天数就是儒略日
    ; 获取该日期的的年、已经过的天数
;    file_date_year = fix(strcompress(strmid(file_name, 10, 4))) ; fix将str型的转化为int型
    file_date_year = strmid(file_name, 10, 4) ; fix将str型的转化为int型
;    file_date_days = fix(strcompress(strmid(file_name, 14, 3)))
    file_date_days = strmid(file_name, 14, 3)
    ; 获取上一年最后一天的儒略日
    julian_lastyear = imsl_datetodays(31, 12, file_date_year - 1)  ; 上一年需要减一
    ; 获取该年的儒略日
    file_date_julian = julian_lastyear + file_date_days
    ; 获取该年的年月日
    imsl_daystodate, file_date_julian, file_day, file_month, file_year
    ; 获取索引为file_i的文件中AOD数据集的AOD数据
    file_ds_aod = get_ds_data(file_path_list[file_i], 'Image_Optical_Depth_Land_And_Ocean')
    ; 获取索引为file_i的文件中经纬度数据集的经纬度数据
    file_ds_lon = get_ds_data(file_path_list[file_i], 'Longitude')
    file_ds_lat = get_ds_data(file_path_list[file_i], 'Latitude')
    ; 获取属性值——》这里计算真实的aod数据需要两个属性值(一个scale_factor, 另一个是_filevalue)
    file_aod_sf = get_att_data(file_path_list[file_i], 'Image_Optical_Depth_Land_And_Ocean', 'scale_factor')
    file_aod_fv = get_att_data(file_path_list[file_i], 'Image_Optical_Depth_Land_And_Ocean', '_FillValue')
    ; 计算真实的aod数据
    file_ds_aod = (file_ds_aod ne file_aod_fv[0]) * file_ds_aod * file_aod_sf[0]
    ; 由于获取的属性值是array,所以需要指定索引
    ; 计算所有的点与待提取点的距离
    distance = ((file_ds_lon - extract_lon) ^ 2 + (file_ds_lat - extract_lat) ^ 2) ^ 0.5
    ; 找到最小的距离
    min_distance = min(distance)
    ; 找到最小距离所在的点的行列数(因为是distance是数组, 所以是行列数)
    min_pos = where(min_distance eq distance)
    ; 如果aod是0, 那么说明aod是无效的, 因为前面我们对file_ds_aod ne file_aod_fv[0], 所以,aod=0说明aod是无效值,那么我们不输出
    if file_ds_aod[min_pos] eq 0.0 then begin
      continue
    endif
    ; 输出
    print, [file_year, file_month, file_day, file_ds_lon[min_pos], file_ds_lat[min_pos], file_ds_aod[min_pos]], format='(i0, "-", i02, "-", i02, ",", 3(f0.3, :, ","))'
    ; 上面的fromat如果没有:, 那么输出时的末端正常来说会有一个逗号, 但是我们觉得逗号是多余的,所以加上:可以使得最后面的逗号不输出
    ; 输出还需要注意f表示浮点型,i表示整型, 需要控制0的输出和C语言是一样的, 譬如f0.3中3表示小数位保留三位,采用四舍五入保留
    ; 另外,我们print输出数字时通常数字前面会带有很多空格,那是因为该数字的有效位数有这么多,但是实际上我们输出时通常又不需要这些空格,可以使用f0, 那个0起这个作用
    ; 再有, f012.4这些我觉得其实和C语言很相像, 所以这里讲也不一定会听的很明白,我的建议是自己去试试,你会有很对感悟的。
  endfor
end

3.2 输出结果:

IDL> week_two_test

% Compiled module: GET_DS_DATA.

% Compiled module: GET_ATT_DATA.

% Compiled module: WEEK_TWO_TEST.

2018-05-02,116.379,39.887,0.329

2018-05-03,116.395,39.899,0.408

2018-05-04,116.374,39.877,0.820

2018-05-04,116.354,39.889,0.802

2018-05-06,116.478,39.287,0.375

2018-05-18,116.386,39.903,0.744

2018-05-18,113.432,39.607,0.134

2018-05-22,116.382,39.886,0.594

2018-05-23,116.385,39.892,0.404

2018-05-23,116.300,40.478,0.196

2018-05-25,116.422,39.910,1.019

2018-05-27,116.770,38.303,0.406

2018-05-27,116.417,39.908,0.292

2018-05-28,116.397,39.892,0.435

2018-05-29,116.391,39.890,0.309

2018-05-30,116.405,39.912,0.359

2018-05-31,116.364,39.901,0.566

IDL>  


目录
相关文章
|
1月前
|
运维 网络协议 网络安全
Kali虚拟机间搭建iodine DNS隧道实验指南
本指南介绍如何在两台Kali虚拟机间使用iodine搭建DNS隧道。通过服务端(192.168.1.44)与客户端(192.168.1.36)配置,利用DNS查询建立虚拟局域网,实现受限网络下的隐蔽通信。包含环境准备、命令详解、连通性测试及故障排查,助你快速掌握DNS隧道技术原理与实践应用。(238字)
338 7
|
自然语言处理 数据可视化 API
淘宝商品评论 API 接口:深度解析用户评论,优化产品与服务
淘宝是领先的中国电商平台,其API为开发者提供商品信息、交易记录及用户评价等数据访问服务。对于获授权的开发者和商家,可通过申请API权限、获取并解析评论数据来进行情感分析和统计,进而优化产品设计、提升服务质量、增强用户互动及调整营销策略。未授权用户可能受限于数据访问。
|
9月前
|
弹性计算 运维 网络安全
阿里云轻量应用服务器产品解析与搭建个人博客网站教程参考
轻量应用服务器(Simple Application Server)作为阿里云面向单机应用场景推出的云服务器产品,以其一键部署、一站式管理、高性价比等特性,深受个人开发者、中小企业及入门级用户的喜爱。本文将全面解析阿里云轻量应用服务器的产品优势、应用场景、使用须知,以及使用轻量应用服务器搭建个人博客网站的详细教程,帮助用户更好地了解和使用这一产品。
|
11月前
|
缓存 网络协议 安全
融合DNS技术产品和生态
本文介绍了阿里云在互联网基础资源领域的最新进展和解决方案,重点围绕共筑韧性寻址、赋能新质生产展开。随着应用规模的增长,基础服务的韧性变得尤为重要。阿里云作为互联网资源的践行者,致力于推动互联网基础资源技术研究和自主创新,打造更韧性的寻址基础服务。文章还详细介绍了浙江省IPv6创新实验室的成立背景与工作进展,以及阿里云在IPv6规模化部署、DNS产品能力升级等方面的成果。此外,阿里云通过端云融合场景下的企业级DNS服务,帮助企业构建稳定安全的DNS系统,确保企业在数字世界中的稳定运行。最后,文章强调了全链路极致高可用的企业DNS解决方案,为全球互联网基础资源的创新提供了中国标准和数字化解决方案。
|
11月前
|
存储 搜索推荐 数据挖掘
投资回报与预算考量:CRM产品报价全解析
在当今竞争激烈的商业环境中,CRM系统已成为企业不可或缺的工具。它能有效管理客户信息、提升销售效率、优化服务并增强忠诚度。选择合适的CRM需考虑功能、用户数量、定制需求、技术支持及数据安全等因素,确保在预算内实现最大价值。企业在挑选时应明确需求、比较产品、评估长期回报,并考虑扩展性。最适合自己业务需求的CRM才是最佳选择。
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
838 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
338 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多
  • DNS