Анализ NO2 c помощью Python. Часть 2.
Продолжение статьи по анализу данных NetCDF на Python, первая часть которой была опубликована ранее. Завершающая часть полного чтения и визуализации данных по анализу NO2. Доступны для скачивания все лист-коды, необходимые в работе.
Первоначально считаю необходимым отметить, что, возможно, не стоило комментарии и подписи в коде делать на русском языке, так как из-за кодировки могут возникнуть непонятные символы, в которых трудно будет разобраться. Возможно, моя ошибка по незнанию, но в первой и в этой части я продолжу использовать кириллицу, а в последующих буду писать либо на латинице русские слова, либо сразу делать комментарии на английском (что более перспективнее).
Так или иначе, продолжаем проводить анализ NO2 c помощью Python.
1. После завершения первой части, в среде Spyder необходимо закрыть все предыдущие файлы, перезапустить ядро, но остаться в нашей подготовленной директории.
Далее мы должны ввести следующее:
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import sys
from netCDF4 import Dataset
try:
fileList=open(„fileList.txt“,„r“)
except:
print(„Файл не найден. Проверте, возможно, есть несовпадения“)
sys.exit()
for FILE_NAME in fileList:
FILE_NAME=FILE_NAME.strip()
user_input=input(„\nВы хотите начать обработку данных\n“ + FILE_NAME + „\n\n(Д/Н)“)
if(user_input 'Н' or user_input „н“):
print(„Skipping…“)
continue
else:
file = Dataset(FILE_NAME, „r“)
ds=file
grp=„PRODUCT“
lat= ds.groups[grp].variables[„latitude“]0[:][:]
lon= ds.groups[grp].variables[„longitude“]0[:][:]
if „NO2“ in FILE_NAME:
sds_name=„nitrogendioxide_tropospheric_column“
map_label=„mol/m2“
if „AER_AI“ in FILE_NAME:
sds_name=„aerosol_index_354_388“
map_label=„Aerosol Index“
data= ds.groups[grp].variables[sds_name]
fv=data._FillValue
min_lat=np.min(lat)
max_lat=np.max(lat)
min_lon=np.min(lon)
max_lon=np.max(lon)
map_title = data.long_name
print(data.units)
dataArray=np.array(data0[:][:])
dataArray[dataArray==fv]=np.nan
data=dataArray
average=np.nanmean(dataArray)
stdev=np.nanstd(dataArray)
median=np.nanmedian(dataArray)
# подписать как „mol/cm2“
print(„The average of this data is: „,“{:.2e}“.format(average),“\nThe standard deviation is: „,“{:.2e}“.format(stdev),“\nThe median is: „,“{:.2e}“.format(median))
print(„The range of latitude in this file is: „,min_lat,“ to „,max_lat, „degrees \nThe range of longitude in this file is: „,min_lon, „ to „,max_lon,“ degrees“)
is_map=input(„\nПостроить картографический материал? Нажмите Д или Н \n“)
if is_map 'Д' or is_map „д“:
data = np.ma.masked_array(data, np.isnan(data))
m = Basemap(projection=„cyl“, resolution=„l“,
llcrnrlat=-90, urcrnrlat = 90,
llcrnrlon=-180, urcrnrlon = 180)
m.drawcoastlines(linewidth=0.5)
m.drawparallels(np.arange(-90., 120., 30.), labels=[1, 0, 0, 0])
m.drawmeridians(np.arange(-180, 180., 45.), labels=[0, 0, 0, 1])
my_cmap = plt.cm.get_cmap(„jet“)
my_cmap.set_under(„w“)
vmin1=0.0
vmax1=0.05
if „AER_AI“ in FILE_NAME:
vmin1=-2.0
vmax1=0.4
m.pcolormesh(lon, lat, data, latlon=True, vmin=vmin1, vmax=np.nanmax(data)*vmax1,cmap=my_cmap)
cb = m.colorbar()
cb.set_label(map_label)
plt.autoscale()
#присаваиваем название схемы
plt.title(„{0}\n {1}“.format(FILE_NAME, map_title))
fig = plt.gcf()
plt.show()
is_save=str(input(„\nСохранить созданный файл? Нажмите Д или Н \n“))
if is_save 'Д' or is_save „д“:
pngfile = „{0}.png“.format(FILE_NAME[:-3])
fig.savefig(pngfile, dpi = 300)
file.close()
2. После того, как ввели необходимый код (в самом файле .py будут комментарии по поводу всех выполняемых там действий), нажимаем Run и смотрим, то происходит в Консоли.
В начале будет предложено начать обработку данных. Мы работаем исключительно с NO2, однако если бы в нашем fileList
были и данные по аэрозолям AER_AI, код работал бы и с ними, о чем свидетельствует фрагмент кода:
...
if 'NO2' in FILE_NAME:
sds_name='nitrogendioxide_tropospheric_column'
map_label='mol/m2'
if 'AER_AI' in FILE_NAME:
sds_name='aerosol_index_354_388'
map_label='Aerosol Index'
...
Помним, что данная программа работает с русскими буквами, так что нажимаем «д» и жмем Enter.
На финальных стадиях в Консоли будет выведено изображение, а после предложение о сохранении нашей картосхемы.
В принципе, на этом можно заканчивать. Основная часть сделана. Таким способом можно быстро получить необходимую информацию из NetCDF и визуализировать ее.
3.
В процессе работы обнаружил следующее. Почему-то при процессе визуализации данные отображаются не полностью.

Сам код работает корректно с другими данными NetCDF, например с аэрозолями и т.п. Сам же исходный S5P_OFFL_L2__NO2____20190330T092200_20190330T110331_07562_01_010300_20190405T105720.nc
корректно отображается и в другим программах по обработке данных.
На момент написания причины найти не смог. Возможно, найду позже.
Опубликовано · Автор Victor