Карти землекористування та земляного покриву є важливим інструментом для вивчення взаємодії людини та природи. Вони дозволяють візуалізувати, як змінюється ландшафт внаслідок діяльності людини, а також виявляти тенденції у зміні землекористування. У цій статті я покажу, як можна побудувати вражаючі візуалізації земляного покриву та землекористування за допомогою R та пакету rayshader.
Пакети
Для цієї візуалізації я використовував наступні пакети:
resolution - рівень градації кордонів (1 - країна, 2 - область тощо)
Збережемо кордони України у файл ua-borders.png:
png("ua-borders.png")
Земляний покрив
Завантажимо растровий шар земляного покриву для України. Для цього необхідно перейти на сайт https://livingatlas.arcgis.com/landcoverexplorer та натиснути кнопку завантаження у лівому нижньому кутку карти.
Після чого відкриється мапа земляного покриву, на якій можна вибрати область для завантаження. Виберемо всі області, які входять до складу України. Клікаємо на кожну область щоб вибрати плитку та рік:
Для завантаження даних використаємо функцію download.file(). За замовчування вона завантажує файли впродовж 60 секунд і якщо файл не встиг завантажитись, видасть помилку. Щоб уникнути цього, збільшимо час завантаження до 480 секунд:
options(timeout =480)
Створимо функцію для завантаження растрових даних якщо вони ще не були завантажені. Це дозволить нам уникнути повторного завантаження файлів, якщо вони вже були завантажені. Імена файлів будуть взяті з посилань за допомогою функції basename():
path - шлях до папки, в якій знаходяться файли. В даному випадку це поточна папка, яку ми отримуємо за допомогою функції here()
2
pattern - шаблон імен файлів, які ми шукаємо. В даному випадку це файли, які закінчуються на 20230101.tif
3
full.names - будемо зберігати повні шляхи до файлів
Для подальшої роботи і об’єднання всіх файлів в один створимо змінну з crs в якій буде збережено інформацію про систему координат, в якій знаходяться файли. В даному випадку це EPSG:32635:
crs <-"EPSG:4326"
Об’єднаємо всі файли в один за допомогою функції terra::rast():
Для візуалізації земляного покриву нам знадобиться палітра кольорів, яка використовується на оригінальній мапі. Для цього завантажимо один з растрових файлів та витягнемо з нього палітру кольорів:
z - масштаб цифрової моделі рельєфу. Для великих територій рекомендується зменшувати масштаб.
3
clip - обрізка за кордонами України
Для об’єднання растрових файлів земляного покриву та цифрової моделі рельєфу нам необхідно перетворити у відповідності один до одного. Для цього ми використаємо проекцію, яку можна знайти за посиланням https://epsg.io/ для своєї країни:
Перш ніж створити 3D-візуалізацію, нам необхідно переконатися, що наша растрова модель має однакову проекцію з цифровою моделлю рельєфу. Також нам потрібно перетворити растрову модель у матрицю, щоб пакет rayshader міг працювати з нею:
В результаті ми отримаємо 3D-візуалізацію земляного покриву та цифрової моделі рельєфу.
Рендер рисунку
Тепер ми готові зберегти все у високоякісний рисунок. Збережемо його у файл 3d_land_cover_ua-dark.png за допомогою функції rayshader::render_highquality() і використаємо для цього високоякісну текстуру освітлення, яка збережена у файлі air_museum_playground_4k.hdr:
filename <-"3d_land_cover_ua-dark.png"rayshader::render_highquality(filename = filename,preview =TRUE,light =FALSE,environment_light =here('air_museum_playground_4k.hdr'),intensity_env =1,rotate_env =90,interactive =FALSE,parallel =TRUE,width = w *1.5,height = h *1.5)
Збір статистичної інформації
Парсинг
Також хотілося б зібрати статистичну інформацію про земляний покрив України щоб у подальшому додати її у легенду.
# A tibble: 9 × 3
Value Name Description
<dbl> <chr> <chr>
1 1 Water Areas where water was predominantly present througho…
2 2 Trees Any significant clustering of tall (~15 feet or high…
3 4 Flooded vegetation Areas of any type of vegetation with obvious intermi…
4 5 Crops Human planted/plotted cereals, grasses, and crops no…
5 7 Built Area Human made structures; major road and rail networks;…
6 8 Bare ground Areas of rock or soil with very sparse to no vegetat…
7 9 Snow/Ice Large homogenous areas of permanent snow or ice, typ…
8 10 Clouds No land cover information due to persistent cloud co…
9 11 Rangeland Open areas covered in homogenous grasses with little…
Зверніть увагу, що змінна Value не містить записів 3 та 6.
Підрахунок площі
Тепер можемо підрахувати площу кожного класу земляного покриву. На випадок, якщо ми захочемо порахувати площі окремо для кожної області, додамо id до змінної country_sf:
country_sf$id <-1:nrow(country_sf)
Зберемо всі класи земляного покриву у змінну classes:
classes <- class_tbl$Value
Проведемо підрахунок статистики для кожного класу земляного покриву за допомогою функції exactextractr::exact_extract():
Об’єднаємо результати з попередньою таблицею, додамо змінну colors, яка буде містити палітру кольорів для кожного класу земляного покриву, а також змінну perc, яка буде містити відсотове співвідношення площі кожного класу земляного покриву. Відсортуємо результати за спаданням площі та видалимо класи, які не мають значення:
# A tibble: 6 × 6
Var1 Freq Name colors perc Description
<dbl> <dbl> <chr> <chr> <chr> <chr>
1 5 0.665 Crops #e49635 66.45% Human planted/plotted cereals…
2 2 0.189 Trees #397d49 18.91% Any significant clustering of…
3 11 0.0706 Rangeland #e3e2c3 7.06% Open areas covered in homogen…
4 7 0.0504 Built Area #c4281b 5.04% Human made structures; major …
5 1 0.0212 Water #419bdf 2.12% Areas where water was predomi…
6 4 0.00392 Flooded vegetation #7a87c6 0.39% Areas of any type of vegetati…
Збираємо фінальну візуалізацію
Легенда
Тепер можемо побудувати легенду для нашої візуалізації. Для цього використаємо пакет ggplot2: