Спутник ДЗЗ
3.21K subscribers
2.49K photos
140 videos
191 files
2.22K links
Человеческим языком о дистанционном зондировании Земли.

Обратная связь: @sputnikDZZ_bot
加入频道
tidyterra

Пакет tidyterra (https://dieghernan.github.io/tidyterra/) предоставляет 📸 методы, обычные для пакетов “вселенной” tidy (tidyverse), объектам SpatRaster и SpatVector, созданным в пакете terra.

В tidyterra также реализованы 📸 функции geom_* для построения графиков объектов SpatRaster и SpatVector с помощью ggplot2.

tidy-методы, реализованные в tidyterra, работают по-разному в зависимости от типа объекта Spat*:

SpatVector: методы реализованы с помощью terra::as.data.frame(). Строки соответствуют геометрии, а столбцы — атрибутам геометрии.
SpatRaster: подход tidyterra заключается в том, чтобы рассматривать слои (layers) как столбцы таблицы, а ячейки (cells) — как строки. Например, select(SpatRaster, 1) будет выбирать первый слой SpatRaster.

Методы возвращают тот же тип объекта, который использовался на входе, если только ожидаемое поведение метода не предполагает возврат объекта другого типа. Например, as_tibble() вернет tibble.

tidyterra задумана как удобная обертка terra. Такой подход имеет свою цену в плане производительности. Если вы активно используете terra или вам нужно работать с большими растровыми файлами, используйте terra, как более ориентированную на производительность.

📖 Hernangómez, D., (2023). Using the tidyverse with terra objects: the tidyterra package. Journal of Open Source Software, 8 (91), 5751, https://doi.org/10.21105/joss.05751.

#R
Логические операции

Рассмотрим логические операции с векторными данными (SpatVector) в пакете terra.

Начнем с функций crop и intersect — для обрезки и вычисления пересечения векторных данных соответственно:

crop(x, y, ...)
intersect(x, y, ...)


Функции принимают на вход объекты SpatVector, SpatExtent или SpatRastercrop первым аргументом могут быть только векторы и растры). С растровым использованием этих функций мы уже сталкивались здесь и здесь.

Построим полигон p1 и лежащий внутри него полигон p2:

p1 <- vect("POLYGON ((0 0, 8 0, 8 9, 0 9, 0 0))")
p2 <- vect("POLYGON ((2 6, 3 6, 3 8, 2 8, 2 6))")
plot(p1, lwd=2)
lines(p2, lwd=2, col="blue")


lines использована для рисования поверх первого plot’a.

Применив к p1 и p2 обрезку и пересечение

cropped <- crop(p1,p2)
isected <- intersect(p1,p2)


мы получим одинаковый результат:

 # class       : SpatVector 
# geometry : polygons
# dimensions : 1, 0 (geometries, attributes)
# extent : 2, 3, 6, 8 (xmin, xmax, ymin, ymax)
# coord. ref. :


Разница в работе функций появляется, когда у векторных данных есть атрибуты:

p1[["id1"]] <- 1L
p2[["id4"]] <- 1L

cropped <- crop(p1,p2)
# class : SpatVector
# geometry : polygons
# dimensions : 1, 1 (geometries, attributes)
# extent : 2, 3, 6, 8 (xmin, xmax, ymin, ymax)
# coord. ref. :
# names : id1
# type : <int>
# values : 1
isected <- intersect(p1,p2)
# class : SpatVector
# geometry : polygons
# dimensions : 1, 2 (geometries, attributes)
# extent : 2, 3, 6, 8 (xmin, xmax, ymin, ymax)
# coord. ref. :
# names : id1 id4
# type : <int> <int>
# values : 1 1


У crop, в отличие от intersect, геометрия и атрибуты y не передаются на выход.
Обрезать SpatVector можно по прямоугольнику (SpatRaster, SpatExtent) или по другому SpatVector. Если это не полигоны, то используется минимальная выпуклая оболочка.

Объединение векторов SpatVector, а также объектов SpatExtent, осуществляет функция union.

При объединении полигонов нужно учесть один важный момент. Объединим p1 и p2 с помощью union:

united <- union(p1, p2)
# class : SpatVector
# geometry : polygons
# dimensions : 2, 2 (geometries, attributes)
# extent : 0, 8, 0, 9 (xmin, xmax, ymin, ymax)
# coord. ref. :
# names : id1 id4
# type : <int> <int>
# values : 1 NA
# 1 1
plot(united[1], lwd=2, col="red")
plot(united[2], add=T, lwd=2, col="blue")


В результате получим вектор, состоящий из двух полигонов: “дырявого” p1 с вырезанным из него p2, и, собственно, p2. Если такой эффект вам не нужен, а нужно просто создать SpatVector из нескольких полигонов, используйте rbind:

merged <- rbind(p1, p2)
# class : SpatVector
# geometry : polygons
# dimensions : 2, 2 (geometries, attributes)
# extent : 0, 8, 0, 9 (xmin, xmax, ymin, ymax)
# coord. ref. :
# names : id1 id4
# type : <int> <int>
# values : 1 NA
NA 1



Объединение линий и точек c помощью union просто объединяет два набора данных без каких-либо геометрических пересечений — так же, как и rbind. На выходе получим атрибуты обоих исходных векторов.

Если x и y имеют разный геометрический тип, то возвращается коллекция SpatVectorCollection.

Функция c() создает их векторов SpatVectorCollection или добавляет объекты в существующую коллекцию:

collected <- c(p1, p2)
# class : SpatVectorCollection
# length : 2
# geometry : polygons (1)
polygons (1)
# names : ,


#R
Пространственные отношения между геометриями

Пространственные отношения между объектами — это про то, кто кого касается, пересекает, лежит внутри и т. п.

Выяснить пространственные отношения между геометриями векторов помогает функция relate. Она возвращает логическую матрицу, указывающую на наличие или отсутствие определенных пространственных отношений между геометриями x и y:

relate(x, y, relation, ...)


relation — отношение между геометриями: "intersects", "touches", "crosses", "overlaps", "within", "contains", "covers", "coveredby", "disjoint".

Посмотрим как это работает. Создадим новый полигон, лежащий внутри p1 и не пересекающийся с p2:

merged <- rbind(p1, p2)
p3 <- vect("POLYGON ((4 6, 5 6, 5 8, 4 8, 4 6))")
plot(merged, lwd=2)
lines(p3, lwd=2, col="blue")


Найдем, с какими полигонами из merged пересекается (intersects) p3:

relate(merged, p3, "intersects")
[,1]
[1,] TRUE
[2,] FALSE


p3 пересекается с первым элементом merged, то есть с p1, и не пересекается со вторым (p2).

is.related(x, y, relation, ...) возвращает логический вектор, указывающий на наличие/отсутствие определенных пространственных отношений между x и любой из геометрий в y.

is.related(merged, p3, "intersects")
[1] TRUE FALSE


#R
tidyplots

Цель пакета tidyplots (https://tidyplots.org/) — упростить создание графиков для научных публикаций. Он позволяет постепенно добавлять, удалять и корректировать элементы графиков, используя последовательный и интуитивно понятный синтаксис.

Многие пакеты tidy-вселенной так или иначе связаны с Хэдли Уикемом (Hadley Wickham), чего нельзя сказать о tidyplots. Более того, его автор Ян Бродер Энглер (Jan Broder Engler) предложил грамматику графики альтернативную принятой в знаменитом пакете ggplot2, разработанном Уикемом.

Для построения графиков используются функции вида Add, Remove, Adjust, Themes, Split, Output. С Add все понятно, но зачем нужен Remove? А вот зачем: вместо того, чтобы обнулять или делать пустым ненужный элемент, функции Remove говорят: “удалить заголовок легенды” (remove_legend_title) или “удалить ось y” (remove_y_axis). Вроде бы мелочь, но кому-то именно такой способ работы придется по душе. Функции Adjust настраивают элементы графиков, например, размер шрифта или цвет. Themes — это темы, то есть типовые настройки графиков. Split позволяет строить несколько графиков одновременно. Output настраивает вывод графиков в файлы.

Подробнее о работе с пакетом читайте в:

📖 Начало работы с tidyplots

Еще подробнее — в препринте.

Ян Энглер является также автором пакета tidyheatmaps.

Спасибо коллегам за наводку!

#R
Introduction to Environmental Data Science

Книга Introduction to Environmental Data Science (https://bookdown.org/igisc/EnvDataSci/) Джерри Дэвиса (Jerry Davis) посвящена анализу пространственных данных, связанных с исследованиями окружающей среды, на языке программирования R.

В книге есть краткое введение в R, описана работа с векторными и растровыми данными, моделирование, анализ спутниковых снимков и временных рядов.

Environmental Data Science book (https://edsbook.org/welcome) — аналогичный ресурс на Python.

Спасибо коллегам за наводку!

#R #python