создание равномерно расположенных полилиний по округам с помощью R

#r #geospatial #sf #rgeo-shapefile

#r #геопространственный #sf #rgeo-шейп-файл

Вопрос:

Я хотел бы создать равномерно распределенные полилинии, идущие с севера на юг с интервалом 50 миль между каждой линией и длиной 10 миль. Не уверен, возможно ли это с помощью пакета sf. В приведенном ниже примере я хотел бы, чтобы линии заполняли округа по всему штату Вашингтон.

 
library(tigris)
library(leaflet)

states <- states(cb = TRUE)

counties<-counties(cb=TRUE)

counties<- counties%>%filter(STATEFP==53)

states<- states%>%filter(NAME=="Washington")

leaflet(states) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(fillColor = "white",
              color = "black",
              weight = 0.5) %>%
  addPolygons(data=counties,color='red',fillColor = 'white')%>%
  setView(-120.5, 47.3, zoom=8)
  

Я обновил, чтобы включить изображение того, что я хотел бы сделать ниже.введите описание изображения здесь

Комментарии:

1. Вам просто нужна полоса вертикальных линий с запада на восток через центр Вашингтона?

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

3. Я добавил изображение того, что я хотел бы сделать в вопросе выше. Спасибо!

Ответ №1:

Вы можете создать multilinestring объект sf с нуля, указав координаты.

Вы можете получить эти координаты из extent (ограничительной рамки) Вашингтона, но вам также может быть интересно узнать, как создать сетку, которую я продемонстрирую ниже, потому что это может быть полезно.

Скопируйте и вставьте этот воспроизводимый пример:

 library(tidyverse)
library(tigris)
library(leaflet)
library(sf)
library(raster)

states <- states(cb = TRUE)

# subset for WA and transform to a meter-based CRS 
states <- states %>% 
  filter(NAME == "Washington") %>% 
  st_transform(crs = 3857) # Mercator

# fifty miles in meters
fm <- 80467.2

# subset for Washington
states_sp <- as(states, "Spatial")

# create a grid, convert it to polygons to plot
grid <- raster(extent(states_sp), 
               resolution = c(fm, fm), 
               crs = proj4string(states_sp))
grid <- rasterToPolygons(grid)
plot(states_sp)
plot(grid, add = TRUE)

# find the top y coordinate and calculate 50 mile intervals moving south
ty <- extent(grid)[4]  # y coordinate along northern WA edge
ty <- ty - (fm * 0:7)  # y coordinates moving south at 10 mile intervals

# create a list of sf linestring objects
l <- vector("list", length(ty))
for(i in seq_along(l)){
  l[[i]]  <- 
    st_linestring(
      rbind(
        c(extent(grid)[1], ty[i]),
        c(extent(grid)[2], ty[i])
      )
    )
}

# create the multilinestring, which expects a list of linestrings
ml <- st_multilinestring(l) 

plot(states_sp)
plot(as(ml, "Spatial"), add = TRUE, col = "red")
  

Как вы можете видеть, я переключаюсь между sf sp объектами и с помощью функций as(sf_object, "Spatial") и st_as_sf(sp_object) . Используйте их для преобразования данных в соответствии с вашими потребностями.

введите описание изображения здесь

Комментарии:

1. Это довольно близко к тому, что мне нужно. Я обновил вопрос изображением того, чего я пытаюсь достичь. Возможно ли это с вашим кодом? Кроме того, если нет других ответов, я вознагражу вас проверкой, если я не смогу получить именно то, что мне нужно. Ценю вашу помощь!

2. Насколько мне известно, нет готовой функции для создания именно того, что вы ищете, поэтому вам нужно будет создать объект multilinestring с нуля, измеряя расстояния в CRS на основе счетчиков, перебирая список для определения строк st_linestring(rbind(c(x1, y1), c(x2,y1))) , а затем связывая эти элементы списка вединый объект multilinestring с st_multilinestring(my_list_of_lines) . То, что я предоставил, должно помочь вам в этом, вам просто нужно изменить координаты.

3. Звучит неплохо. Я только что понял, что могу также разделить линии через каждые X миль, так что это сработает. Еще раз спасибо!