Как визуализировать океанологические данные на карте в MATLAB

Сегодня мы рассмотрим несколько готовых рецептов для визуализации океанологических данных. Эта заметка именно с рецептами и не претендует на полноценное руководство, которое для Матлаба существует и достаточно объёмное (около 1000 страниц). Скачать его сегодня (в ноябре 2018 года) можно по ссылке.

В прошлой заметке мы с вами открыли netCDF файл в MATLAB, теперь настало время визуализировать данные на карте. Если в прошлый раз мы выдумали гипотетическое название файла, то сегодня откроем самые настоящие данные. Для примера скачаем файл с температурой поверхности океана (SST) с сайта https://oceancolor.gsfc.nasa.gov/

В нашем файле содержатся среднемесячные значения температуры поверхности воды за сентябрь 2018 года, если хотите точно такой же, то вот ссылка.

Теперь настало время выудить из этого файла данные о температуре:

sst = ncread('A20182442018273.L3m_MO_SST_sst_9km.nc','sst');

Полученную переменную sst легко визуализировать простыми средствами (как вы бы визуализировали любую другую матрицу), например через функцию imagesc:

imagesc(sst)
визуализация данных в MATLAB

Если вас смущает, что матрица "лежит на боку", то можете переориентировать её, написав в командной строке:  

Читать далее «Как визуализировать океанологические данные на карте в MATLAB»

Как открыть netCDF файл в MATLAB

В данной заметке я покажу два способа открыть NetCDF-файл в MATLAB, один способ более продвинутый и более сложный, а второй более простой. 

Несколько лет назад брат написал статью в своём блоге koldunov.net, где показал, как открыть в MATLAB файлы формата netCDF.

Он использовал функцию netcdf и всю процедуру необходимо было выполнять в несколько шагов. Не буду полностью повторять его статью, но вкратце напомню примерный порядок действий.

Для начала нужно открыть netCDF файл, в результате чего в переменную ncid будет записано число, которое будет являеться неким идентификатором, при помощи которого мы сможем вдальнейшем обращаться к нашему файлу:

ncid = netcdf.open('temperature_and_salinity_2018.nc','NC_NOWRITE');

Зная название (информацию о файле можно получить при помощи функции ncdisp) нужной вам переменной (например, температуры) внутри netCDF-файла, определить её ID (который на самом деле является просто порядковым номером переменной внутри файла; счёт начинается с нуля)

varid = netcdf.inqVarID(ncid,'temperature')
varid =

     3

Затем выудить по полученному ID данные для нужной нам характеристики:

data = netcdf.getVar(ncid,3);

Вот и всё, мы открыли наши данные. Но этих процедур часто бывает недостаточно, потому как для уменьшения размеров netCDF файлов прибегают к различного рода хитростям, например приводят все данные к целочисленным значениям и вычитают какое-нибудь число, если все данные больше этого самого числа.

Читать далее «Как открыть netCDF файл в MATLAB»

Построение точек на карте по заданным координатам при помощи Basemap в Python.

Видео аватар

Если внимательно посмотреть на последние заметки нашего блога, то можно подумать, что он превратился в чисто фотографический. Однако недавно мы хорошенько обдумали перспективы развитя наших сайтов, не побоялись и поставили всё с ног на голову. Поскольку фотографическая тематика постов отныне будет жить только на koldunov.com, этот сайт вновь станет выглядеть так, как он выглядел в самом начале. Да-да, начиналось всё не с фотографических обзоров, а с заметок, типа:
Вязание крючком игрушки Бендера (Футурама)
Взрослая загадка на смекалку — расшифровать послание инопланетянам
Работа с GMT
Изготовление трафарета
и т.д.

Сегодня мы вернёмся к теме картирования. Задача стоит следующая.
В отдельных точках акватории проводились измерения океанологических хараткеристик. Для каждой точки нам известны географические координаты (широта и долгота). Необходимо нанести в виде кружков положение точек на карте. Делать всё мы будем в Python (я обычно при этом использую ipython notebook, так удобнее).

Для начала импортируем всё, что нам понадобится:

%pylab inline
import matplotlib.pylab as plt
from mpl_toolkits.basemap import Basemap

затем: создадим две переменные с широтами и долготами. В данном случае проще и быстрее было создать их вручную:

lat = [66.297,66.299,66.298,66.295,66.301,66.304,66.288,66.289,66.286,66.289]
lon = [33.640,33.660,33.690,33.747,33.829,33.908,33.891,33.839,33.781,33.740]

Ну и теперь само построение карты:

m = Basemap(projection='merc',llcrnrlat=66.22,urcrnrlat=66.37,\
            llcrnrlon=33.60,urcrnrlon=34,resolution='f')
figsize(10,15)

x, y = m(lon,lat)

m.drawcoastlines()
m.fillcontinents(color='gray',lake_color='white')
m.drawmapboundary(fill_color='white')
m.drawparallels(np.arange(66.22,66.37,.04),labels=[1,0,0,0], fontsize =14)
m.drawmeridians(np.arange(33.60,34.,.1),labels=[0,0,0,1], fontsize =14)

m.scatter(x,y,20,marker='o',color='k')
plt.title("Location of the measurement points", fontsize =14)
plt.show()

plot_points
Некоторые пояснения к тому, что мы сделали (я не стал это делать в коде, чтобы не перегружать его): Читать далее «Построение точек на карте по заданным координатам при помощи Basemap в Python.»