MODIS 스와 스 데이터에서 특정 위도, 경도에서 값 추출


9

지구의 특정 지점, 즉 천문대에서 시간의 함수로 침전 가능한 수증기 (PWV), 오존 및 에어로졸의 양을 결정하려고합니다. 이렇게하기 위해 이미 modapsclient관심있는 특정 위도 및 경도를 다루는 MODIS Aqua 및 Terra MYDATML2 및 MODATML2 제품을 매일 두 번 다운로드하는 Python 코드가 이미 있습니다.

확실하지 않은 것은 MODIS 데이터가 취해진 시간 및 관측소의 특정 위도 및 경도 위치에 대한 PWV와 같이 원하는 특정 양을 추출하여 시계열 값으로 만드는 방법입니다. MYDATML2 제품의 차원 위도와 경도 그리드를 포함하는 것 Cell_Along_Swath_5kmCell_Across_Swath_5km같아요, 그래서 이것은하게 넓은 길 타일 또는 그리드 데이터에 반대 데이터를? 내가 같은 원하는 수량 Precipitable_Water_Infrared_ClearSky도는 반대 것 같습니다 Cell_Along_Swath_5kmCell_Across_Swath_5km긴 내가. 도움말하시기 바랍니다 관심, 해정은 방법을 잘 모르 위도 구체적인에서 그 PWV 값을 얻을?


이미지 또는 샘플에 대한 링크를 제공 할 수 있습니까?
Andrea Massetti

물론, 다음은 MODIS 아카이브에있는 예제 파일입니다. ladsweb.modaps.eosdis.nasa.gov/archive/allData/61/MODATML2/2018/…
astrosnapper

안녕, 내 대답을 시험해 볼 기회가 있었 니?
Andrea Massetti

1
죄송합니다. sat 데이터에서 유사한 PWV 결정을 기반으로 한 작업을 발표하는 회의에 참석하지 않았습니다. 업데이트 된 코드는 PanoplyJ에서 동일한 셀에 대해 동일한 값을 제공합니다 (다른 배열 색인 순서 및 배열 인덱스 시작에서 'off by 1'차이)
astrosnapper

답변:


1

[편집 1-픽셀 좌표 검색을 변경했습니다]

제공 한이 MODATML 샘플 사용 및 gdal 라이브러리 사용. gdal로 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'

이제 메모리에서 변수를 다시로드하여 .Open () 메서드를 다시 호출 할 수 있습니다.

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

예를 들어, 'SUBDATASET_20_NAME'을 제공하여 관심있는 Precipitable_Water_Infrared_ClearSky에 액세스 할 수 있습니다. datasets_meta 사전을 살펴보십시오.

그러나 추출 된 변수에는 GeoTiff와 같은 다른 파일 형식에서 예상 할 수있는 geoprojection (var.GetGeoprojection ())이 없습니다. 변수를 numpy 배열로로드하고 투영없이 2D 변수를 플롯 할 수 있습니다.

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

이것은이 1km 픽셀을 기반으로 5km가 5x5 감지 배열의 특정 위치에서 픽셀 값을 정확하게 가져 와서 만들어진다는 것을 의미한다고 생각합니다 (위치는 메타 데이터에 표시되어 있습니다. 이것은 결함을 줄이는 계기라고 생각합니다).

어쨌든,이 시점에서 우리는 1x1km의 셀 배열을 가지고 있습니다 (위의 서브 샘플링에 대한 설명은 그 뒤에 과학에 대해서는 확실하지 않습니다). 각 픽셀 중심의 좌표를 얻으려면 위도 및 경도 하위 데이터 집합을로드해야합니다.

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)        

위도 및 경도 좌표가 각 픽셀마다 다름을 알 수 있습니다.

관측소가 x, y 좌표 차이를 최소화하는 것보다 lat_obs, long_obs 좌표에 있다고 가정하십시오.

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 개 정도의 근사치에 의존하지 않고 다음 X가 더있다 마일 앤 근사하지 다시 그 km까지)
astrosnapper

위도 및 경도는 하위 데이터 집합, 즉 66과 67로 제공됩니다. 두 번째 부분을 업데이트하겠습니다.
Andrea Massetti

@astrosnapper 이제 답변이 귀하의 질문을 완전히 해결해야합니다.
Andrea Massetti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.