Карты близости с использованием R

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

Не обязательно иметь все волшебство маркировки/внутренних границ, но я бы хотел, чтобы он остановился на морской границе (думая об использовании функции rgeos gintersection - см. здесь).

Я попытался сделать график плотности как «тепловые карты» (это было бы довольно хорошим решением/альтернативой) и поместить шейп-файл поверх (после этого , но они не выстраиваются в линию, и я не могу выполнить gintersection, вероятно, потому, что к ним не привязана система координат график плотности. .png" alt="введите здесь описание изображения">


person cstaff91    schedule 02.11.2017    source источник
comment
Для этого можно использовать функцию rgeos gBuffer(). В этой документации приведен хороший пример: niceubank.com/wp-content /uploads/2015/10/   -  person cstaff91    schedule 03.11.2017


Ответы (2)


Я использовал ваш вопрос, чтобы немного поиграть с новыми библиотеками...

Получите карту Великобритании и определите случайные точки

library(raster)
library(sf)
library(ggplot2)
library(dplyr)
library(tidyr)
library(forcats)
library(purrr)

# Get UK map
GBR <- getData(name = "GADM", country = "GBR", level = 1)
GBR_sf <- st_as_sf(GBR)

# Define 3 points on the UK map
pts <- matrix(c(-0.4966766, -2.0772529, -3.8437793, 
                51.91829, 52.86147, 56.73899), ncol = 2)
# Project in mercator to allow buffer with distances
pts_sf <- st_sfc(st_multipoint(pts), crs = 4326) %>% 
  st_sf() %>%
  st_transform(27700)

ggplot() +
  geom_sf(data = GBR_sf) +
  geom_sf(data = pts_sf, colour = "red")

Карта данных

Рассчитать буферные зоны

Мы создаем список multipolygons для каждого буферного расстояния. Набор точечных данных должен быть в проекционных координатах (здесь Меркатор), так как буферное расстояние находится в масштабе системы координат.

# Define distances to buffer
dists <- seq(5000, 150000, length.out = 5)
# Create buffer areas with each distances
pts_buf <- purrr::map(dists, ~st_buffer(pts_sf, .)) %>%
  do.call("rbind", .) %>% 
  st_cast() %>%
  mutate(
    distmax = dists,
    dist = glue::glue("<{dists/1000} km"))
# Plot: alpha allows to see overlapping polygons
ggplot() +
  geom_sf(data = GBR_sf) +
  geom_sf(data = pts_buf, fill = "red",
          colour = NA, alpha = 0.1)

Перекрытие буфера

Удалить перекрытие

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

# Remove part of polygons overlapping smaller buffer
pts_holes <- purrr::map2(tail(1:nrow(pts_buf),-1),
            head(1:nrow(pts_buf),-1),
            ~st_difference(pts_buf[.x,], pts_buf[.y,])) %>%
  do.call("rbind", .) %>% 
  st_cast() %>%
  select(-distmax.1, -dist.1)
# Add smallest polygon
pts_holes_tot <- pts_holes %>% 
  rbind(filter(pts_buf, distmax == min(dists))) %>%
  arrange(distmax) %>%
  mutate(dist = forcats::fct_reorder(dist, distmax))
# Plot and define color according to dist
ggplot() +
  geom_sf(data = GBR_sf) +
  geom_sf(data = pts_holes_tot,
          aes(fill = dist),
          colour = NA) +
  scale_fill_brewer(direction = 2)

Буфер с дырками - полигоны-пончики

Удалить области в море

Если вы хотите найти область близости только на наземных частях, нам нужно удалить буферные области, которые находятся в море. Пересечение вычисляется между multipolygons с той же проекцией. Ранее я реализовал объединение карты Великобритании.

# Remove part of polygons in the sea
# Union and projection of UK map
GBR_sf_merc <- st_transform(st_union(GBR_sf), 27700)
pts_holes_uk <- st_intersection(pts_holes_tot, 
                              GBR_sf_merc)

ggplot() +
  geom_sf(data = GBR_sf) +
  geom_sf(data = pts_holes_uk,
          aes(fill = dist),
          colour = NA) +
  scale_fill_brewer(direction = 2)

А вот и финальная карта близости с использованием sf, ggplot2 и еще нескольких библиотек...

Карта близости

person Sébastien Rochette    schedule 07.11.2017

На примере Себастьяна более старомодный подход:

library(raster)
GBR <- getData(name = "GADM", country = "GBR", level = 1)
pts <- matrix(c(-0.4966766, -2.0772529, -3.8437793, 51.91829, 52.86147, 56.73899), ncol = 2)

r <- raster(GBR, res=1/12)
d <- distanceFromPoints(r, pts)
m <- mask(d, GBR)

plot(m)
person Robert Hijmans    schedule 07.11.2017
comment
Это должен быть ответ - person Thomas; 14.06.2021