使用 R 在县上创建均匀间隔的多段线
create evenly spaced polylines over counties using R
我想创建从北到南的间隔均匀的多段线,每条线之间的间距为 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)
我已经更新,在下面包含了我想要执行的操作的图片。
您可以通过指定坐标从头开始创建 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")
如您所见,我使用函数 as(sf_object, "Spatial")
和 st_as_sf(sp_object)
在 sf
和 sp
对象之间来回切换。使用这些将数据转换为您的需要。
我想创建从北到南的间隔均匀的多段线,每条线之间的间距为 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)
我已经更新,在下面包含了我想要执行的操作的图片。
您可以通过指定坐标从头开始创建 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")
如您所见,我使用函数 as(sf_object, "Spatial")
和 st_as_sf(sp_object)
在 sf
和 sp
对象之间来回切换。使用这些将数据转换为您的需要。