График простых возможностей на основе полигона geo json - PullRequest
1 голос
/ 07 марта 2020

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

, то есть просто нанесите на карту объекты внутри и в том числе по кольцевой дороге.

Geo json доступен здесь .

Было бы также здорово добавить буфер по краю для включения кольца дорога.

Мой код для рисования всех функций (неограничен гео json ниже).

library(tidyverse)
library(osmdata)

bounding_box <- getbb("Birmingham", featuretype = "city")

streets <- bounding_box %>%
  opq()%>%
  add_osm_feature(key = "highway", 
                  value = c("motorway", "trunk", "primary", "secondary", "tertiary")) %>%
  osmdata_sf()

ggplot() +
  geom_sf(data = streets$osm_lines,
          inherit.aes = FALSE,
          color = "grey",
          size = 1) +
  theme_void() +
  theme(
    plot.background = element_rect(fill = "white"),
    legend.position = "none"
  ) +
  coord_sf(xlim = c(-1.933, -1.869),
       ylim = c(52.46,  52.496),
       expand = FALSE) 

1 Ответ

1 голос
/ 07 марта 2020

В дальнейшем я предполагаю, что объект streets уже был определен путем запуска первых нескольких строк кода в вопросе. Следующим шагом будет чтение полигона с помощью read_sf() из пакета sf. Следующая строка преобразуется в более подходящую систему координат (OSGB 1936 / Briti sh National Grid), поскольку добавление буфера в метрах невозможно в координатах lon / lat. Буфер 40 метров добавляется с помощью st_buffer() и, наконец, координаты преобразуются обратно в WGS84:

library(sf)
area <- read_sf("~/Birmingham CAZ 2020.GeoJSON") %>%
        st_transform(27700) %>%
        st_buffer(units::set_units(40, m)) %>%
        st_transform(4326)

Конечно, вам нужно адаптировать путь к тому месту, где вы фактически сохранили файл. Затем я использую st_intersection() для извлечения части streets$osm_lines, которая находится внутри многоугольника:

streets_area <- st_intersection(poly, streets$osm_lines)

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

ggplot() +
  geom_sf(data = area) +
  geom_sf(data = streets_area,
          inherit.aes = FALSE,
          color = "grey",
          size = 1) +
  theme_void() +
  theme(
    plot.background = element_rect(fill = "white"),
    legend.position = "none"
  ) +
  coord_sf(xlim = c(-1.933, -1.869),
       ylim = c(52.46,  52.496),
       expand = FALSE)

enter image description here

...