读取HDF或者NetCDF格式的栅格数据

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: HDF是对HDF数据模型,数据格式以及HDF库API等一系列技术的总称. HDF的最新版本是HDF5.HDF数据模型基于组(groups)和数据集(datasets)概念:如果把HDF数据比作磁盘,那么组相当于文件夹,数据集相当于文件。组和数据集都有用户自定义的属性(attributes).MODIS影像,以及我国的风云卫星数据都适用HDF格式进行存储.

读取HDF或者NetCDF格式的栅格数据

作者:阿振

邮箱:tanzhenyugis@163.com

博客:https://blog.csdn.net/theonegis/article/details/80089375

修改时间:2018-05-25

声明:本文为博主原创文章,转载请注明原文出处


HDF和NetCDF简介

HDF

HDF(Hierarchical Data Format)由NCSA(National Center for Supercomputing Applications)设计提出,官方对其定义是:HDF5 is a unique technology suite that makes possible the management of extremely large and complex data collections.

HDF supports n-dimensional datasets and each element in the dataset may itself be a complex object.

HDF是对HDF数据模型,数据格式以及HDF库API等一系列技术的总称. HDF的最新版本是HDF5.

HDF数据模型基于组(groups)和数据集(datasets)概念:如果把HDF数据比作磁盘,那么组相当于文件夹,数据集相当于文件。组和数据集都有用户自定义的属性(attributes).

MODIS影像,以及我国的风云卫星数据都适用HDF格式进行存储.

NetCDF

NetCDF(Network Common Data Format)由UCAR(University Corporation for Atmospheric Research)设计提出,其官方的定义是:NetCDF is a set of software libraries and self-describing, machine-independent data formats that support the creation, access, and sharing of array-oriented scientific data.

NetCDF是面向多维数组的数据集,一个NetCDF文件主要是Dimensions, Variables, Attributes, Data 四个部分组成的:

  • Dimension主要是对维度的定义说明,例如:经度,维度,时间等;
  • Variables是对数据表示的现象的说明,例如:温度,湿度,高程等;
  • Attributes是一些辅助的元信息说明,例如变量的单位等;
  • Data是主要对现象的观测数据集。

NetCDF有两个数据模型:经典模型(NetCDF3之前模型)和增强模型(NetCDF4)

NetCDF最新版本是NetCDF4,NetCDF4的API接口建立在HDF5之上,和HDF5是兼容的.

如果搞大气研究的同学一定对NetCDF格式不陌生,接触到的大部分数据都是这种格式.

HDF和NetCDF栅格数据集特点

HDF和NetCDF数据都可能包含数据子集(一个文件中包含多个子文件),我们需要找出需要的子集数据,然后就可以像普通的GeoTIFF影像那样进行读写和操作了.

GDAL读取实例

下面的例子读取MODIS地标反射率(Surface Reflectance)数据中的第一波段,然后转为GeoTIFF进行存储.

我们首先使用gdal.Open()函数读取HDF数据,然后使用GetSubDatasets()方法取出HDF数据中存储的子数据集信息,该方法返回的结果是一个listlist的每个元素是一个tuple,每个tuple中包含了对子数据集的表述信息.

对于MODIS数据,tuple的第一个元素是子数据集的完整路径,所以我们取出该路径,然后使用gdal.Open()函数读取该子数据集.

最后我们使用CreateCopy()方法将该子数据集存储为GeoTIFF格式的数据。

所以,总结一下,我们读取HDF或者NetCDF数据子集的时候,最主要的是取出想要处理的子数据集的完整路径。然后就像读取普通GeoTIFF影像那样对子数据集进行读取就OK了.

from osgeo import gdal

root_ds = gdal.Open('example.hdf')
# 返回结果是一个list,list中的每个元素是一个tuple,每个tuple中包含了对数据集的路径,元数据等的描述信息
# tuple中的第一个元素描述的是数据子集的全路径
ds_list = root_ds.GetSubDatasets()

band_1 = gdal.Open(ds_list[11][0])  # 取出第12个数据子集(MODIS反射率产品的第一个波段)
arr_bnd1 = band_1.ReadAsArray()  # 将数据集中的数据转为ndarray

# 创建输出数据集,转为GeoTIFF进行写入
out_file = 'sr_band1.tif'
driver = gdal.GetDriverByName('GTiff')
out_ds = driver.CreateCopy(out_file, band_1)
out_ds.GetRasterBand(1).WriteArray(arr_bnd1)
out_ds.FlushCache()

# 关闭数据集
out_ds = None
root_ds = None
目录
相关文章
|
3月前
|
Java Apache
导出csv格式的文件
导出csv格式的文件
36 0
|
9月前
|
存储 Python
【可定制、转换时间戳】解析nc文件,并保存为csv文件
【可定制、转换时间戳】解析nc文件,并保存为csv文件
398 4
|
3月前
|
存储 定位技术 Python
Python中ArcPy实现栅格图像文件由HDF格式批量转换为TIFF格式
Python中ArcPy实现栅格图像文件由HDF格式批量转换为TIFF格式
ENVI_IDL:如何读取HDF4文件和HDF5文件的数据集和属性?
参考Documentation Center (l3harrisgeospatial.com) 由于时间和精力,这里并没有对其中的函数进行详细的说明,只是介绍了函数作用以及用法。
177 0
|
索引
ENVI_IDL:如何读取HDF4数据?
ENVI_IDL:如何读取HDF4数据?
171 0
|
11月前
|
API C++ Python
Fiona简介及Shapefile数据读取
用GDAL的Python绑定API书写程序有没有一种仍然在写C/C++的感觉,Fiona基于GDAL提供了更加Pythonic的读取空间矢量数据的API,参见:http://toblerity.org/fiona/index.html
79 0
|
11月前
|
数据处理 索引 Python
使用Rasterio读取栅格数据
有没有觉得用GDAL的Python绑定书写的代码很不Pythonic,强迫症的你可能有些忍受不了。不过,没关系,MapBox旗下的开源库Rasterio帮我们解决了这个痛点。 Rasterio是基于GDAL库二次封装的更加符合Python风格的主要用于空间栅格数据处理的Python库。
114 0
|
存储
ENVI_IDL:批量获取影像文件各个波段的中值并输出为csv文件
ENVI_IDL:批量获取影像文件各个波段的中值并输出为csv文件
258 0
|
存储 编解码
ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析
ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析
351 1
|
存储
ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析
ENVI_IDL: 创建HDF5文件并写入数据(以将Geotiff文件写入HDF文件为例) + 详细解析
149 0