首页 > 解决方案 > 从 R 中的坐标列表在简单特征中创建多条线

问题描述

我试图检测成对的物体(树木)是被道路隔开还是位于它们的同一侧。我已经下载了我的路网,并认为我或多或少地了解如何使用st_intersects. 所以我所缺少的是我正在考虑的两棵树之间的线段,以便测试与道路的交叉点。

但是,我似乎无法弄清楚如何在我的对象之间创建线条。我有很多对(300K+),所以必须能够以编程方式执行此操作,而我发现的所有示例似乎都是“手工编码”。

假设以下两个矩阵,包含每对的“起点”和“终点”坐标。

    orig = matrix(runif(20),ncol=2)
    dest = matrix(runif(20),ncol=2)

在这个例子中,我需要创建 10 行:一条在orig[1,]and之间dest[1,],另一条(不同的)在orig[2,]and之间dest[2,],等等。我的理解是我应该使用st_multilinestring,但我不知道如何制定调用。通常,我要么以“XYZM”点结束,要么以多段线开始并在通过所有其他坐标后orig[1,]终止。dest[10,]当它不是这些结果之一时,它就是一大堆错误。

st_multilinestring我应该使用的,如果是这样,如何做到这一点?谢谢!!

标签: rsf

解决方案


这是一种使用sfc/构造sf对象的方法library(sfheaders)

library(sf)
library(sfheaders)

## If you add a pseudo-id column
orig <- cbind( orig, 1:nrow( orig ) )
dest <- cbind( dest, 1:nrow( dest ) )

## you can bind these matrices together
m <- rbind( orig, dest )

## set the order by the 'id' column
m <- m[ order( m[,3] ), ]

## then use `sfheaders` to create your linestrings

sfc <- sfheaders::sfc_linestring(
  obj = m
  , linestring_id = 3 ## 3rd column
)

sfc

# Geometry set for 10 features 
# geometry type:  LINESTRING
# dimension:      XY
# bbox:           xmin: 0.01952919 ymin: 0.04603703 xmax: 0.9172785 ymax: 0.9516615
# epsg (SRID):    NA
# proj4string:    NA
# First 5 geometries:
# LINESTRING (0.7636528 0.2465392, 0.05899529 0.7...
# LINESTRING (0.6435893 0.9158161, 0.01952919 0.1...
# LINESTRING (0.05632407 0.3106372, 0.03306822 0....
# LINESTRING (0.1978259 0.07432209, 0.2907429 0.0...
# LINESTRING (0.1658199 0.6436758, 0.1407145 0.75...


推荐阅读