Статьи
Программирование Туториалы

Создание трехмерных карт рельефа с Rayshader

Время прочтения: 3 минуты
null
Изображение горы Арарат, сделанное с Rayshader
Rayshader – это пакет с открытым исходным кодом для 2D- и 3D-визуализации данных в R, автором которого является Тайлер Морган-Уолл. Его можно использовать для двух целей: для создания реалистичных карт рельефа и для построения трехмерных графиков.
Пакет Rayshader позволяет создавать модели, которые можно вращать и рассматривать в интерактивном режиме. Эти 3D-модели также можно экспортировать в формат, пригодный для 3D-печати.

Пример использования Rayshader

Код и подробный алгоритм создания карт находятся в свободном доступе на сайте создателя Rayshader, а также на GitHub.
Весь процесс создания 3D-визуализации рельефа в R хорошо описан в пошаговом туториале и подходит даже для начинающих пользователей, так что рекомендуем ознакомиться с ним. В этой статье показана краткая версия работы с пакетом на своем примере. С помощью этого алгоритма я попробую создать свою 3D-карту горы Арарат (прямо сейчас я вижу его со стороны Еревана, а мне хочется рассмотреть его со всех сторон и даже повращать!)
Первое, что мне нужно – скачать спутниковый снимок местности и цифровую модель рельефа. Бесплатно скачать ЦМР на эту территорию можно на странице 30-Meter SRTM Elevation Data Downloader, а спутниковый снимок мы возьмем из EarthExplorer (как советует автор, беру Landsat 8). По мнению автора алгоритма, скачать снимки – самое сложное в этом процессе. Но для меня, новичка в R, самое сложное начнется дальше.
Второй шаг – это запуск R и подключение библиотек (в этом примере я работаю с RStudio). Необходимо установить и подключить "rayshader", "sp", "raster" и "scales":
library(rayshader)
library(sp)
library(raster)
library(scales)
Теперь необходимо загрузить данные. Для загрузки файлов SRTM HGT используем функцию raster::raster(). Далее строим график высоты с помощью функции rayshader::height_shade().
Результат работы функции height_shade().
После этого загрузим наши спутниковые снимки с привязкой к местности. Нам необходимы красный, синий и зеленый каналы Landsat 8 (B4, B2, B3). К необработанным данным нужно применить гамма-коррекцию.
null
Необработанные спутниковые данные
null
Гамма-корректированные спутниковые данные
Объединяем два набора данных – необходимо, чтобы слой ЦМР и снимок имели одну систему координат. После этого обрезаем наборы данных до горы Арарат и создаем трехслойный RGB-массив интенсивности изображений. Это то, что нужно rayshader в качестве входных данных для наложения значений высоты. С помощью функции aperm() транспонируем массив, так как растры и массивы ориентированы по-разному в R.
null
Полностью обработанный снимок горы Арарат
Теперь – самое интересное. Вводим изображение в plot_3d() вместе с данными о высоте. Для реалистичного ландшафта мы должны установить zscale = 30, но я установила zscale = 15, так как в этом случае гора выделялась сильнее. Так появилась 3D-визуалицация, которую можно сохранить, а также открылось окно rgl, в котором можно рассмотреть изображение со всех сторон. Если следовать алгоритму и дальше, можно даже создать видео!
null
3D-карта горы Арарат
Rayshader имеет ряд функций для работы с рельефным изображением: можно направить свет для расчета теней для ЦМР, создавать теневой слой ambient occlusion, обнаружить воду на изображении при помощи алгоритма flood-fill, создавать текстурные карты, преобразовать данные библиотеки ggplot2 в красивые 3D-визуализации и многое другое.
Для вдохновения – несколько примеров красивых карт, сделанных при помощи Rayshader:
null
Карта плотности населения Китая. Автор: @researchremora / Twitter
null
Карта с рельефом Африки. Автор: @researchremora / Twitter
Источник: