10 Работа с геоданными: leaflet, geojson

library("tidyverse")

10.1 Векторная и растровая графика

Перед тем как обсуждать карты, следует сначала обсудить разницу между векторной и растровой графикой.

  • Растровые изображения представляют собой набор упорядоченных пикселей, про каждый из которых храниться информация о цвете. Векторное изображение нельзя бесконечно увеличивать — в какой-то момент станут видны пиксели, которые в каком-то смысле являются пределом увелечения. Наиболее популярные форматы растровых изображений: JPEG, GIF, PNG, BMP, TIFF и другие.
  • В векторных изображениях инормация храниться как собрани точек, линий и полигонов в некоторой системе координат, что позволяет бесконечно увеличивать такие изображения не теряя в качестве. Наиболее популярные форматы векторных изображений: PDF, SVG, EPS и другие.

Современные технологии позволяют соединять растровые и векторные изображения, а также трансформировать их друг в друга. Картографические данные могут попадать в разные типы: точки (столицы всех стран), линии (улицы в каком-нибудь городе), полигоны (границы стран и меньших регионов) обычно имеют некоторую геопривязку (для простоты давайте считать такими, все, что имеет широту и долготу), так что могут быть представлены векторно, однако существует достаточно много информации, которую невозможно представить никак подругому, кроме как векторно: спутниковые снимки, существующие физические/политические/климатические/исторические и т. п. карты, выдача картографических сервисов, таких как Google Maps. Кроме того, занимаясь любыми типами визуализации следует помнить о разнице статической визаулизации, которую после создания нельзя изменить, и динамической визуализации, которая позволяет пользователям изменять себя (увеличиваться и уменьшаться, кликать на собрание точек и видеть их значения и т. п.). В данной главе, в отличие от предыдущих мы сосредоточимся на пакете для динамичского картографирования leaflet. Достаточно много тем останется за пределами этой главы: изменение проекции, манипуляции с географическими данными, работа с растровыми изображениями и другие (см., например, (Lovelace, Nowosad, and Muenchow 2019), доступная здесь).

10.2 Картографические примитивы

В картографии существуют свои элементарные единицы:

Эти единицы поддерживают популярные пакеты для манипуляции с георграфическими объектами: sp, sf и другие. В данном разделе мы не будем учиться операциям с этими объектами (объединение, вычитание и т. п., подробности смотрите в документации к пакету sp или в уже упомянавшейся книжке (Lovelace, Nowosad, and Muenchow 2019)).

10.3 Формат данных

10.3.1 .csv файлы

Источником географических данных могут быть обычные привычные нам csv файлы. Например, вот здесь, хранится датасет из проекта The Unwelcomed Мохамада А. Вэйкда (Mohamad A. Waked), содержащий информацию о месте и причинах смерти мигрантов и беженцев по всему миру с января 2014 года по июнь 2019 года.

unwelcomed <- read_csv("https://raw.githubusercontent.com/agricolamz/DS_for_DH/master/data/death_of_migrants_and_refugees_from_the_Unwelcomed_project.csv")
  • id — идентификационный номер;
  • date — дата происшедшего;
  • total_death_missing — количество погибших/пропавших;
  • location — место происшедшего;
  • lat — широта;
  • lon — долгота;
  • collapsed_region — обобщенная информация о регионе;
  • region — информация о регионе;
  • collapsed_cause — обобщенная информация о причине смерти;
  • cause_of_death — информация о причине смерти.

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

10.3.2 .geojson файлы

В данном разделе мы будем анализировать датасет, содержащий данные по всем странам мира.

countries <- jsonlite::read_json("https://github.com/agricolamz/DS_for_DH/raw/master/data/countries.geojson")

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

countries$features %>% 
  map("properties") %>% 
  tibble(name = map_chr(., "name"),
         pop_est = map_chr(., "pop_est"),
         income = map_chr(., "income_grp")) %>% 
  select(-1) %>% 
  mutate(pop_est = as.double(pop_est),
         income = as.factor(income)) ->
  country_features
country_features

Еще одно преимущество формата .geojson заключается в том, что его позволяет просматривать github (см. пример).

10.3.3 .shp файлы

10.4 leaflet

Для начала включим библиотеку:

library("leaflet")

10.4.1 Работа с .geojson

countries$style = list(
  weight = 1,
  color = "#555555",
  opacity = 1,
  fillOpacity = 0.8
)

pal_num <- colorNumeric("Greens", domain = c(min(country_features$pop_est),
                                             max(country_features$pop_est)))
pal_cat <- colorFactor("RdYlBu", domain = country_features$income)

country_features %>% 
  mutate(pop_est_color = pal_num(pop_est),
         income_color = pal_cat(income)) ->
  country_features

map(seq_along(countries$features), function(x){
  countries$features[[x]]$properties$style <- list(fillColor = country_features$income_color[x])
  countries$features[[x]]
}) ->
  countries$features

leaflet() %>% 
  addGeoJSON(geojson = countries) %>% 
  addLegend(pal = pal_cat, 
            values = country_features$income, 
            title = "Income")
map(seq_along(countries$features), function(x){
  countries$features[[x]]$properties$style <- list(fillColor = country_features$pop_est_color[x])
  countries$features[[x]]
}) ->
  countries$features

leaflet() %>% 
  addGeoJSON(geojson = countries) %>% 
  addLegend(pal = pal_num, 
            values = country_features$pop_est, 
            title = "Population")

10.4.2 Комбинация карт: leafsync

Включим библиотеку:

library("leafsync")

Ссылки на литературу

Lovelace, R., J. Nowosad, and J. Muenchow. 2019. Geocomputation with R. CRC Press.