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

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

推荐镜像

更多