[EDIT 1 - Ich habe die Pixelkoordinatensuche geändert]
Unter Verwendung dieser Probe von MODATML dass Sie zur Verfügung gestellt und gdal Bibliothek. Öffnen wir das hdf mit gdal:
import gdal
dataset = gdal.Open(r"E:\modis\MODATML2.A2018182.0800.061.2018182195418.hdf")
Dann wollen wir sehen, wie die Subdatasets benannt sind, um die benötigten Subdatensätze korrekt zu importieren:
datasets_meta = dataset.GetMetadata("SUBDATASETS")
Dies gibt ein Wörterbuch zurück:
datasets_meta
>>>{'SUBDATASET_1_NAME': 'HDF4_EOS:EOS_SWATH:"E:\\modis\\MODATML2.A2018182.0800.061.2018182195418.hdf":atml2:Cloud_Optical_Thickness',
'SUBDATASET_1_DESC': '[406x271] Cloud_Optical_Thickness atml2 (16-bit integer)',
'SUBDATASET_2_NAME':'HDF4_EOS:EOS_SWATH:"E:\\modis\\MODATML2.A2018182.0800.061.2018182195418.hdf":atml2:Cloud_Effective_Radius',
'SUBDATASET_2_DESC': '[406x271] Cloud_Effective_Radius atml2 (16-bit integer)',
[....]}
Angenommen, wir möchten die erste Variable, die optische Dicke der Wolke, erhalten. Wir können auf ihren Namen zugreifen, indem wir:
datasets_meta['SUBDATASET_1_NAME']
>>>'HDF4_EOS:EOS_SWATH:"E:\\modis\\MODATML2.A2018182.0800.061.2018182195418.hdf":atml2:Cloud_Optical_Thickness'
Jetzt können wir die Variable erneut in den Speicher laden .Open () -Methode:
Cloud_opt_th = gdal.Open(datasets_meta['SUBDATASET_1_NAME'])
Sie können beispielsweise auf Precipitable_Water_Infrared_ClearSky zugreifen, an dem Sie interessiert sind, indem Sie 'SUBDATASET_20_NAME' angeben. Schauen Sie sich einfach das Wörterbuch datasets_meta an.
Die extrahierte Variable verfügt jedoch nicht über eine Geoprojektion (var.GetGeoprojection ()), wie Sie es von anderen Dateitypen wie GeoTiff erwarten würden. Sie können die Variable als Numpy-Array laden und die 2d-Variable ohne Projektion zeichnen:
Cloud_opt_th_array = Cloud_opt_th.ReadAsArray()
import matplotlib.pyplot as plt
plt.imshow(Cloud_opt_th_array)
Da es keine Geoprojektion gibt, werden wir die Metadaten der Variablen untersuchen:
Cloud_opt_th_meta = Cloud_opt_th.GetMetadata()
Dies ist ein weiteres Wörterbuch, das alle Informationen enthält, die Sie benötigen, einschließlich einer langen Beschreibung der Unterabtastung (ich habe festgestellt, dass dies nur mit dem ersten Unterdatensatz bereitgestellt wird), die die Erläuterung dieser Cell_Along_Swath enthält:
Cloud_opt_th_meta['1_km_to_5_km_subsampling_description']
>>>'Each value in this dataset does not represent an average of properties over a 5 x 5 km grid box, but rather a single sample from within each 5 km box. Normally, pixels in across-track rows 4 and 9 (counting in the direction of increasing scan number) out of every set of 10 rows are used for subsampling the 1 km retrievals to a 5 km resolution. If the array contents are determined to be all fill values after selecting the default pixel subset (e.g., from failed detectors), a different pair of pixel rows is used to perform the subsampling. Note that 5 km data sets are centered on rows 3 and 8; the default sampling choice of 4 and 9 is for better data quality and avoidance of dead detectors on Aqua. The row pair used for the 1 km sample is always given by the first number and last digit of the second number of the attribute Cell_Along_Swath_Sampling. The attribute Cell_Across_Swath_Sampling indicates that columns 3 and 8 are used, as they always are, for across-track sampling. Again these values are to be interpreted counting in the direction of the scan, from 1 through 10 inclusively. For example, if the value of attribute Cell_Along_Swath_Sampling is 3, 2028, 5, then the third and eighth pixel rows were used for subsampling. A value of 4, 2029, 5 indicates that the default fourth and ninth rows pair was used.'
Ich denke, dies bedeutet, dass basierend auf diesen 1 km-Pixeln die 5 km erstellt wurden, wobei genau die Pixelwerte an einer bestimmten Position im 5x5-Erfassungsarray verwendet wurden (die Position wird in den Metadaten angegeben, ich denke, dies ist ein Instrument, um Fehler zu reduzieren).
Jedenfalls haben wir zu diesem Zeitpunkt eine Reihe von Zellen 1x1 km (siehe Beschreibung der Unterabtastung oben, nicht sicher über die Wissenschaft dahinter). Um die Koordinaten jedes Pixelschwerpunkts zu erhalten, müssen die Unterdatensätze für Breite und Länge geladen werden.
Latitude = gdal.Open(datasets_meta['SUBDATASET_66_NAME']).ReadAsArray()
Longitude = gdal.Open(datasets_meta['SUBDATASET_67_NAME']).ReadAsArray()
Beispielsweise,
Longitude
>>> array([[-133.92064, -134.1386 , -134.3485 , ..., -154.79303, -154.9963 ,
-155.20723],
[-133.9295 , -134.14743, -134.3573 , ..., -154.8107 , -155.01431,
-155.2256 ],
[-133.93665, -134.1547 , -134.36465, ..., -154.81773, -155.02109,
-155.23212],
...,
[-136.54477, -136.80055, -137.04684, ..., -160.59378, -160.82101,
-161.05663],
[-136.54944, -136.80536, -137.05179, ..., -160.59897, -160.8257 ,
-161.06076],
[-136.55438, -136.81052, -137.05714, ..., -160.6279 , -160.85527,
-161.09099]], dtype=float32)
Möglicherweise stellen Sie fest, dass die Längen- und Breitengradkoordinaten für jedes Pixel unterschiedlich sind.
Angenommen, Ihr Observatorium befindet sich an den Koordinaten lat_obs, long_obs, als Sie die Differenz der x- und y-Koordinaten minimieren:
coordinates = np.unravel_index((np.abs(Latitude - lat_obs) + np.abs(Longitude - long_obs)).argmin(), Latitude.shape)
und extrahieren Sie Ihren Wert
Cloud_opt_th_array[coordinates]