GDAL读取MAIAC的HDF文件(熟肉)
一个有趣的灵魂W
MAIAC全称Multi-Angle Implementationof Atmospheric Correction algorithm (多角度大气校正算法),主要生产的是气溶胶光学厚度(AOD)产品,在MODIS数据库中的序列号是MCD19A2,目前有c6和c6.1两个版本。空间分辨率1km,时间分辨率为1d。这个算法得到的AOD更为精确,同时获得的AOD范围也更为广泛。有兴趣的同学可以到NASA官网了解更为丰富的MAIAC算法细节(本文不做扩展)。
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。可以读取主流的栅格格式(以下是部分GDAL支持的栅格格式)。
MAIAC产品在NASA官网中以HDF(Hierarchical Data Format)存储的格式为主。这个格式可以存储不同类型的
图像
和数码数据的文件格式,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。大多数普通计算机都支持这种文件格式。
好了,前言部分介绍完毕,接下来需要获取一个HDF文件进行解析,你可以选择Earth或者Disc下载一个MAIAC的文件。具体可以进NASA的官网注册账号,选择数据并下载(这里也不做展开了)。
1、注册-登录
2、搜索选择数据
3、下载
于是我得到了一个HDF(其实是一堆)数据:
这里有几个注意的:
A2017365代表数据的时间,2017是年份,365代表第365天的数据。h21v03代表数据的位置,后部分不重要了(具体我也忘了,有兴趣的可以参考用户手册)。
一切预备工作齐备,接下来就是利用Python+GDAL进行读取的工作。
首先,导入库:
import gdal
紧接着,重头戏,开始读取:
hdf=r'C:pytempThesisaodrepairmaiachdfMCD19A2.A2017365.h21v03.006.2018119214031.hdf'
ds=gdal.Open(hdf)
sub=ds.GetSubDatasets()
可以发现,HDF文件中包含了13个层。其中第一层是470nm处AOD信息(顺带说一句,Python的计数基本都是从0开始)。
第二层是550nm处的AOD:
数据的位数都是16bit。
其他层都是一些辅助信息,包括不确定性层、质量控制层、角度层等(有兴趣的可以去查一查用户手册,了解更多信息)。
到了这步已经结束了吗?并没有,还需要继续深扒层里的信息和数据,重新利用GDAL打开550nmAOD层的信息,并转为数组,才算正确读取为可以直接运行和计算的部分。
pb=sub[1][0]
b=gdal.Open(pb)
barr=b.ReadAsArray()
这样:
可以看到barr中是一个3维的数组。为什么有3维,这跟它的算法有莫大关系,简而言之,算法里包含了时间维度的检测,所以成了3维的数据。
以上,就是今天要讲解的HDF数据的读取~
彩蛋~
数据打开了,稍加处理(选取每个维度的最大值):
max函数
最后得到这么一张AOD分布图。
好啦~今天到此为止
往期
微信号:一个有趣的灵魂W
喜欢就关注我们吧
- 3377: [Usaco2004 Open]The Cow Lineup 奶牛序列
- 3301: [USACO2011 Feb] Cow Line
- SQL Server 索引和表体系结构(包含列索引)
- TiDB 源码阅读系列文章(七)基于规则的优化
- 博弈论入门之nim游戏
- 1477: 青蛙的约会
- 2045: 双亲数
- 树莓派常用文本编辑器
- BZOJ1299: [LLH邀请赛]巧克力棒(Nim游戏)
- 2301: [HAOI2011]Problem b
- mysql相关命令
- mac python3 安装 mysqlclient包失败如何解救
- SQL Server 深入解析索引存储(上)
- 1475: 方格取数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 超级播放器tcplayer如何设置logo
- 【Flutter 实战】1.20版本更新及新增组件
- 手把手教你使用Python实现常用的假设检验 !
- Oracle 每日一题系列合集
- Arrow更好用的python时间序列处理库,你用过吗?
- 死信队列监听补充
- 手把手教你用Python查询你的物流信息
- Selenium自动登录淘宝,我无意间发现了登录漏洞!
- 【DB宝20】在Docker中分分钟即可拥有OGG Director环境
- mq监听死信队列后如何处理
- 【小白学PyTorch】7 最新版本torchvision.transforms常用API翻译与讲解
- 小白学PyTorch | 8 实战之MNIST小试牛刀
- 干货:用好VSCode这13款插件和8个快捷键,工作效率提升10倍
- 使用dplyr包对表格整理
- 安利 5 个拍案叫绝的 Matplotlib 骚操作!