विशिष्ट अक्षांश पर मान निकालना, MODIS स्वाथ डेटा से देशांतर


9

मैं पृथ्वी पर विशिष्ट धब्बों, अर्थात् हमारी खगोलीय वेधशालाओं पर समय के कार्य के रूप में अवक्षेप जल वाष्प (PWV), ओजोन और एरोसोल की मात्रा निर्धारित करने का प्रयास कर रहा हूं। ऐसा करने के लिए, मुझे पहले से ही कुछ पायथन कोड मिल गया है, modapsclientजिसका उपयोग करके दो बार दैनिक MODIS एक्वा और टेरा MYDATML2 और MODATML2 उत्पादों को डाउनलोड किया जाएगा जो विशिष्ट अक्षांश और देशांतर को कवर करते हैं, जिनमें मेरी रुचि है।

मुझे इस बारे में निश्चित नहीं है कि मैं उन विशिष्ट मात्राओं को कैसे निकालना चाहता हूं, जैसे कि उस समय जैसे कि MODIS डेटा लिया गया था और मेरे वेधशाला के विशेष अक्षांश और देशांतर स्थिति के लिए PWV को मूल्यों की समय श्रृंखला में बनाने के लिए। MYDATML2 उत्पादों में 2D अक्षांश और देशांतर ग्रिड शामिल हैं Cell_Along_Swath_5kmऔर Cell_Across_Swath_5kmइसलिए मुझे लगता है कि यह स्वैथ डेटा को टाइल या ग्रिड डेटा के विपरीत बनाता है ? जो मात्राएँ मैं चाहता हूँ, वे Precipitable_Water_Infrared_ClearSkyभी इसके विरूद्ध लगती हैं Cell_Along_Swath_5kmऔर Cell_Across_Swath_5kmमुझे यकीन नहीं है कि विशिष्ट अक्षांश पर उस पीडब्लूवी मूल्य को कैसे प्राप्त करूं, जब तक मुझे इसमें दिलचस्पी है। कृपया मदद करें।


क्या आप कृपया इमेजरी या इसके नमूने का लिंक प्रदान कर सकते हैं?
एंड्रिया मासेटी

: बिल्कुल, MODIS संग्रह में एक उदाहरण फ़ाइल है ladsweb.modaps.eosdis.nasa.gov/archive/allData/61/MODATML2/2018/...
astrosnapper

हाय, क्या आपको मेरा जवाब आजमाने का मौका मिला?
एंड्रिया मस्सेटी

1
क्षमा करें, मैं संतृप्त डेटा से समान PWV निर्धारणों के आधार पर एक काम प्रस्तुत करने वाले सम्मेलन में गया हूं ... आपका अपडेटेड कोड मुझे वही मान दे रहा है जैसा कि मैं एक ही सेल के लिए PanoplyJ में देख रहा हूं (खाते में अलग-अलग सरणी सूचकांक क्रम और एक में ले रहा हूं) ऐरे इंडेक्स में '1
बाय डिफरेंस

जवाबों:


1

[संपादित 1 - मैंने पिक्सेल समन्वय खोज को बदल दिया]

MODATML के इस नमूने का उपयोग करना जो आपने प्रदान किया और गाल्ड लाइब्रेरी का उपयोग किया। चलो गदल के साथ hdf खोलें:

import gdal
dataset = gdal.Open(r"E:\modis\MODATML2.A2018182.0800.061.2018182195418.hdf")

फिर हम यह देखना चाहते हैं कि उपडेटाट का नाम कैसे रखा जाए ताकि हम अपनी जरूरत को सही ढंग से आयात कर सकें:

datasets_meta = dataset.GetMetadata("SUBDATASETS")

यह एक शब्दकोश देता है:

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)',
[....]}

मान लें कि हम पहला वैरिएबल प्राप्त करना चाहते हैं, क्लाउड ऑप्टिकल मोटाई, हम इसके नाम तक पहुँच सकते हैं:

datasets_meta['SUBDATASET_1_NAME']
>>>'HDF4_EOS:EOS_SWATH:"E:\\modis\\MODATML2.A2018182.0800.061.2018182195418.hdf":atml2:Cloud_Optical_Thickness'

अब हम चर को फिर से मेमोरी कॉलिंग में लोड कर सकते हैं। पीडीएफ () विधि:

Cloud_opt_th = gdal.Open(datasets_meta['SUBDATASET_1_NAME'])

उदाहरण के लिए, आप 'SUBDATASET_20_NAME' प्रदान करके अपनी रुचि के अनुसार Precipitable_Water_Infrared_ClearSky तक पहुँच सकते हैं। बस datasets_meta शब्दकोश पर एक नज़र है।

हालाँकि, निकाले गए चर में जियोप्रोजेक्शन (var.GetGeoprojection ()) नहीं है जैसा कि आप अन्य फ़ाइल प्रकारों जैसे कि GeoTiff से अपेक्षा करेंगे। आप वेरिएबल को एक अफीम सरणी के रूप में लोड कर सकते हैं और 2 डी वेरिएबल को बिना प्रक्षेपण के प्लॉट कर सकते हैं:

Cloud_opt_th_array = Cloud_opt_th.ReadAsArray()
import matplotlib.pyplot as plt
plt.imshow(Cloud_opt_th_array)

अब, चूंकि कोई भू-आकृति नहीं है, हम चर के मेटाडेटा में देखेंगे:

Cloud_opt_th_meta = Cloud_opt_th.GetMetadata()

यह एक और शब्दकोश है जिसमें आपको आवश्यक सभी जानकारी शामिल है, जिसमें सबसेंपलिंग का एक लंबा विवरण शामिल है (मैंने देखा कि यह केवल पहले उपडेटसेट के साथ प्रदान किया गया है), जिसमें इन Cell_Along_Swath की व्याख्या शामिल है:

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.'

मुझे लगता है कि इसका मतलब यह है कि इन 1 किमी पिक्सल के आधार पर 5 किमी 5x5 सेंसिंग एरे में एक निश्चित स्थिति पर बिल्कुल पिक्सेल मान ले रहा है (स्थिति मेटाडेटा में इंगित की गई है, मुझे लगता है कि यह दोष कम करने के लिए एक साधन है)।

किसी भी तरह, इस बिंदु पर हमारे पास 1x1 किमी कोशिकाओं की एक सरणी है (ऊपर सबसम्पलिंग का विवरण देखें, पीछे विज्ञान के बारे में निश्चित नहीं)। प्रत्येक पिक्सेल सेंट्रोइड के निर्देशांक प्राप्त करने के लिए, हमें अक्षांश और देशांतर उपडेटसेट को लोड करना होगा।

Latitude = gdal.Open(datasets_meta['SUBDATASET_66_NAME']).ReadAsArray()
Longitude = gdal.Open(datasets_meta['SUBDATASET_67_NAME']).ReadAsArray()

उदाहरण के लिए,

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)        

आप देख सकते हैं कि अक्षांश और देशांतर निर्देशांक प्रत्येक पिक्सेल के लिए अलग-अलग हैं।

अपने वेधशाला निर्देशांक lat_obs, long_obs पर स्थित है, की तुलना में आप x, y समन्वय अंतर को कम करते हैं:

coordinates = np.unravel_index((np.abs(Latitude - lat_obs) + np.abs(Longitude - long_obs)).argmin(), Latitude.shape)

और अपना मूल्य निकालें

Cloud_opt_th_array[coordinates]

जानकारी के लिए धन्यवाद, लेकिन मैं समन्‍वयित रूपांतरण भाग के साथ समस्‍याएं ले रहा हूं; Longitude_pxऔर Latitude_pxदोनों शून्य लंबाई सरणियों कर रहे हैं। इसके अलावा gdalस्वयं का उपयोग करके रूपांतरण को संभालने का एक तरीका है? (1 डिग्री के अनुमान पर निर्भर होने के बजाय, मीलों की एक्स नं। है और फिर किमी के लिए फिर से अनुमानित है)
खगोलविद्या

अक्षांश और देशांतर को सबडेटासेट के रूप में प्रदान किया जाता है, अर्थात् 66 और 67. मैं दूसरे भाग को अपडेट करूंगा।
एंड्रिया मस्सेटी

@astrosnapper को अब जवाब पूरी तरह से आपके सवाल का जवाब देना चाहिए।
एंड्रिया मस्सेटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.