Спутник ДЗЗ
2.87K subscribers
2.21K photos
124 videos
175 files
1.95K links
Человеческим языком о дистанционном зондировании Земли.

Обратная связь: @sputnikDZZ_bot
加入频道
Отображение растровых данных

Основными функциями для отображения растровых данных в terra являются функция plot, которая отображает слои данных, и plotRGB, которая создает и отображает RGB-композитные изображения.

Функция plot отображает растровые данные по слоям. Основные ее возможности видны на примере знакомой нам функции plot_raster:

plot_raster <- function(r) {
plot(r, axes = F, legend = F)
plot(as.polygons(r, na.rm = F, dissolve = F, trunc = F), add = T)
text(r, digits = 2)
}


Первый вызов plot отображает растр без осей координат (axes = F) и легенды (legend = F).

Второй plot добавляет поверх первого изображения (add = T) набор полигонов, созданный из ячеек исходного растра. Опция add = T очень удобна для добавления изображений векторных объектов, например границ, поверх растровых данных. Можно накладывать друг на друга и растровые данные, задавая их прозрачность параметром alpha, который изменяется от 0 (прозрачный) до 1 (непрозрачный).

Функция text отображает… текст поверх исходного растра r. В нашем примере она отображает значения соответствующих ячеек r.

При отображении пространственных данных можно использовать знакомые по базовой графике функции points и lines. В terra они служат для отображения точечных и линейных векторных объектов, а функция polys отображает полигоны.

plot_raster() рассчитана на работу с однослойными данными. Нам же, чаще всего, предстоит работать с данными многослойными. В следующем примере plot отображает 9 каналов снимка, полученного прибором OLI спутника Landsat 8:

lc <- rast("LC08_044034_20170614.tif")
# class : SpatRaster
# dimensions : 1245, 1497, 9 (nrow, ncol, nlyr)
# resolution : 30, 30 (x, y)
# extent : 594090, 639000, 4190190, 4227540 (xmin, xmax, ymin, ymax)
# coord. ref. : WGS 84 / UTM zone 10N (EPSG:32610)

plot(lc)


Для визуального дешифрирования создаются различные комбинации трех спектральных каналов так, чтобы обеспечить максимальную различимость интересующих объектов по отношению к фону. Такие композитные изображения создаются функцией plotRGB:

plotRGB(x, r=1, g=2, b=3)


x — объект типа SpatRast. Следующие три аргумента — номера слоев данных (спектральных каналов), использующихся в качестве красного (r), зеленого (g) и синего (b) цветов итогового изображения. Аргументов у plotRGB намного больше, мы рассматриваем лишь самые основные.

При заданных по умолчанию номерах спектральных каналов, для снимка Landsat 8 мы получим изображение в комбинации 1-2-3, где в роли красного выступает Coastal/Aerosol (канал 1), в роли зеленого — синий (канал 2), а синим будет зеленый (канал 3). Не слишком удачный выбор. Комбинация “естественные цвета” 4-3-2 (красный-зеленый-синий) задается так

plotRGB(lc, 4, 3, 2)


В результате получим темный прямоугольник. Дело в том, что по умолчанию значения пикселей в каждом канале находятся в интервале от 0 до 255, тогда как на снимке эти значения лежат в интервале от 0 до 1. Исправить ситуацию может параметр scale — целое число, которое задает максимальное значение пикселя в каждом из трех каналов

plotRGB(lc, 4, 3, 2, scale = 1)


Второй вариант решения проблемы — параметр stretch. Он задает способ растяжения изображений для повышения контрастности: "lin" (линейный) или "hist" (гистограмма).

plotRGB(lc, 4, 3, 2, stretch = "lin")


Комбинацию 5-4-3 мы видели здесь. Для изучения сельскохозяйственных земель, водно-болотных угодий, а также при анализе пустынь может пригодиться комбинация 7-5-3 (SWIR, NIR, Green):

plotRGB(lc, 7, 5, 3, stretch = "lin")


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

#R
Сигнальная информация или автоматизация сбора аннотаций статей

В древности, каждые две недели в наш домашний почтовый ящик приходила сигнальная информация ВИНИТИ — ксерокопии оглавлений журналов по выбранной тематике. Сигнальная информация, увы, давно уже не приходит, но потребность в ней осталась. Попробуем решить эту проблему при помощи нескольких строк кода в R и библиотеки rcrossref.

Ключевой фрагмент кода:

start_date <- "2024-01-01"
end_date <- "2024-01-30"

jname <- "Remote Sensing"

dt_list <- cr_works(filter = c(from_pub_date = start_date,
until_pub_date = end_date,
container_title = jname,
type = "journal-article"),
limit = 1000)

cat("Найдено статей:", dt_list$meta$total_results)
dt.0 <- dt_list$data

cols <- c("title","url","abstract")
dt <- dt.0[, cols]


Самое главное делает функция cr_works. Она отбирает из базы данных CrossRef статьи (type = "journal-article"), опубликованные в журнале Remote Sensing (jname) в период от start_date до end_date.

На выходе cr_works возвращает список с метаданными поиска (dt_list$meta) и таблицей найденных статей (dt_list$data). В этой таблице несколько десятков колонок.

Дальше мы отбираем из таблицы dt.0 нужные колонки ("title","url","abstract") и работаем с ними. Оставшаяся часть кода посвящена отображению результатов поиска в виде таблицы с гиперссылками. Полный код и пример построенной таблицы прилагаются ⬇️.

В CrossRef попадают аннотации статей далеко не ото всех журналов. Почему так происходит — неясно. Однако название и DOI есть для каждой публикации. Вообще, CrossRef — неплохой инструмент для наукометрических исследований. Но это уже другая история.

Задержка с помещением сведений о публикации в базу CrossRef для в журнала Remote Sensing составляет около двух суток.

#R #справка
⭐️ СТРАНЫ / КОМПАНИИ / СПУТНИКИ

Страны: #австралия #германия #индия #иран #испания #канада #китай #португалия #россия #США #япония и т. п.
Но:
#корея обозначает Северную и Южную Кореи
#РБ — Республика Беларусь
#UK — Великобритания

Компании: #planet #maxar

Спутники: #landsat #sentinel1 #sentinel2

⭐️ ДЗЗ

Методы и приборы
#альтиметр
#гиперспектр — гиперспектральная оптическая съемка
#лидар
#оптика — мультиспектральная оптическая съемка
#радиометр — микроволновой радиометр
#dnb — ночная съёмка (day / night band)
#SIF — солнечно-индуцированная флуоресценция хлорофилла
#ro — радиозатменный метод
#SAR — радарная съемка
#InSAR — радарная интерферометрия
#LST — съемка в тепловом инфракрасном диапазоне
#GNSSR — ГНСС-рефлектометрия
#sigint — радиоэлектронная разведка

Виды орбит: #ГСО — геостационарная, #VLEO — сверхнизкая

#основы — обучающие материалы по ДЗЗ
#обучение курсы, обучающие сервисы и т. п.
#история — в основном, история ДЗЗ
#индексы — спектральные индексы
#комбинация — комбинации каналов

Данные
#данные — коллекции данных ДЗЗ, наземных данных, карты и т.п.
#датасет — набор данных для машинного обучения
Дополнительные хештеги, описывающие данные:
#LULC — Land Use & Land Cover
#осадки
#SST — Sea Surface Temperature
#nrt — (near real time) изображения, получаемые в режиме, близком к реальном времени
#debris — космический мусор
#границы — административные границы
#DEM — цифровая модель рельефа (ЦМР)
#keyhole — рассекреченные снимки разведспутников

Литература, справочная информация
#справка — спектральные каналы, орбиты спутников, поиск данных и т.п.
#обзор
#книга — текст книги прикреплён к сообщению.
Дополнительные хештеги:
#наблюдение — ресурсы для наблюдения спутников и орбиты спутников
#космодромы

#конференции — анонс конференций/семинаров/школ, посвященных ДЗЗ и анализ их материалов.
#конкурсы — анонс конкурсов/чемпионатов/олимпиад.
#МВК — материалы заседаний Межведомственной комиссии (МВК) по использованию результатов космической деятельности.

#снимки — поучительные (хоть в чем-то интересные) снимки, первые снимки

Программные инструменты / Языки
#нейронки #софт #GEE #R #tool #python
#ИИ #FM — Foundation Model (Remote Sensing Foundation Model)

⭐️ ОТРАСЛИ / ТЕМАТИЧЕСКИЕ ЗАДАЧИ

#археология #атмосфера #вода #война #засуха #климат #лед #лес #нефть #океан #оползни #наводнение #пожары #почва #растительность #севморпуть #сельхоз #снег
#AGB — надземная биомасса
#ЧС — мониторинг стихийных бедствий и катастроф
#GHG — парниковые газы
Отдельные газы: #CO2 #NO2
#энергетика — космическая энергетика
#SSA — Space Situational Awareness
И еще — к ⬆️

Пакет R cropCalendars — для моделирования календарей сельскохозяйственных культур в соответствии с подходами Waha et al. (2012) и Minoli et al. (2019).

#R
Гармонизированные наземные данные Land Use/Cover Area Frame Survey (LUKAS)

📖 d’Andrimont, R. et al. (2020). Harmonised LUCAS in-situ land cover and use database for field surveys from 2006 to 2018 in the European Union. Scientific Data, 7(1). https://doi.org/10.1038/s41597-020-00675-z

В Европейском союзе (ЕС) с 2006 года проводятся трехгодичные обследования почвенно-растительного покрова и землепользования в рамках программы Land Use/Cover Area Frame Survey (LUCAS). В ходе пяти обследований LUCAS было собрано 1351293 наблюдений в 651780 уникальных точках для 106 переменных, а также 5,4 млн фотографий. В работе все эти данные были объединены в единую гармонизированную базу данных, которая теперь является наиболее полным натурным набором данных о почвенно-растительном покрове и землепользовании в ЕС.

Для доступа к данным создан специальный R-пакет lukas.

🔗Страница данных Harmonised LUCAS in-situ land cover and use database for field surveys from 2006 to 2018 in the European Union, со ссылкой на скачивание
🔗 Данные на figshare

📸 Примеры данных LUCAS по одной точке, которую посетили пять раз в период 2006–2018 гг.

#данные #R
This media is not supported in your browser
VIEW IN TELEGRAM
Применение функций к слоям данных: app и lapp

app применяет ко всем слоям растрового объекта SpatRaster заданную функцию fun, подобно тому как это делает apply для матрицы или таблицы.

r <- rast(ncols=3, nrows=3)
values(r) <- 1:ncell(r)
x <- c(r, sqrt(r), r+50)
s <- app(x, fun=sum)
s
# Для функций вроде
# "sum", "mean" и "max" можно сделать так:
# sum(x)


Можно посмотреть, как суммируются значения соответствующих пикселей всех слоёв x:

values(x)
values(s)


lapp (от layer-apply) позволяет объединить несколько слоёв растровых объектов. Его можно использовать как альтернативу растровой алгебре:

s <- rast(system.file("ex/logo.tif", package="terra")) + 1  
ss <- s[[2:1]]

fvi <- function(x, y) {(x - y ) / (x + y)}
x <- lapp(ss, fun=fvi)
# Другой вариант:
y <- fvi(s[[2]], s[[1]])


Количество аргументов функции fun должно соответствовать количеству слоёв растра.

f2 <- function(x, y, z){ (z - y + 1) / (x + y + 1) } 
p1 <- lapp(s, fun=f2)
p2 <- lapp(s[[1:2]], f2, z=200)


#R
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
This media is not supported in your browser
VIEW IN TELEGRAM
Создание векторных объектов: точки

Зададим координаты (долготу и широту) точек и составим из них матрицу с помощью функции cbind():

longitude <- c(-116.7, -120.4, -116.7, -113.5, -115.5, -120.8, -119.5, -113.7, -113.7, -110.7)
latitude <- c(45.3, 42.6, 38.9, 42.1, 35.7, 38.9, 36.2, 39, 41.6, 36.9)
lonlat <- cbind(longitude, latitude)


Для выполнения этих операций пакет terra не нужен. А вот дальше он понадобится, так что не забудьте его загрузить с помощью library(terra).

Обратите внимание, что в отличие от географии, где первой координатой указывается широта (latitude), здесь первой указана долгота (longitude). Так принято во многих компьютерных программах для работы с пространственными данными. Здесь работают традиции не географии, а математики: долгота соответствует координате Х декартовой системы координат, которая обычно в математике указывается первой.

Для создания объектов SpatVector с нуля или из файлов данных служит функция vect пакета terra

pts <- vect(lonlat)


Фактически, vect является методом класса SpatVector. Мы будем часто называть подобные методы функциями, поскольку путаницы это не создаст.

Заглянем внутрь pts:

pts
## class : SpatVector
## geometry : points
## dimensions : 10, 0 (geometries, attributes)
## extent : -120.8, -110.7, 35.7, 45.3 (xmin, xmax, ymin, ymax)
## coord. ref. :

geom(pts)
## geom part x y hole
## [1,] 1 1 -116.7 45.3 0
## [2,] 2 1 -120.4 42.6 0
## [3,] 3 1 -116.7 38.9 0
## [4,] 4 1 -113.5 42.1 0
## [5,] 5 1 -115.5 35.7 0
## [6,] 6 1 -120.8 38.9 0
## [7,] 7 1 -119.5 36.2 0
## [8,] 8 1 -113.7 39.0 0
## [9,] 9 1 -113.7 41.6 0
## [10,] 10 1 -110.7 36.9 0


Видно, что это объект класса SpatVector, который состоит из точек (geometry: points). Всего этих точек 10 и атрибутов у данных нет (dimensions: 10, 0 (geometries, attributes)). Экстент (extent) или охват данных автоматически рассчитан по координатам точек. В свойствах объекта указана система координат (coord. ref.). При создании pts мы её не задали. Давайте сделаем это сейчас.

Задать или узнать текущую систему координат (Coordinate Reference System, CRS) можно с помощью функции crs, знакомой нам по работе с растровыми данными:

crdref <- "+proj=longlat +datum=WGS84"
crs(pts) <- crdref

pts
## class : SpatVector
## geometry : points
## dimensions : 10, 0 (geometries, attributes)
## extent : -120.8, -110.7, 35.7, 45.3 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs


Такого же результата можно было добиться, задав систему координат при создании pts

pts <- vect(lonlat, crs=crdref)
pts


Теперь добавим к нашему объекту атрибуты (переменные). Сначала создадим таблицу, число строк которой должно совпадать с числом точек (линий, полигонов, …) в векторном объекте:

precip_val <- runif(nrow(lonlat), min=0, max=100)
dt <- data.frame(ID=1:nrow(lonlat), precip=precip_val)


Здесь мы сгенерировали случайные значения осадков (precip_val) в диапазоне от 0 до 100, которых будет столько же, сколько и точек. Затем эти значения поместили в таблицу атрибутов.

Создадим новый векторный объект ptsv с заданными атрибутами

ptsv <- vect(lonlat, atts=dt, crs=crdref)


ptsv
## class : SpatVector
## geometry : points
## dimensions : 10, 2 (geometries, attributes)
## extent : -120.8, -110.7, 35.7, 45.3 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs
## names : ID precip
## type : <int> <num>
## values : 1 98.93
## 2 15.76
## 3 68.81


У ptsv два атрибута: идентификатор точки (ID) и значение осадков в точке (precip).

#R
Создание векторных объектов: линии и полигоны

Создание объектов SpatVector из линий или полигонов немного сложнее, чем из точек, но всё же довольно просто:

longitude <- c(-116.8, -114.2, -112.9, -111.9, -114.2, -115.4, -117.7)
latitude <- c(41.3, 42.9, 42.4, 39.8, 37.6, 38.3, 37.6)
# Было для точек:
# lonlat <- cbind(longitude, latitude)
lonlat <- cbind(id=1, part=1, longitude, latitude)
lonlat
## id part lon lat
## [1,] 1 1 -116.8 41.3
## [2,] 1 1 -114.2 42.9
## [3,] 1 1 -112.9 42.4
## [4,] 1 1 -111.9 39.8
## [5,] 1 1 -114.2 37.6
## [6,] 1 1 -115.4 38.3
## [7,] 1 1 -117.7 37.6


Понадобилось указать, что все точки относятся к одному элементу (id=1) — линии или полигону.

При создании объекта также нужно указать тип (type) составляющих его векторных данных:

lns <- vect(lonlat, type="lines", crs=crdref)
lns
## class : SpatVector
## geometry : lines
## dimensions : 1, 0 (geometries, attributes)
## extent : -117.7, -111.9, 37.6, 42.9 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs

pols <- vect(lonlat, type="polygons", crs=crdref)
pols
## class : SpatVector
## geometry : polygons
## dimensions : 1, 0 (geometries, attributes)
## extent : -117.7, -111.9, 37.6, 42.9 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs


Результаты отобразим на карте:

plot(lns, col='green', lwd=3)
plot(pols, border='blue', col='yellow', lwd=3)


#R
Курс “Open-Source Spatial Analytics (R)” [ссылка]

Курс посвящен изучению основ работы в свободной среде программирования R, в первую очередь, для анализа геопространственных данных. Он рассчитан на тех, кто уже имеет некоторые знания о ГИС, работе с картами, картографическими проекциями, векторными и растровыми данными. Опыт работы с R, напротив, не требуется. Предполагается, что вы обучитесь программировать на R по ходу курса.

Справочный материал представлен в виде примеров кода, видео и презентаций. Есть задания для практического обучения. В центральная колонке 📸 представлены модули курса, в левой — примеры и задания.

Курс подготовлен в West Virginia View (🔗 https://wvview.org) — это консорциум государственных, частных и некоммерческих организаций, занимающихся дистанционным зондированием, который является членом AmericaView — общеамериканской сети организаций, способствующей развитию образования в области дистанционного зондирования Земли. Руководитель исследований в West Virginia View — Аарон Максвелл (Aaron Maxwell), доцент кафедры геологии и географии Университета Западной Вирджинии.

Другие курсы West Virginia View:

💻 Methods in Open Science
👨🏻‍💻 GIScience
👨🏼‍💻 Open-Source GIScience
🛰 Remote Sensing
🌍 Digital Cartography
🌐 Client-Side Web GIS
🕸 Geospatial Deep Learning

#R #обучение
This media is not supported in your browser
VIEW IN TELEGRAM
Чтение и запись векторных данных

Чтение векторных файлов осуществляет функция vect — та же, что отвечает за создание векторных данных.

Одним из распространенным форматов файлов векторных данных является шейпфайл (shapefile). Это набор из четырёх (или большего числа) файлов с одинаковыми именами, но разными расширениями. Для шейпфайла x в одной папке должны находиться: x.shp, x.shx, x.dbf и x.prj.

Откроем шейпфайл, поставляемый вместе с пакетом terra:

library(terra)
filename <- system.file("ex/lux.shp", package="terra")
## [1] "C:/Users/User/AppData/Local/R/win-library/4.3/terra/ex/lux.shp"

s <- vect(filename)
s
## class : SpatVector
## geometry : polygons
## dimensions : 12, 6 (geometries, attributes)
## extent : 5.74414, 6.528252, 49.44781, 50.18162 (xmin, xmax, ymin, ymax)
## source : lux.shp
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## names : ID_1 NAME_1 ID_2 NAME_2 AREA POP
## type : <num> <chr> <num> <chr> <num> <int>
## values : 1 Diekirch 1 Clervaux 312 18081
## 1 Diekirch 2 Diekirch 218 32543
## 1 Diekirch 3 Redange 259 18664


Функция system.file возвращает полный путь к файлу. Она нужна только для примеров работы с данными, поставляемыми с R. Для собственных файлов используйте функцию vect, указав полный путь к нужному файлу.

vect возвращает объекты SpatVector. Фактически, она создаёт эти объекты с нуля, как мы видели раньше, или из файлов векторных данных различных форматов. В нашем случае построен SpatVector, состоящий из 10 полигонов с 6 атрибутами (переменными).

Для записи векторных служит функция writeVector:

outfile <- "shp_test.shp"
writeVector(s, outfile)


Чтобы перезаписать файл поверх, нужно добавить аргумент overwrite=TRUE

writeVector(s, outfile, overwrite=TRUE)


Для удаления файлов используют функции file.remove или unlink. Будьте осторожны, не спешите!

При удалении шейпфайла нам придётся удалять сразу несколько файлов. В качестве примера удалим shp_test. Сначала мы выделим нужные файлы функцией list.files, указав шаблон имени файла, а затем удалим их при помощи file.remove

ff <- list.files(pattern="^shp_test")
ff
## [1] "shp_test.cpg" "shp_test.dbf" "shp_test.prj" "shp_test.shp" "shp_test.shx"
file.remove(ff)
## logical(0)


TRUE на выходе file.remove показывает, что заданный файл удален.

#R