[EDIT 1 - Saya mengubah pencarian koordinat piksel]
Menggunakan contoh MODATML yang Anda berikan dan menggunakan pustaka gdal. Mari kita buka hdf dengan gdal:
import gdal
dataset = gdal.Open(r"E:\modis\MODATML2.A2018182.0800.061.2018182195418.hdf")
Lalu kami ingin melihat bagaimana subdataset dinamai untuk mengimpor yang kita butuhkan dengan benar:
datasets_meta = dataset.GetMetadata("SUBDATASETS")
Ini mengembalikan kamus:
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)',
[....]}
Katakanlah kita ingin mendapatkan variabel pertama, ketebalan optik cloud, kita dapat mengakses namanya dengan:
datasets_meta['SUBDATASET_1_NAME']
>>>'HDF4_EOS:EOS_SWATH:"E:\\modis\\MODATML2.A2018182.0800.061.2018182195418.hdf":atml2:Cloud_Optical_Thickness'
Sekarang kita dapat memuat variabel dalam pemanggilan memori lagi. Buka () metode:
Cloud_opt_th = gdal.Open(datasets_meta['SUBDATASET_1_NAME'])
Misalnya, Anda dapat mengakses Precipitable_Water_Infrared_ClearSky yang Anda minati dengan memberikan 'SUBDATASET_20_NAME'. Lihat saja kamus data dataset.
Namun, variabel yang diekstraksi tidak memiliki geoprojection (var.GetGeoprojection ()) seperti yang Anda harapkan dari tipe file lain seperti GeoTiff. Anda dapat memuat variabel sebagai array numpy dan plot variabel 2d tanpa proyeksi:
Cloud_opt_th_array = Cloud_opt_th.ReadAsArray()
import matplotlib.pyplot as plt
plt.imshow(Cloud_opt_th_array)
Sekarang, karena tidak ada geoprojection, kita akan melihat metadata dari variabel:
Cloud_opt_th_meta = Cloud_opt_th.GetMetadata()
Ini adalah kamus lain yang mencakup semua informasi yang Anda butuhkan, termasuk deskripsi panjang tentang subsampling (saya perhatikan ini disediakan hanya dengan subdataset pertama), yang mencakup penjelasan Cell_Along_Swath ini:
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.'
Saya pikir ini berarti bahwa berdasarkan piksel 1 km ini 5km dibangun dengan mengambil nilai piksel tepat pada posisi tertentu dalam array penginderaan 5x5 (posisi ditunjukkan dalam metadata, saya pikir ini adalah instrumen untuk mengurangi kesalahan).
Bagaimanapun, pada titik ini kami memiliki array sel 1x1 km (lihat deskripsi sub-contoh di atas, tidak yakin tentang ilmu di baliknya). Untuk mendapatkan koordinat dari setiap pixel centroid, kita perlu memuat subdataset lintang dan bujur.
Latitude = gdal.Open(datasets_meta['SUBDATASET_66_NAME']).ReadAsArray()
Longitude = gdal.Open(datasets_meta['SUBDATASET_67_NAME']).ReadAsArray()
Sebagai contoh,
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)
Anda mungkin memperhatikan bahwa koordinat Lintang dan Bujur berbeda untuk setiap piksel.
Katakanlah observatorium Anda terletak di koordinat lat_obs, long_obs, daripada Anda meminimalkan perbedaan koordinat x, y:
coordinates = np.unravel_index((np.abs(Latitude - lat_obs) + np.abs(Longitude - long_obs)).argmin(), Latitude.shape)
dan ekstrak nilaimu
Cloud_opt_th_array[coordinates]