library(sf)
library(leaflet)
library(tidyverse)
library(readxl)
library(ggplot2)
library(reshape2)
library(stringr)
library(purrr)
library(patchwork)
library(dplyr)
library(proxy)
library(plotly)
library(scales)
library(htmltools)
library(svglite)
library(leaflet.extras)
theme_set(theme_bw())

full_scores <- read_xlsx("full_scores.xlsx")
o <- read_xlsx("bio.xlsx")
e <- readRDS("e_data.rds")
k <- readRDS("k_data.rds")
ek <- readRDS("ek_data.rds")

О проекте

В 2023 году группа исследователей из РУДН и Центра популяризации биоразнообразия “НатУРАЛист” задалась вопросом: “Возможно ли создать методику описания городской травянистой растительности, доступную для использования горожанами без образования ботаника, да и еще такую, чтобы собираемые данные были полезны для оценки экосистемных услуг газонов, лугов и пустырей на урбанизированных территориях?”

За год был создан протитип методики для тестирования и летом 2024 года проведено его тестирование на 48 участках с травянистой растительностью в двух городах - Екатеринбурге и Кирове.

Волонтерами этого этапа стали активные пользователи платформы iNaturalist в Екатеринбурге, студенты Уральского федерального университета и разработчики методики. Всего на выбранных участка были сделаны 100 описаний, включая повторные описания одних и тех же участков разными волонтерами.

На этой веб-странице мы представляем результаты прошедшего этапа. Эти результаты помогли нам скорректировать дальнейшую работу с методикой описания городской растительности. К летнему сезону 2025 года была создана новая форма и изменены подходы к некторым показателям. Надеемся, что в итоге у нас получится создать работающий инструмент для первичной оценки ценности городских территорий с травянистой растительностью. Под ценностью мы предполагаем количественную и/или качественную оценку экосистемных услуг ландшафтов и биоты.

Что такое экосистемные услуги? [Нажмите, чтобы увидеть ответ]

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

Полезные ископаемые, солнечная энергия имеют ясные финансовые оценки. А как определить ценность экосистем в очистке воды и воздуха, в формировании культуры и обучении человека?

Этим уже полвека занимаются исследователи.

«Экосистемные услуги» — так называют выгоды, которые получает человек от экосистем.

Выделяют следующие типы экосистемных услуг:

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

  • Культурные — нематериальные составляющие природных объектов для рекреации, эстетического удовольствия, обучения.

  • Регулирующие — свойства живых систем, которые обеспечивают регуляцию климата, стока, защиту от ветровой эрозии, разложение отходов.

  • Поддерживающие — обеспечивающие существование снабжающих, культурных и регулирующих услуг, а именно, почвообразование, фотосинтез и круговорот веществ.

Регулирующие и поддерживающие услуги имеют функциональные пересечения, поэтому они часто объединяются в классификациях.

Зачем нужен учет экосистемных услуг?

Ответов на этот вопрос может быть много. Вот несколько из них ⬇

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

Панирование территории для получения максимума экономических и экосистемных выгод с доступной площади.

Для обоснования сохранения экосистем или создания живых систем там, где есть недостаток экосистемных услуг.

Выявление потребностей людей в меняющемся обществе и климате.

Все ли можно посчитать в деньгах?

Нет, не все можно посчитать, но все ценно. Если использовать яркие выражения, то можно сказать, что функционирующие экосистемы стоят Жизни на Земле.

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

Какие экосистемные услуги газонов нашлись в нашем исследовании в 2024 году?

На текущий момент в работе выделяем три группы экосистемных услуг, которые включены в методику оценки участков с травянистой растительностью, а именно: 1) культурные экосистемные услуги, 2) поддерживающие и регулирующие экосистемные услуги и 3) биоразнообразие.

Среди первых двух групп мы выделяем положительные эффекты - сервисы - и отрицательные эффекты - диссервисы.

1. Культурные экосистемные услуги

К культурным экосистемным услугам, к разделу положительных эффектов в данной работе мы относим такие показатели как:

  • количество разнообразных способов использования территории участка жителями;

  • легкая доступность территории участка для всех групп населения;

  • отсутствие мусора на территории.

В части негативных эффектов среди культурных экосистмных услуг мы выделели такие:

  • неустроенность - наличие на участке разрушенных объектов благоустройства и инфраструктуры, наличие парковок на открытом грунте;

  • уровень замусоренности участка;

  • сложности с доступом на территорию для широких групп населения.

2. Поддерживающие и регулирующие экосистемные услуги

Баллы положительной части этой группы добавляют такие показатели:

  • разнообразие биоты - количество групп организмов, отмеченных волонтером в форме;

  • процент покрытия территории участка кронами деревьев;

  • высота травостоя;

  • покрытие почвы травами;

  • плотность видов трав на единицу площади.

Негативная сторона этого блока состоит из двух показателей:

  • процент открытой почвы на участке;

  • интенсивность кошения травостоя на участке.

3. Биоразнообразие

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

Особености первого представления результатов

На текущий момент результаты представлены для ознакомления, не являются данными для “постановки диагнозов” территориям в Екатеринбурге и Кирове, данные основаны на субъективной оценке волонтеров. Качественные показатели представлены по суммарной оценке всех волонтеров на каждом обследованном участке, а количественные показателии приведены как среднее по оценкам всех волонтеров для каждого обследованного участка. Биоразнообразие представлено по данным нашего проекта на платформе iNaturalist на основе наблюдений уровня “исследовательский”, количество видов, обнаруженных волонтерами на участке без учета повторов видов - своеобразный список видов. В этом представлении мы практически ничего не приводили к общему знаменателю, поэтому цифры будут в диапазоне от -30 до 40 для экосистемных услуг и от 1 до 74 для количества видов встреченных на участках в 2024 году.

Экосистемные услуги газонов в нашем исследовании

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

# Деление на широкие группы
good <- c('Positive usage', 'Good access', 'No Litter', 'Bio groups', 'Trees crown', 'Grass hight', 'Grassiness', 'Spieces density')
bad <- c('Bad facilities', 'Litter level', 'Poor access', 'Open soil', 'Mowing frequency')
# Переводы
good_rus <- c('Использование', 'Доступность', 'Отсутствие мусора', 'Разнообразие биоты', 
              'Покрытие кронами деревьев', 'Высота травостоя', 'Покрытие почвы травами', 
              'Плотность видов трав')
bad_rus <- c('Неустроенность', 'Замусоренность', 'Плохой доступ', 'Открытая почва', 'Кошение')
# Создаем таблицу с переводами
labels_df <- tibble(
  Indicator = c(good, bad),
  Label = c(good_rus, bad_rus),
  Group = c(rep("Good", length(good)), rep("Bad", length(bad)))
)
# Преобразуем данные в long формат
long_scores <- full_scores %>%
  pivot_longer(cols = -site_code, names_to = "Indicator", values_to = "Value") %>%
  filter(!is.na(Value)) %>%
  left_join(labels_df, by = "Indicator") %>%
  mutate(
    Group = factor(Group, levels = c("Good", "Bad")),
    # Инвертируем значения bad для отображения вниз
    Value = ifelse(Group == "Bad", -Value, Value)
  )
# Определим нужный порядок для Label (в русской версии)
ordered_labels <- c('Использование', 'Доступность', 'Отсутствие мусора', # голубые
  'Разнообразие биоты', 'Покрытие кронами деревьев', 'Высота травостоя',
  'Покрытие почвы травами', 'Плотность видов трав', # зелёные
  'Неустроенность', 'Замусоренность', 'Плохой доступ', # розовые
  'Открытая почва', 'Кошение' # оранжевые
)
# Задаем порядок уровней фактора
long_scores <- long_scores %>%
  mutate(Label = factor(Label, levels = ordered_labels))
# Цвета
good_colors <- c("#9ecae1", "#3182bd", "#2f699a", "#c4e48f", "#8cc72d", "#5a910f", "#3e6b08", "#244404")
bad_colors <- c("#fb07a1", "#fd7bcd", "#fda1dc", "#fb8542", "#fb6107")
# Сделаем вектор цветов в нужном порядке
all_colors <- c(good_colors, bad_colors)
names(all_colors) <- ordered_labels
# Привязка цветов
long_scores <- long_scores %>%
  mutate(Fill = case_when(
    Group == "Good" ~ good_colors[match(Indicator, good)],
    Group == "Bad" ~ bad_colors[match(Indicator, bad)],
    TRUE ~ "#999999"
  ))
# Упорядочим участки
long_scores$site_code <- factor(long_scores$site_code, levels = unique(full_scores$site_code))
# График ЭУ
p <- ggplot(long_scores, aes(x = site_code, y = Value, fill = Label)) +
  geom_col(position = "stack", width = 0.7) +
  scale_fill_manual(values = all_colors) +
  labs(
    x = "Коды участков в Екатеринбурге и Кирове",
    y = "Оценка уровня экосистемных услуг",
    title = "1. Вклад отдельных показателей в общую оценку по участкам",
    fill = "Показатель"
  ) +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 8),
        legend.text = element_text(size = 8))

ggplotly(p)

Какие еще культурные следы были обнаружены волонтерами?

Например такие ⬇ Вот как выглядит облако из наименований оставленных вещей на газонах в Екатеринбурге и Кирове

Биоразнообразие по данным проекта Травы в городе на платформе iNaturalist

pb <- ggplot(data = o, aes(x = as.factor(site_code))) +
  geom_bar(aes(y = spieces), stat = "identity", 
           fill = "#7cb518", alpha = 0.7) +
  geom_hline(yintercept = 0) +
  labs(x = NULL, y = NULL) +
  labs(title = NULL) +
  labs(
    x = "Коды участков в Екатеринбурге и Кирове",
    y = "Количество видов растений",
    title = "2. Данные разнообразия растений на обследованных участках") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 8),
        legend.text = element_text(size = 8)) +
  ylim(0, 75) + scale_y_continuous(breaks = c(25, 50, 75))

ggplotly(pb)

Данные на карте по каждому участку

Карта интерактивная, если кликнуть мышкой по интересующему участку, то появятся сводные данные по этой территории, собранные волонтерами в 2024 году. Города, в которых вы найдете полигоны с оценками - Екатеринбург и Киров.

# Считаем good и bad
summary_scores <- full_scores %>%
  mutate(
    good = rowSums(select(., all_of(good)), na.rm = TRUE),
    bad = rowSums(select(., all_of(bad)), na.rm = TRUE)
  ) %>%
  select(site_code, good, bad)

# Объединяем с биоразнообразием
summary_all <- summary_scores %>%
  left_join(o %>% select(site_code, spieces) %>% rename(biodiversity = spieces), by = "site_code")

# Проверка CRS
stopifnot(st_crs(e) == st_crs(k), st_crs(k) == st_crs(ek))

# Проверка и исправление геометрии
e <- st_make_valid(e)
k <- st_make_valid(k)
ek <- st_make_valid(ek)
k <- k %>%
  rename(`site_code` = `description`)
e <- e %>%
  rename(`site_code` = `description`)
ek <- ek %>%
  rename(`site_code` = `description`)

# Предположим, что full_scores содержит все нужные данные
valid_sites <- unique(summary_all$site_code)

# Фильтрация геоданных
e_data <- e %>% filter(site_code %in% valid_sites)
k_data <- k %>% filter(site_code %in% valid_sites)
ek_data <- ek %>% filter(site_code %in% valid_sites)


# объединяем с пространственными данными
e_data <- e_data %>% left_join(summary_all, by = "site_code")
k_data <- k_data %>% left_join(summary_all, by = "site_code")
ek_data <- ek_data %>% left_join(summary_all, by = "site_code")

# Объединяем данные
all_data <- bind_rows(
  e_data %>% mutate(layer = "E"),
  k_data %>% mutate(layer = "K"),
  ek_data %>% mutate(layer = "EK")
)

# Палитра биоразнообразия
pal <- colorNumeric(
  palette = c("#c4e48f", "#5a910f", "#244404"),
  domain = all_data$biodiversity,
  na.color = "lightgray"
)
# Палитра: градиент биоразнообразия
pal <- colorNumeric(
  palette = c("#c4e48f","#5a910f", "#244404"),
  domain = e_data$biodiversity
)


make_mini_plot <- function(site_code) {
  # Данные по участку
  df <- long_scores %>% filter(site_code == !!site_code)

  # Назначаем укрупнённые группы
  df <- df %>%
    mutate(
      DisplayGroup = case_when(
        Group == "Good" ~ "Положительное",
        Group == "Bad" ~ "Негативное",
        TRUE ~ NA_character_  # Явно фиксируем случай NA
      )
    ) %>%
    filter(!is.na(DisplayGroup))  # Удаляем мусор

  # Биоразнообразие
  bio_val <- summary_all %>%
    filter(site_code == !!site_code) %>%
    pull(biodiversity)

  bio_row <- tibble(
    site_code = site_code,
    Label = "Биоразнообразие",
    Value = bio_val,
    Group = NA,
    Fill = "#7cb518",
    DisplayGroup = "Биоразнообразие"
  )

  df_plot <- bind_rows(df, bio_row)

  # Упорядочим DisplayGroup
  df_plot$DisplayGroup <- factor(df_plot$DisplayGroup, levels = c("Положительное", "Негативное", "Биоразнообразие"))

  # Цвета
  colors <- c(all_colors, "Биоразнообразие" = "#7cb518")

  # Построим график с заголовком
  p <- ggplot(df_plot, aes(x = DisplayGroup, y = Value, fill = Label)) +
    geom_col(position = "stack", width = 0.6) +
    scale_fill_manual(values = colors) +
    scale_y_continuous(limits = c(-30, 75)) +
    labs(title = paste("Участок", site_code)) +
    theme_minimal(base_size = 10) +
    theme(
      legend.position = "none",
      plot.title = element_text(size = 9, hjust = 0.5, face = "bold"),
      axis.text.x = element_text(angle = 90, hjust = 1, size = 6),
      axis.title = element_blank()
    )

  tmpfile <- tempfile(fileext = ".svg")
  ggsave(tmpfile, p, device = "svg", width = 3.2, height = 2.5)
  paste(readLines(tmpfile, warn = FALSE), collapse = "\n")
}

all_data$popup_html <- purrr::map_chr(all_data$site_code, make_mini_plot)

centroids <- st_centroid(all_data)

leaflet() %>%
  addTiles() %>%

  # Участки E — с заливкой по биоразнообразию + popup-график
  addPolygons(
    data = all_data,
    fillColor = ~pal(biodiversity),
    fillOpacity = 1,
    color = "#351431", weight = 1.3,
    popup = ~popup_html,
    group = "Карта"
  ) %>%

  # Легенда биоразнообразия
  addLegend(
    pal = pal,
    values = all_data$biodiversity,
    title = "Биоразнообразие<br/>(число видов)",
    position = "bottomright",
    labFormat = labelFormat(suffix = " видов"),
    opacity = 0.99
  ) %>%
   addLabelOnlyMarkers(
    data = centroids,
    label = ~site_code,
    labelOptions = labelOptions(
      noHide = TRUE,
      direction = "top",
      textOnly = TRUE,
      style = list(
        "color" = "black",
        "font-size" = "12px",
        "background-color" = "rgba(255,255,255,0.6)",
        "padding" = "2px"
      )
    ),
    group = "labels"
  )

Контакты

Связаться с группой разработчиков или оставить комментарий по методике и ее результатам можно в нашей группе в социальной сети “ВКонтакте”.