在 r 中的两个 sf POINT 特征之间绘制线条 [英] Plotting lines between two sf POINT features in r

查看:54
本文介绍了在 r 中的两个 sf POINT 特征之间绘制线条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个空间特征:

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代码>.我尝试将 POINT 转换为 LINESTRING,如下所示:

I'd like to draw a line between pairs of points within df - so from a POINT in geometry to a POINT in geometry.1. I have tried to cast the POINTs to a LINESTRING as follows:

df %>% summarise(do_union=F) %>% st_cast("LINESTRING") %>% plot()

,但这似乎不起作用.我得到一条连续的线,而我想要的是五个单独的线.

, but this doesn't seem to work. I get a continuous line, when what I want is five separate lines.

推荐答案

使用 mapply 通过将几何列中的点成对合并来创建线串:

Use mapply to create a line string by unioning the points pairwise from the geometry columns:

> 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 的两个参数,输出是来自 geom1geom2 的 25 对特征中每对特征的联合.

At first I thought st_union(geom1, geom2, by_feature=TRUE) would be sufficient to do most of the work but (as documented) the by_feature is ignored with two arguments to st_union and the output is a union of each of the 25 pairs of features from geom1 and geom2.

这是通过坐标矩阵的一种更慢、更笨拙的方法:

Here's a slower, kludgier way via a matrix of coordinates:

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

如果您想用线条替换数据框中的(第一个)点几何,则:

if you want to replace the (first) point geometry in your data frame with the lines then:

> st_geometry(df) = linestrings

这篇关于在 r 中的两个 sf POINT 特征之间绘制线条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆