Python >> Tutoriel Python >  >> Python Tag >> Array

Ouverture du fichier EOS netCDF4/HDF5 au format correct à l'aide de xarray ?

Pour ouvrir les données avec les informations de projection, vous devez ouvrir les sous-ensembles de données individuellement.

J'utiliserai un jeu de données MODIS que j'ai sous la main comme exemple, MOD11A1, mais il en sera de même pour le vôtre. Vous pouvez obtenir le nom de fichier des sous-ensembles de données en utilisant rasterio par exemple :

import rasterio
filename = '/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf'
with rasterio.open(filename) as src:
    subdatasets = src.subdatasets

Vous pouvez utiliser gdal plutôt que rasterio :

import gdal
g = gdal.Open(filename)
subdatasets = g.GetSubDatasets()

Dans cet exemple, les sous-ensembles de données ressemblent à :

print(subdatasets)
['HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:LST_Day_1km', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Emis_32', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Clear_day_cov', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Clear_night_cov', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:QC_Day', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Day_view_time', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Day_view_angl', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:LST_Night_1km', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:QC_Night', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Night_view_time', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Night_view_angl', 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:Emis_31']

L'ouverture de l'un de ces sous-ensembles de données en tant que xarray préservera les informations de projection :

import xarray as xr
fname = 'HDF4_EOS:EOS_GRID:/data/MOD11A1.A2019225.h17v03.006.2019226085002.hdf:MODIS_Grid_Daily_1km_LST:LST_Day_1km'
myDataset = xr.open_rasterio(fname)

Et j'ai un xarray avec des informations de projection :

print(myDataset)
<xarray.DataArray (band: 1, y: 1200, x: 1200)>
[1440000 values with dtype=uint16]
Coordinates:
  * band     (band) int64 1
  * y        (y) float64 6.671e+06 6.67e+06 6.669e+06 ... 5.561e+06 5.56e+06
  * x        (x) float64 -1.111e+06 -1.111e+06 -1.11e+06 ... -1.39e+03 -463.3
Attributes:
    transform:     (926.6254331391667, 0.0, -1111950.519767, 0.0, -926.625433...
    crs:           +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=637100...
    res:           (926.6254331391667, 926.6254331383334)
    is_tiled:      0
    nodatavals:    (0.0,)
    scales:        (0.02,)
    offsets:       (0.0,)
    descriptions:  ('Daily daytime 1km grid Land-surface Temperature',)
    units:         ('K',)

Si vous avez besoin de tous les sous-ensembles de données, il est nécessaire de parcourir chaque sous-produit, puis de les ajouter à un ensemble de données xarray.