问题
I have a set of begin and end coordinates that look like this:
begin.coord <- data.frame(lon=c(-85.76,-85.46,-85.89), lat=c(38.34,38.76,38.31))
end.coord <- data.frame(lon=c(-85.72,-85.42,-85.85), lat=c(38.38,38.76,38.32))
I am trying to create a set of 3 line segments by connecting each begin point to its corresponding end point. I would like the end product to be a SpatialLines object so that I can use the it with over function in the sp package.
回答1:
Here's a way:
## raw list to store Lines objects
l <- vector("list", nrow(begin.coord))
library(sp)
for (i in seq_along(l)) {
l[[i]] <- Lines(list(Line(rbind(begin.coord[i, ], end.coord[i,]))), as.character(i))
}
SpatialLines(l)
This makes a separate Lines object (each with a unique ID) for each pair, you otherwise might want a single object?
And just for fun, build as a spatstat psp object first and then coerce with methods in maptools:
library(spatstat)
p <- psp(begin.coord[,1], begin.coord[,2], end.coord[,1], end.coord[,2], owin(range(c(begin.coord[,1], end.coord[,1])), range(c(begin.coord[,2], end.coord[,2]))))
library(maptools)
as(p, "SpatialLines")
回答2:
One could also use the sf package to build a list of sfc class and then convert it to SpatialLines object:
# the given data
begin.coord <- data.frame(lon=c(-85.76,-85.46,-85.89), lat=c(38.34,38.76,38.31))
end.coord <- data.frame(lon=c(-85.72,-85.42,-85.85), lat=c(38.38,38.76,38.32))
library(sf)
# Create list of simple feature geometries (linestrings)
l_sf <- vector("list", nrow(begin.coord))
for (i in seq_along(l_sf)){
l_sf[[i]] <- st_linestring(as.matrix(rbind(begin.coord[i, ], end.coord[i,])))
}
# Create simple feature geometry list column
l_sfc <- st_sfc(l_sf, crs = "+proj=longlat +datum=WGS84")
# Convert to `sp` object if needed
lines_sp <- as(l_sfc, "Spatial")
Extra/Optional:
# - create a sf object from the `sfc` list of linestrings
lines_sf = st_sf(id = 1:3, geometry = l_sfc)
# - visualize the `sfc` list of linestrings
plot(l_sfc)
library(mapview)
mapview(l_sfc, lwd = 5)
# or mapview(lines_sp, lwd = 5)
# or mapview(lines_sf, lwd = 5)
来源:https://stackoverflow.com/questions/20531066/convert-begin-and-end-coordinates-into-spatial-lines-in-r