在R中将起始坐标和结束坐标转换为空间线

14

我有一组看起来像这样的开始和结束坐标:

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))

我正在尝试通过将每个起始点连接到其对应的终止点来创建一组由3条线段组成的形状。我希望最终产品是一个SpatialLines对象,这样我就可以在sp包中使用over函数。
3个回答

14

这里有一种方法:

## 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(as.matrix(begin.coord[i, ], end.coord[i,])))), as.character(i))
}

SpatialLines(l)

这将为每对对象生成一个单独的Lines对象(每个对象都具有唯一的ID),否则您可能想要一个单一的对象?

只是为了好玩,先构建成一个 spatstat psp 对象,然后使用 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") 

7

也可以使用sf建立一个sfc类的列表,然后将其转换为SpatialLines对象:

# 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")

额外/可选:

# - 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)

enter image description here


3

现在(2020年),我会使用sfheaders来完成此操作:

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))
begin.coord$linestring_id <- end.coord$linestring_id <- seq_len(nrow(begin.coord))
library(dplyr)

sfheaders::sf_linestring(bind_rows(begin.coord, end.coord) %>% arrange(linestring_id), 
                         x = "lon", y = "lat", linestring_id = "linestring_id")
#>   linestring_id                     geometry
#> 1             1 -85.76, -85.72, 38.34, 38.38
#> 2             2 -85.46, -85.42, 38.76, 38.76
#> 3             3 -85.89, -85.85, 38.31, 38.32

此示例由reprex包 (v0.3.0)于2020-04-01创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接