Спутник ДЗЗ
3.12K subscribers
2.43K photos
139 videos
187 files
2.19K links
Человеческим языком о дистанционном зондировании Земли.

Обратная связь: @sputnikDZZ_bot
加入频道
This media is not supported in your browser
VIEW IN TELEGRAM
Применение функций к слоям данных: tapp и xapp

tapp применяет функцию fun к подмножествам слоёв SpatRaster, аналогично tapply и aggregate.

Слои объединяются на основе индекса. Например, для растра с шестью слоями можно использовать index=c(1,1,1,2,2,2). Он означает, что три первых слоя принадлежат одному подмножеству, а три следующих — другому. Если задана функция fun=sum, то на выходе получим SpatRaster с двумя слоями: суммой первых трёх слоев входного растра и суммой последних трёх слоев его же:

r <- rast(ncols=10, nrows=10)
values(r) <- 1:ncell(r)
s <- c(r, r, r, r, r, r)
s <- s * 1:6
b1 <- tapp(s, index=c(1,1,1,2,2,2), fun=sum)
b1
b2 <- tapp(s, c(1,2,3,1,2,3), fun=sum)
b2


Индексы могут повторяться, так что index=c(1,2) для растра с шестью слоями снова вернёт растр, состоящий их двух слоёв: один основан на нечетных слоях (1,3,5), другой — на чётных (2,4,6).

А вот пример поинтересней. В нём используется новый атрибут растровых данных — время, которое задаётся функцией time. С помощью tapp мы применяем заданные функции к слоям, сгруппированным по месяцам:

r <- rast(system.file("ex/elev.tif", package="terra"))
rst <- rep(r, 6) * 1:6
time(rst) <- as.POSIXct(c("2023-01-16","2023-01-17","2023-01-18","2023-02-17","2023-02-18","2023-02-19"),tz="UTC")

# Максимум по месяцам
x <- tapp(rst, "months", max)
# 95-й процентиль по месяцам
y <- tapp(rst, "months", fun = function(i) quantile(i, probs = 0.95, na.rm = T))


Применяет функцию к ячейкам двух растров, в том числе многослойных.

Вычислим попиксельную корреляцию между двумя многослойными растрами:

r <- rast(ncols=3, nrows=3, nlyr=5)
set.seed(1)
r <- init(r, runif)
s <- init(r, runif)
x <- xapp(r, s, fun=cor)


#R
Категоризация значений: classify

classify разделяет значения растровых данных на категории (классы), то есть заменяет диапазон значений на новое значение.

Например, можно разделить значения нормализованного разностного вегетационного индекса (NDVI) 1️⃣ по величине на несколько групп 2️⃣:

m <- c(-Inf,0.25, 1,
0.25, 0.3, 2,
0.3, 0.4, 3,
0.4, 0.5, 4,
0.5, Inf, 5)

rcl <- matrix(m, ncol=3, byrow=TRUE)

ndvi_cl <- classify(ndvi, rcl)


Начнём с конца. На вход функции classify подаётся исходная карта ndvi и матрица переклассификации (reclassification) rcl.

В матрице указывают границы диапазонов значений и номера классов, в которые эти диапазоны преобразуются. У нас таких классов пять. Чем больше номер класса, тем выше в нём значения NDVI.

Матрица rcl формируется на основе вектора m, состоящего из троек значений: нижняя граница диапазона, верхняя граница диапазона и номер класса. Классу 1 соответствует диапазон значений (-∞, 0.25], классу 2 — диапазон (0.25, 0.3] и т. д.

По умолчанию, левая граница диапазона не включается в класс, но это можно изменить, задав аргумент include.lowest=TRUE.

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

#R
This media is not supported in your browser
VIEW IN TELEGRAM
SpatRasterDataset и SpatRasterCollection

До сих пор мы работали с объектами класса SpatRaster.

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

SpatRaster может указывать на один или несколько файлов на диске, в которых хранятся значения ячеек, и/или хранить эти значения в памяти. Эти объекты могут быть созданы с помощью метода rast.

Из объектов SpatRaster можно создавать новые объекты того же класса, а кроме них — SpatRasterDataset и SpatRasterCollection.

SpatRasterDataset — это набор данных, каждый элемент которого представляет собой SpatRaster для одной и той же области пространства (охвата) и системы координат, но, возможно, с разным разрешением. Элементы `SpatRasterDataset`используются для хранения отдельных переменных (например, температуры и осадков) или придания четвёртого измерения (например, высоты, глубины или времени) данным, которые уже имеют три измерения (несколько слоёв).

SpatRasterCollection — это коллекция (список) объектов SpatRaster без ограничений по протяженности или другим геометрическим параметрам. Коллекции применяют для хранения нескольких объектов SpatRaster, чтобы затем объединить их (merge) или создать из них мозаику (mosaic).

SpatRasterDataset создаётся функцией (методом) sds:

r <- rast(system.file("ex/logo.tif", package="terra"))   
x <- sds(r, r/2)
names(r) <- c("first", "second")
r

# Узнаем длину SpatRasterDataset
length(x)

# Извлечём 2-й SpatRaster
x[2]


SpatRasterCollection создаётся функцией sprc:

x <- rast(xmin=-110, xmax=-50, ymin=40, ymax=70, ncols=60, nrows=30)
y <- rast(xmin=-80, xmax=-20, ymax=60, ymin=30)
res(y) <- res(x)
values(x) <- 1:ncell(x)
values(y) <- 1:ncell(y)

z <- sprc(x, y)
z
z[1]


#R
Введение в геопространственный анализ и визуализацию в R

Журнал MDPI Data, наряду с данными, публикует статьи о методах обработки и анализа данных. В нём нам попалась забавная учебная статья

📖 Maesen, P., & Salingros, E. (2024). Introduction to Reproducible Geospatial Analysis and Figures in R: A Tutorial Article. Data, 9(4), 58. https://doi.org/10.3390/data9040058

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

В статье кратко представлены основные понятия растровых и векторных данных, системы координат, также описан базовый рабочий процесс для проведения воспроизводимых исследований в R. Приведены примеры создания различных типов карт (scatter, bubble, choropleth, hexbin и faceted) на основе открытых экологических данных. На этих примерах демонстрируются основные операции с геопространственными векторными данными (чтение, преобразование систем координат, создание геометрий, буферных зон вокруг существующих геометрий, определение пересечений между геометриями и т. п.).

Данные и скрипты есть в Supplementary Materials (скачать https://www.mdpi.com/article/10.3390/data9040058/s1).

📸 Карта средних значений органического углерода почвы (soil organic carbon, SOC) в Германии, измеренных в период 2011–2018 гг.

#R
Пакет mlhrsm для картографирования влажности почвы с высоким пространственным разрешением

Влажность почвы — одна из ключевых переменных в сельском хозяйстве и в экологии. С определением влажности почвы в масштабе поля по данным дистанционного зондирования из космоса существуют большие проблемы: исходные данные имеют низкое пространственное разрешение, а результатам машинного обучения недостаёт точности.

В работе

📖 Peng, Y., Yang, Z., Zhang, Z., & Huang, J. (2024). A Machine Learning-Based High-Resolution Soil Moisture Mapping and Spatial–Temporal Analysis: The mlhrsm Package. Agronomy, 14(3), 421. https://doi.org/10.3390/agronomy14030421

предлагается очередная модель машинного обучения для картографирования влажности почвы. Она основана на алгоритме квантильного случайного леса (quantile random forest) и использует данные наземных датчиков влажности, параметры поверхности земли (растительность, рельеф и почву), а также оценки влажности почвы на поверхности и в прикорневой зоне, полученные по спутниковым данным. В работе используются данные спутников SMAP, Sentinel-1, Landsat, а также данные приборов MODIS. Область исследования: CONUS (contiguous USA), где существуют открытые данные наземных датчиков влажности почвы.

Модель позволяет создавать карты влажности почвы высокого разрешения (от 30 до 500 м, от ежедневных до ежемесячных) и строить оценки неопределенности на участках по территории CONUS на уровнях 0–5 см и 0–1 м.

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

Привлекает в работе то, что весь расчёт оформлен в виде пакета mlhrsm на языке R с открытым исходным кодом. По сути, статья — это руководство пользователя mlhrsm, где показан расчёт влажности почвы на примере одного поля. Её можно использовать для анализа сильных и слабых сторон подобных моделей, а также как основу для создания собственных моделей.

#почва #сельхоз #R
1️⃣ Скрипт для обработки ежемесячных данных.
2️⃣ Список космических и суборбитальных запусков в первом полугодии 2024 года.

#R
Получение данных FIRMS в R

Для получения данных воспользуемся API FIRMS. Здесь же приведена справка по параметрам API.

Параметры API 1️⃣:

🔹 Area — прямоугольная область интереса
🔹 Source — источник данных: прибор (MODIS/VIIRS) и спутник
🔹 Map Key — ключ доступа, который можно получить бесплатно 2️⃣
🔹 Date — дата
🔹 Day Range — интервал времени, до 10 суток

Весь код — это строка запроса к API. На выходе получаем таблицу данных, где, в частности, указаны дата, координаты и интенсивность возгорания.

Задаём границы области и преобразуем их в строку area. Результат добавляем к строке запроса к API:

# 1. Область интереса

xmin <- 130.2
ymin <- 60.0
xmax <- 133.5
ymax <- 61.8

area_coords <- c(xmin, ymin, xmax, ymax)
area <- paste(area_coords,sep = ",",collapse = ",")

# 2. Данные о возгораниях

get_fire_data <- function(main_url,map_key,source,area,day_range,date) {
url <- paste(main_url, map_key, source, area, day_range, date, sep = "/")
fire_data <- data.table::fread(url)
return(fire_data)
}


3️⃣ область интереса.

#R #пожары
get_firms.R
870 B
Скрипт для получения данных FIRMS.

#R
geodl

В R есть множество пакетов для работы с пространственными данными. А вот пакетов, где для анализа таких данных используются методы глубокого обучения (deep learning, DL), напротив, совсем мало.

Недавно появился пакет geodl, предоставляющий инструменты для семантической сегментации пространственных данных с помощью DL на основе свёрточной нейронной сети (CNN).

geodl построен на базе пакета torch, который поддерживает реализацию DL с помощью языков R и C++ без необходимости установки среды Python/PyTorch. Это значительно упрощает программную среду, необходимую для реализации DL в R. Растровые данные в geodl обрабатываются с помощью известного пакета terra, который также использует C++. Циклы обучения реализуются с помощью пакета luz.

Подробности о geodl изложены в 📖 препринте.

#R #нейронки
Векторные данные. Введение

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

Векторные данные представляют собой дискретные объекты с чёткими границами: река, дорога, город. Они состоят из 1) описания геометрии объекта и 2) переменных (атрибутов), связанных с объектом. Например, для города соответствующий векторный объект может содержать полигон, описывающий границы города (геометрию), и атрибуты, такие как “численность населения”, “площадь” и т. п.

Векторные объекты — это точки, линии, полигоны, а также наборы объектов одного типа — мультиточки, мультилинии, мультиполигоны.

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

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

Пакет terra определяет набор классов для представления пространственных данных, имена которых начинаются со Spat. Для векторных данных соответствующим классом является SpatVector.

Начнём с создания объектов SpatVector. Это часто делается при использовании координат, полученных с помощью глобальных навигационных спутниковых систем (GPS/ГЛОНАСС/Beidou). Также это пригодится для создания небольших примеров, иллюстрирующих ту или иную задачу. В большинстве других случаев вы будете считывать готовые объекты SpatVector из файлов или баз данных.

#R