r - 在中的两个SF POINT特征之间绘制线

标签 r sf

我有两个空间特征:

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中的POINT到geometry.1中的POINT。我试图将POINTs强制转换为LINESTRING,如下所示:
df %>% summarise(do_union=F) %>% st_cast("LINESTRING") %>% plot()

,但这似乎不起作用。当我想要的是五个单独的行时,我得到一条连续的行。

最佳答案

使用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_featurest_union的两个参数忽略了,输出是geom1geom2的25对特征中的每对的并集。

这是通过坐标矩阵的一种较慢的kludgier方式:
> 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)

enter image description here

如果要用线条替换数据框中的(第一个)点几何,则:
> st_geometry(df) = linestrings

关于r - 在中的两个SF POINT特征之间绘制线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150279/

相关文章:

r - 使用 st_join 进行使用最大交叉点的空间连接

r - 为列表中的每个元素创建新的数据框

mysql - 如何使用 Shiny 的mysql表创建图形?

r - 数据表列表的唯一列名

r - 从 R 查询 SQL Server 地理空间数据

r - 使用 geom_sf 时如何更改图例形状?

r - 如何总结指向线串并在 r 中保留数据框列?

从R sf中的多边形中移除孔

r - 将序列与缺失值对齐

r - 如何在 Apple Silicon (M1) Mac 上安装 RcppArmadillo