Как построить цветную топографическую карту в 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»

Рецензия на книгу Брюса Бэрнбаума “Сущность фотографии: умение видеть и творить”

Брюс Бэрнбаум “Сущность фотографии: умение видеть и творить”

Издательство Питер уже давно ассоциируется у нас с примечательной серией яркий книг по фотографии квадратного формата. “Оранжевая книга” Дмитрия Рудакова - одна из первых, которые помогли нам вынырнуть из плёночной фотографии и окунуться в цифровую. Живой язык, приятная вёрстка, полезная информация заставили нас даже купить две одинаковые книги (каждому по одной).

Совсем недавно издательство Питер выпустило книгу Брюса Бэрнбаума “Сущность фотографии: умение видеть и творить”. Она тоже квадратная, но в этот раз с чёрно-белой обложкой, и это не случайно. Её автор, американский фотограф и преподаватель с большим стажем, стремился преуспеть именно в чёрно-белой фотографии.

Поделимся впечатлениями от прочтения. Читать далее «Рецензия на книгу Брюса Бэрнбаума “Сущность фотографии: умение видеть и творить”»

Вырезка области из данных на криволинейной сетке при помощи Python

Данная заметка является очередной памяткой для себя, но вероятно может быть кому-нибудь полезна, поэтому делаю пост публичным. Это история о том, как не всегда нужно выдумывать сложные пути решения проблем.

Имеем: большой массив с модельными данными для большой области океана. Для исследования требуется лишь небольшой участок, скажем с 65 по 75° с.ш. и с 20°з.д. по 20° в.д.

Задача: вырезать нужный нам маленький район из большого.

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

Для нас не важно получить именно прямоугольник с нужными с координатами, поэтому интерполяция в новую координатную сетку не нужна. Т.е. мы можем вырезать район любой формы, но должны выполняться два условия:

1. Вырезанный участок должен полностью покрыть заданный прямоугольник

2. Чем меньше будет лишних точек, не попадающих в заданный прямоугольник, тем лучше.

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

Итак, последовательность моих действий была очень проста. Для  начала я построил карту нашего райна (сделал его чуть больше, чем нам в итоге нужно).

Импортруем Basemap:

from mpl_toolkits.basemap import Basemap
%pylab inline

строим карту:

m = Basemap(projection='merc',llcrnrlat=60,urcrnrlat=78,\
llcrnrlon=-40,urcrnrlon=40,resolution='l')
figsize(15,15)

m.drawcoastlines()
m.fillcontinents(color='gray',lake_color='white')

plt.show()

map Читать далее «Вырезка области из данных на криволинейной сетке при помощи Python»

Построение точек на карте по заданным координатам при помощи 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.»

Lightworks. В поисках программы для редактирования видео под Linux.

Так уж сложилось в жизни, что приходится много работать в операционной системе Linux. Одним из основных недостатков Linux, из-за которого многие из наших знакомых до сих пор на него не перешли - это отсутствие по настоящему флагманских программ для творчества (прежде всего фоторедакторов и видеоредакторов). Время от времени нас тянет побыть в роли режиссеров. Периодически пытаясь обнаружить нормально работающую программу для монтажа видео под Ubuntu и перепробовав множество вариантов (преимущественно из родных репозиториев), мы остановились на вполне неплохо работающем видеоредакторе OpenShot. Сносно, но, конечно, до звания "монстра" киноидустрии далеко-далёко.

И вот совсем недавно наткнулись мы на ещё один очень интересный вариант. Lightworks - проприетарный видеоредактор, однако имеет бесплатную версию с некоторыми ограничениями, о которых поговорим чуть позже.

программа для монтажа под Linux - Lightworks

Сперва программа показалась очередным никому неизвестным "среднечком". Название это мы услышали впервые, и, как оказалось, не мы одни, - многим людям, монтирующим видео, она оказалась совершенно незнакома. Тем не менее, чем больше узнавали про Lightworks, тем больше удивлялись тому факту, что мы про неё ни разу не слышали.

В качестве эдакой саморекламы на сайте приведён список некоторых фильмов, в которых для монтажа использовался Lightworks. Вам что-нибудь говорят эти названия: Pulp Fiction, Mission Impossible, The Departed, Aviator, The Hitchhiker’s Guide to the Galaxy, Pride & Prejudice (2005), Moulin Rouge? И это лишь несколько примеров из множества картин, номинировавшихся и получавших премии (включая премии Оскар) в номинациях "лучший монтаж".

Lightworks

В бесплатной версии есть весь необходимый функционал, а основным ограничением является возможность сохранять получившиеся видеоролики только в формате MPEG-4 (H.264) не превышающим 720p. С другой стороны для кого-то это может оказаться даже плюсом, если этот кто-то приходит в панику от вида различных непонятных форматов (с таким же непонятным списком кодеков), в которых предлагают обычно программы сохранить видеоролик, в то время, как ему не хочется думать и всё что нужно - это загрузить ролик на YouTube.

Нельзя сказать, что программа очень проста для новичков (всё-таки это профессиональный продукт), а также и монтажёры со стажем тоже говорят, что нужно привыкать, потому как процесс работы здесь своеобразный, не похожий на тот же Adobe Premiere. Однако на сайте есть видеоруководства, которые можно внимательно посмотреть и понять процесс монтажа. Кстати говоря, в сети нередко натыкались на отзывы, в которых люди утверждают, что работать в Lightworks оказалось намного удобнее, чем в Premiere. Для себя мы сделали вывод, что надо попробовать.

5 лет koldunov.ru. Подарки и новые проекты.

Сегодня исполняется 5 лет сайту koldunov.ru. Годовщина скромная, но приятная. По этому случаю мы решили сделать всем читателям блога скромный, но, надеемся, полезный подарок в виде скидки (500 р) на обучение в школе фотографии Profotik.

Для получения скидки на обучение достаточно распечатать этот купон и отдать его администратору перед тем как записаться на курс.

скидка на обучение фотографии

Купон действует на любой курс (у любого преподавателя), проводимый в Санкт-Петербурге. Срок действия купона до 4 декабря 2015 года. Данная скидка не суммируется с другими скидками и акциями, которые проводит школа фотографии Profotik.

Любую интересующую вас информацию можно узнать на сайте Profotik или по телефону в Санкт-Петербурге: 339-10-93

А ещё мы сделали замечательный проект The Good, the Bad and the Ugly, направленный на развитие и поддержание начинающих фотографов. По "лайкам" в социальных сетях (или по их отсутствию) бывает непросто определить, что зрители думают о вашем творчестве, а толковые комментарии оставляют редко. Сейчас вообще люди редко пишут и читают, в основном смотрят. Именно поэтому все стали более придирчивы к визуальному искусству фотографии. И это прекрасно!

В проекте The Good, the Bad and the Ugly вы можете выставить свою работу на всеобщее голосование. Специальная система оценок позволяет понять, что именно нравится или не нравится людям. Тем самым по распределённым голосам можно оценить, как реально зрители реагируют на ваши фотографии, а также понаблюдать за общественным мнением в отношении чужих работ.

Все голосования анонимные! Так что, размещая фотографию в специальный альбом, будьте готовы к правде!

Почему полезно знать стандартные ступени выдержки, диафрагмы и светочувствительности?

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

Цифровая фотография хороша тем, что можно сразу посмотреть, получился снимок ярким или тёмным. Однако, это расслабило многих начинающих фотографов и они перестали думать. Фотографам старой закалки приходилось постоянно что-то считать в уме, прикидывать, сопоставлять. Для удобства расчётов использовали стандартные шкалы.

объектив
Для значений относительного отверстия (определяющих размер открытия диафрагмы) стандартная шкала выглядит так:
…; 1/0,7; 1/1; 1/1,4; 1/2; 1/2,8; 1/4; 1/5,6; 1/8; 1/11; 1/16; 1/22; 1/32; 1/45; 1/64; 1/90; 1/128; ...
стандартная шкала выдержек (в секундах):
…; 2; 1; 1/2; 1/4; 1/8; 1/15; 1/30; 1/60; 1/125; 1/250; 1/500; 1/1000; 1/2000; …
стандартная шкала светочувствительности (в системе измерения ISO):
…; 25600; 12800; 6400; 3200; 1600; 800; 400; 200; 100; 50; 25; …

Немного базовой теории о ступенях

Вникнуть в закономерность стандартной шкалы проще всего на примере выдержки. Читать далее «Почему полезно знать стандартные ступени выдержки, диафрагмы и светочувствительности?»