在 r 中绘制两个 sf POINT 特征之间的线
Plotting lines between two sf POINT features in r
我有两个空间特征:
library(sf)
points1 <- data.frame(foo = seq(15, 75, 15),
long = c(-85, -80, -78, -75, -82),
lat = c(34, 36, 37, 38, 35)) %>%
st_as_sf(coords = c('long', 'lat'), crs = 4326)
points2 <- data.frame(bar = seq(15, 75, 15),
long = c(85, 80, 78, 75, 82),
lat = c(30, 32, 34, 36, 38)) %>%
st_as_sf(coords = c('long', 'lat'), crs = 4326)
cbind(points1, points2) -> df
这给出:
foo bar geometry geometry.1
1 15 15 POINT (-85 34) POINT (85 30)
2 30 30 POINT (-80 36) POINT (80 32)
3 45 45 POINT (-78 37) POINT (78 34)
4 60 60 POINT (-75 38) POINT (75 36)
5 75 75 POINT (-82 35) POINT (82 38)
我想在 df
内的点对之间画一条线 - 所以从 geometry
中的一个点到 geometry.1
中的一个点。我尝试将 POINT 转换为 LINESTRING,如下所示:
df %>% summarise(do_union=F) %>% st_cast("LINESTRING") %>% plot()
,但这似乎不起作用。我得到一条连续的线,而我想要的是 5 条单独的线。
使用 mapply
通过将几何列中的点成对并集来创建线串:
> st_sfc(mapply(function(a,b){st_cast(st_union(a,b),"LINESTRING")}, df$geometry, df$geometry.1, SIMPLIFY=FALSE))
Geometry set for 5 features
geometry type: LINESTRING
dimension: XY
bbox: xmin: -85 ymin: 30 xmax: 85 ymax: 38
epsg (SRID): NA
proj4string: NA
LINESTRING (-85 34, 85 30)
LINESTRING (-80 36, 80 32)
LINESTRING (-78 37, 78 34)
LINESTRING (-75 38, 75 36)
LINESTRING (-82 35, 82 38)
起初我认为 st_union(geom1, geom2, by_feature=TRUE)
足以完成大部分工作,但(如文档所述)by_feature
被忽略 st_union
的两个参数并且输出是geom1
和 geom2
.
的 25 对特征中的每对特征的并集
这是一种通过坐标矩阵的更慢、更笨拙的方法:
> coords = cbind(st_coordinates(df$geometry), st_coordinates(df$geometry.1))
按行构建线串:
> linestrings = st_sfc(
lapply(1:nrow(coords),
function(i){
st_linestring(matrix(coords[i,],ncol=2,byrow=TRUE))
}))
参见:
> plot(linestrings)
如果您想用线替换数据框中的(第一个)点几何,则:
> st_geometry(df) = linestrings
我有两个空间特征:
library(sf)
points1 <- data.frame(foo = seq(15, 75, 15),
long = c(-85, -80, -78, -75, -82),
lat = c(34, 36, 37, 38, 35)) %>%
st_as_sf(coords = c('long', 'lat'), crs = 4326)
points2 <- data.frame(bar = seq(15, 75, 15),
long = c(85, 80, 78, 75, 82),
lat = c(30, 32, 34, 36, 38)) %>%
st_as_sf(coords = c('long', 'lat'), crs = 4326)
cbind(points1, points2) -> df
这给出:
foo bar geometry geometry.1
1 15 15 POINT (-85 34) POINT (85 30)
2 30 30 POINT (-80 36) POINT (80 32)
3 45 45 POINT (-78 37) POINT (78 34)
4 60 60 POINT (-75 38) POINT (75 36)
5 75 75 POINT (-82 35) POINT (82 38)
我想在 df
内的点对之间画一条线 - 所以从 geometry
中的一个点到 geometry.1
中的一个点。我尝试将 POINT 转换为 LINESTRING,如下所示:
df %>% summarise(do_union=F) %>% st_cast("LINESTRING") %>% plot()
,但这似乎不起作用。我得到一条连续的线,而我想要的是 5 条单独的线。
使用 mapply
通过将几何列中的点成对并集来创建线串:
> st_sfc(mapply(function(a,b){st_cast(st_union(a,b),"LINESTRING")}, df$geometry, df$geometry.1, SIMPLIFY=FALSE))
Geometry set for 5 features
geometry type: LINESTRING
dimension: XY
bbox: xmin: -85 ymin: 30 xmax: 85 ymax: 38
epsg (SRID): NA
proj4string: NA
LINESTRING (-85 34, 85 30)
LINESTRING (-80 36, 80 32)
LINESTRING (-78 37, 78 34)
LINESTRING (-75 38, 75 36)
LINESTRING (-82 35, 82 38)
起初我认为 st_union(geom1, geom2, by_feature=TRUE)
足以完成大部分工作,但(如文档所述)by_feature
被忽略 st_union
的两个参数并且输出是geom1
和 geom2
.
这是一种通过坐标矩阵的更慢、更笨拙的方法:
> coords = cbind(st_coordinates(df$geometry), st_coordinates(df$geometry.1))
按行构建线串:
> linestrings = st_sfc(
lapply(1:nrow(coords),
function(i){
st_linestring(matrix(coords[i,],ncol=2,byrow=TRUE))
}))
参见:
> plot(linestrings)
如果您想用线替换数据框中的(第一个)点几何,则:
> st_geometry(df) = linestrings