【问题标题】:Read/Open a modis aqua .hdf file and display/plot the output in gdal and matplotlib读取/打开 modis aqua .hdf 文件并在 gdal 和 matplotlib 中显示/绘制输出
【发布时间】:2014-05-07 08:44:08
【问题描述】:

我已经尝试并搜索了如何解决这个问题,但仍然找不到如何从给定的 Modis Aqua .hdf 文件中读取和绘制 gdal 和 matplotlib 的方法。任何帮助深表感谢。顺便说一句,我在 Windows 7 中使用 Python 2.7.5。文件名是 A2014037040000.L2_LAC.SeAHABS.hdf。在 hdf 文件的地球物理数据中,我只会使用 chlor_a。

更新:

这里是示例文件的链接。

A2014037040500.L2_LAC.SeAHABS.hdf

【问题讨论】:

    标签: python image python-2.7 gdal pyhdf


    【解决方案1】:

    您应该尝试为 MODIS 数据集设置数据类型。我猜是 16 位无符号数

    ds=gdal.Open(hdfpath) 数据 = ds.GetRasterBand(N).ReadAsArray().astype(numpy.uint16)

    N 是您感兴趣的数据的波段编号。你可以试试用QGIS或者ENVI打开看看HDF文件的结构。

    请记住,波段从 1 开始,而不是 0。第一个波段是 1。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      HDF 的诀窍在于大多数时候您需要一个特定的子数据集。如果您使用 GDAL,则需要打开直接指向该子数据集的 HDF:

      import gdal
      import matplotlib.pyplot as plt
      
      ds = gdal.Open('HDF4_SDS:UNKNOWN:"MOD021KM.A2013048.0750.hdf":6')
      data = ds.ReadAsArray()
      ds = None
      
      fig, ax = plt.subplots(figsize=(6,6))
      
      ax.imshow(data[0,:,:], cmap=plt.cm.Greys, vmin=1000, vmax=6000)
      

      您还可以打开“主”HDF 文件并检查子数据集,然后从那里开始:

      # open the main HDF
      ds = gdal.Open('MOD021KM.A2013048.0750.hdf')
      
      # get the path for a specific subdataset
      subds = [sd for sd, descr in ds.GetSubDatasets() if descr.endswith('EV_250_Aggr1km_RefSB (16-bit unsigned integer)')][0]
      
      # open and read it like normal
      dssub = gdal.Open(subds)
      data = dssub.ReadAsArray()
      dssub = None
      
      ds = None
      

      【讨论】:

      • 我已经试过你上面的脚本,但是出现错误, >>> import gdal >>> import matplotlib.pyplot as plt >>> >>> ds = gdal.Open("A2014037040500.L2_LAC.SeAHABS.hdf") >>> data = ds. ReadAsArray()' Traceback(最近一次调用最后):文件“”,第 1 行,在 数据 = ds.ReadAsArray() AttributeError: 'NoneType' 对象没有属性“ReadAsArray”
      • 这意味着变量ds 是None,这反过来意味着gdal 无法打开它。您可能提供了错误的位置或其他内容,或者您​​的 gdal build 没有必要的驱动程序。尝试在其上运行 gdalinfo,这应该会给出更清晰的错误消息。
      • 发生错误:回溯(最近一次调用最后一次):文件“C:\path\to\file\1.py”,第 5 行,在 data = ds.ReadAsArray() 文件中“C:\Python27\lib\site-packages\osgeo\gdal.py”,第 729 行,在 ReadAsArray 中返回 gdalnumeric.DatasetReadAsArray(self, xoff, yoff, xsize, ysize, buf_obj) 文件“C:\Python27\lib\ site-packages\osgeo\gdal_array.py",第 175 行,在 DatasetReadAsArray datatype = ds.GetRasterBand(1).DataType AttributeError: 'NoneType' object has no attribute 'DataType'
      • 有可能得到这样的地理位置数据吗?我们如何用数据中存储的坐标系而不是轴上的像素数来绘制图片?
      猜你喜欢
      • 2022-11-12
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      相关资源
      最近更新 更多