Estou tentando determinar a quantidade de vapor de água precipitável (PWV), ozônio e aerossóis em função do tempo em pontos específicos da Terra, a saber, nossos observatórios astronômicos. Para fazer isso, eu já tenho um código Python usando o modapsclient
qual fará o download dos produtos MODIS Aqua e Terra MYDATML2 e MODATML2 duas vezes por dia que cobrem a latitude e longitude específicas em que estou interessado.
O que não tenho certeza é como extrair as quantidades específicas que quero, como o tempo em que os dados do MODIS foram obtidos e o PWV para a posição específica de latitude e longitude do meu observatório para transformá-los em uma série temporal de valores. Os produtos MYDATML2 parecem conter 2D de latitude e longitude grades de Cell_Along_Swath_5km
e Cell_Across_Swath_5km
então eu acho que isso faz com que faixa de dados em oposição a azulejos ou grade de dados? As quantidades que eu quero, como Precipitable_Water_Infrared_ClearSky
também parecem ser contra a Cell_Along_Swath_5km
e Cell_Across_Swath_5km
butI'm não sei como obter esse valor VOP na específica lat, long estou interessado. Ajuda por favor?
fonte
Respostas:
[EDIT 1 - Alterei a pesquisa por coordenadas de pixel]
Usando esta amostra de MODATML que você forneceu e usando a biblioteca gdal. Vamos abrir o hdf com gdal:
Em seguida, queremos ver como os subdadosets são nomeados para importar corretamente os que precisamos:
Isso retorna um dicionário:
Digamos que queremos obter a primeira variável, a espessura óptica da nuvem, podemos acessar seu nome por:
Agora podemos carregar a variável na memória chamando novamente o método .Open ():
Por exemplo, você pode acessar Precipitable_Water_Infrared_ClearSky de seu interesse fornecendo 'SUBDATASET_20_NAME'. Basta dar uma olhada no dicionário datasets_meta.
No entanto, a variável extraída não possui uma geoprojeção (var.GetGeoprojection ()), como seria de esperar de outros tipos de arquivo, como GeoTiff. Você pode carregar a variável como uma matriz numpy e plotar a variável 2d sem projeção:
Agora, como não há geoprojeção, examinaremos os metadados da variável:
Este é outro dicionário que inclui todas as informações necessárias, incluindo uma descrição longa da subamostragem (notei que isso é fornecido apenas com o primeiro subdataset), que inclui a explicação desses Cell_Along_Swath:
Eu acho que isso significa que, com base nesses pixels de 1 km, os 5 km foram construídos levando exatamente os valores de pixels em uma determinada posição na matriz de detecção 5x5 (a posição é indicada nos metadados, acho que isso é um instrumento para reduzir falhas).
De qualquer forma, neste ponto, temos uma matriz de células 1x1 km (veja a descrição da subamostragem acima, não tenho certeza sobre a ciência por trás dela). Para obter as coordenadas de cada centróide de pixel, precisamos carregar os subdatasets de latitude e longitude.
Por exemplo,
Você pode perceber que as coordenadas de latitude e longitude são diferentes para cada pixel.
Digamos que seu observatório esteja localizado nas coordenadas lat_obs, long_obs, do que você minimiza a diferença de coordenadas x, y:
e extraia seu valor
fonte
Longitude_px
eLatitude_px
são matrizes de comprimento zero. Também existe uma maneira de lidar com a conversão usando-gdal
se? (. invés de depender de uma aproximação de 1 grau é X nº de milhas e, em seguida, re-aproximando-se ao km)