Как построить цветную топографическую карту в MATLAB

Сегодня мы построим топографическую карту (карту рельефа) для всего мира, а также для отдельных районов, используя средства MATLAB. Нам как океанологам, конечно, важна её батиметрическая часть, но строить мы будем и "сухопутную" часть тоже. Сегодня ограничимся только картой, где топография отлита цветом. Изолинии будем рисовать в другой раз.

Начнём с того, что используем родной файл с топографией, который встроен в MATLAB. 

load topo

В результате этой команды откроются несколько переменных, главная из которых topo, в которой и содержатся нужные нам значения высот

whos
  Name              Size              Bytes  Class     
  topo            180x360            518400  double              
  topolatlim        1x2                  16  double              
  topolegend        1x3                  24  double              
  topolonlim        1x2                  16  double              
  topomap1         64x3                1536  double              
  topomap2        128x3                3072  double              

В прошлый раз (советуем прочитать тот материал, прежде чем читать дальше) для построения карты мы использовали матрицы с широтами и долготам, равные по размерам матрице с данными. Здесь же нет даже векторов, из которых мы эти матрицы можем сделать. Но на самом деле, при равномерной координатной сетке мы можем обойтись и без них. Поэтому сейчас мы построим карту немного другим способом (отличным от того, которым пользовались ранее).

Если мы знаем размер матрицы с топографией и знаем пределы этой карты (по широте и долготе), то можно сказать, что наша координатная сетка нам известна. Функция georefcells по пределам широт и долгот, а также размеру матрицы topo создаст в матлабе референсную ячейку, которую впоследствии мы сможем использовать для построения:

topoR = georefcells(topolatlim,topolonlim,size(topo))

Теперь осталось дело за малым -  построить карту:

worldmap('world')
geoshow(topo,topoR,'DisplayType','texturemap')
топографическая карта MATLAB

Для того, чтобы цвета выглядели более привычно для географа, лучше воспользоваться функцией demcmap, которая создаст специальную цветовую политру (colormap), подходящую для отображения рельефа.

worldmap('world')
geoshow(topo,topoR,'DisplayType','texturemap')
demcmap(topo)
Цветовая палитра для топографической карты

Что ж, карта готова.  Но что, если мы хотим построить карту не для всего Мирового океана, а лишь для небольшого района?

Читать далее «Как построить цветную топографическую карту в MATLAB»

Построение точек на карте с береговой линией по заданным координатам при помощи MATLAB.

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

Точки зададим вручную, также, как делали это в прошлый раз (точки находятся в губе Чупа, Белое море).

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]

Прежде, чем наносить точки на карту, давайте сначала построим эту самую карту и нарисуем береговую черту (также как мы делали в этой заметке):

worldmap([66.22 66.37],[33.60 34])
setm(gca,'MapProjection','mercator')
geoshow('landareas.shp','FaceColor',[0.5 0.5 0.5])
Читать далее «Построение точек на карте с береговой линией по заданным координатам при помощи MATLAB.»

Как визуализировать океанологические данные на карте в 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»