Rayshader - это пакет с открытым исходным кодом для 2D- и 3D-визуализации данных в R, автором которого является Тайлер Морган-Уолл. Он может быть использован для создания реалистичных карт рельефа и трехмерных графиков.
С помощью пакета Rayshader можно создавать интерактивные 3D-модели, которые можно вращать и рассматривать с разных углов. Кроме того, эти модели можно экспортировать в формат, подходящий для 3D-печати.
Весь процесс создания 3D-визуализации рельефа в R хорошо описан в пошаговом туториале и подходит даже для начинающих пользователей, так что рекомендуем ознакомиться с ним. В этой статье показана краткая версия работы с пакетом на своем примере. С помощью этого алгоритма я попробую создать свою 3D-карту горы Арарат.
Первое, что мне нужно – скачать спутниковый снимок местности и цифровую модель рельефа. Бесплатно скачать ЦМР на эту территорию можно на странице 30-Meter SRTM Elevation Data Downloader, а спутниковый снимок мы возьмем из EarthExplorer (как советует автор, беру Landsat 8). По мнению автора алгоритма, скачать снимки – самое сложное в этом процессе. Но для меня, новичка в R, самое сложное начнется дальше).
Второй шаг – это запуск R и подключение библиотек (в этом примере я работаю с RStudio). Необходимо установить и подключить:
library(rayshader)
library(sp)
library(raster)
library(scales)
Теперь необходимо загрузить данные. Для загрузки файлов SRTM HGT используем функцию raster::raster(). Далее строим график высоты с помощью функции rayshader::height_shade().

После этого загрузим наши спутниковые снимки с привязкой к местности. Нам необходимы красный, синий и зеленый каналы Landsat 8 (B4, B2, B3). После этого, можно построить график, используя функцию raster::plotRGB(). К необработанным данным нужно применить гамма-коррекцию.


Объединяем два набора данных – необходимо, чтобы слой ЦМР и снимок имели одну систему координат. Для этого мы используем функцию crs(). После этого обрезаем наборы данных до горы Арарат и создаем трехслойный RGB-массив интенсивности изображений. Для обрезки необходимы координаты левого нижнего и правого верхнего угла области обрезки. Это то, что нужно rayshader в качестве входных данных для наложения значений высоты. С помощью функции aperm() транспонируем массив, так как растры и массивы ориентированы по-разному в R.

Теперь – самое интересное. Вводим изображение в plot_3d() вместе с данными о высоте. Для реалистичного ландшафта мы должны установить zscale = 30, но я установила zscale = 15, так как в этом случае гора выделялась сильнее. Так появилась 3D-визуалицация, которую можно сохранить, а также можно открыть окно rgl, в котором можно рассмотреть изображение со всех сторон. Если следовать алгоритму и дальше, можно даже создать видео!

Rayshader имеет ряд функций для работы с рельефным изображением: можно направить свет для расчета теней для ЦМР, создавать теневой слой ambient occlusion, обнаружить воду на изображении при помощи алгоритма flood-fill, создавать текстурные карты, преобразовать данные библиотеки ggplot2 в красивые 3D-визуализации и многое другое.
Статья написана автором блога Картетики