В дальнейшем я предполагаю, что объект 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)