【问题标题】:Unable to read HDF4 dataset using pyhdf (pyhdf.error.HDF4Error: select: non-existent dataset )无法使用 pyhdf 读取 HDF4 数据集(pyhdf.error.HDF4Error: select: non-existent dataset )
【发布时间】:2018-04-06 17:56:52
【问题描述】:

我正在尝试读取 HDF4 文件 (https://www.dropbox.com/s/5d40ukfsu0yupwl/MOD13A2.A2016001.h23v05.006.2016029070140.hdf?dl=0)。

import os
import numpy as np
from pyhdf.SD import SD, SDC

# Open file.
FILE_NAME = 'MOD13A2.A2016001.h23v05.006.2016029070140.hdf'
hdf = SD(FILE_NAME, SDC.READ)

# List available SDS datasets.
print (hdf.datasets())

# Read dataset.
DATAFIELD_NAME="1_km_16_days_NDVI"
data2D = hdf.select(DATAFIELD_NAME)
data = data2D[:,:] 

当我执行此脚本时,我收到以下错误: 回溯(最近一次通话最后): 文件“Test.py”,第 15 行,在 data2D = hdf.select(DATAFIELD_NAME) 文件“C:\Python35\lib\site-packages\pyhdf\SD.py”,第 1599 行,在选择中 raise HDF4Error("选择:不存在的数据集") pyhdf.error.HDF4Error:选择:不存在的数据集

我使用过类似的 python 代码来读取其他 HDF4 文件,它运行良好。但我无法理解这种情况下的问题。

【问题讨论】:

    标签: python hdf


    【解决方案1】:

    如果您仔细查看print(hdf.datasets()) 的输出,您会注意到 以下行:

     ...
     '1 km 16 days NDVI': (('YDim:MODIS_Grid_16DAY_1km_VI',
                            'XDim:MODIS_Grid_16DAY_1km_VI'),
                           (1200, 1200),
                           22,
                           0),
     ...
    

    键是数据集的名称。请注意,该名称使用空格分隔单词,而不是您的示例中的下划线。

    如果您将DATAFIELD_NAME 替换为DATAFIELD_NAME='1 km 16 days NDVI'。即用数据集名称中的空格替换下划线,您的代码将可以正常工作。

    这足以访问磁贴内的数据,但地理定位需要更多工作。目前,您已经可以使用

    可视化数据
    from matplotlib import pyplot as plt
    plt.imshow(data)
    plt.colorbar()
    plt.show()
    

    剩下要做的是

    • 扩展到科学单位
    • 地理位置

    顺便说一句,请务必使用pprint 模块输出结构复杂的大型字典,即将print(hdf.datasets()) 替换为

    import pprint
    ...
    pprint.pprint(hdf.datasets())
    

    【讨论】:

    • 感谢您的回复。它现在工作正常。我面临这个数据集的另一个问题。我无法从此文件中提取地理位置字段(即纬度/经度)。当我在 Panoply 软件中打开 HDF 文件时,它显示 XDim 和 YDim 数组,但 pprint outptut 或 HDFView 软件不显示这些数组。你能帮我解决这个问题吗?
    • @YogeshSathe HDF-EOS 瓦片数据文件不携带地理定位数组。由于数据位于规则网格上(在 MODIS 正弦投影中),您可以从可以从CoreMetadata.0StructMetadata.0 属性读取的瓦片角坐标恢复每个像素的地理位置。查看print(getattr(hdf,'CoreMetadata.0'))print(getattr(hdf,'StructMetadata.0')) 的输出。
    • 再次感谢您的回复。我尝试了您建议的方式,但无法提取地理位置。你能否举一个例子/链接为python中的每个像素提取地理位置
    • 在你的方向搜索后,我得到了这个例子,它也读取指定文件的纬度/经度[链接] (hdfeos.org/zoo/LPDAAC/MOD13A1_500m_16_days_EVI.py)
    • @YogeshSathe 这个例子依赖于外部工具,GDAL 或eos2dump。恕我直言,可惜 pyhdf 开发未能完全在 Python 中进行计算。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多