R中的空间线起点和终点

时间:2018-04-17 20:50:58

标签: r r-raster sp rgdal sf

我正在尝试使用sp包来访问线串的起点和终点,类似于使用ST_StartPoint ST_EndPointpsql生成的内容。< / p>

无论我如何尝试访问该行,我都会收到错误或NULL值:

> onetrip@lines[[1]][1]
Error in onetrip@lines[[1]][1] : object of type 'S4' is not subsettable

> onetrip@lines@Lines@coords
    Error: trying to get slot "Lines" from an object of a basic class ("list") with no slots

> onetrip@lines$Lines
NULL

唯一有效的解决方案是详细的,需要转换为SpatialLines,我只能轻松获得第一点:

test = as(onetrip, "SpatialLines")@lines[[1]]
> test@Lines[[1]]@coords[1,]
[1] -122.42258   37.79494

以下str()和简单plot(onetrip)都表明我的数据框不为空。

这里有什么解决方法 - 如何在sp中返回线串的起点和终点?

我有一个较大SpatialLinesDataFrame的第一条记录的子集:

> str(onetrip)
Formal class 'SpatialLinesDataFrame' [package "sp"] with 4 slots
  ..@ data       :'data.frame': 1 obs. of  6 variables:
  .. ..$ start_time : Factor w/ 23272 levels "2018/02/01 00:12:40",..: 23160
  .. ..$ finish_time: Factor w/ 23288 levels "1969/12/31 17:00:23",..: 23288
  .. ..$ distance   : num 2.74
  .. ..$ duration   : int 40196
  .. ..$ route_id   : int 5844736
  .. ..$ vehicle_id    : int 17972
  ..@ lines      :List of 1
  .. ..$ :Formal class 'Lines' [package "sp"] with 2 slots
  .. .. .. ..@ Lines:List of 1
  .. .. .. .. ..$ :Formal class 'Line' [package "sp"] with 1 slot
  .. .. .. .. .. .. ..@ coords: num [1:3114, 1:2] -122 -122 -122 -122 -122 ...
  .. .. .. ..@ ID   : chr "0"
  ..@ bbox       : num [1:2, 1:2] -122.4 37.8 -122.4 37.8
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:2] "x" "y"
  .. .. ..$ : chr [1:2] "min" "max"
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
  .. .. ..@ projargs: chr "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs"

3 个答案:

答案 0 :(得分:4)

由于你也用sf标记了问题,我将在sf中提供解决方案。请注意,您可以使用

将sp对象转换为sf
library(sf)
st_as_sf(sp_obj)

创建线串

line <- st_as_sfc(c("LINESTRING(0 0 , 0.5 1 , 1 1 , 1 0.3)")) %>% 
  st_sf(ID = "poly1")   

将每个顶点转换为点

pt <- st_cast(line, "POINT")

开始和结束只是data.frame

的第一行和最后一行
start <- pt[1,]
end <- pt[nrow(pt),]

情节 - 绿色是起点,红色是终点

library(ggplot2)
ggplot() +
  geom_sf(data = line) +
  geom_sf(data = start, color = 'green') +
  geom_sf(data = end, color = 'red') +
  coord_sf(datum = NULL)

enter image description here

答案 1 :(得分:2)

始终提供一些示例数据:

library(raster)
lns <- spLines(rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60)))

以下是两种解决方案。

你可以这样做:

crds <- coordinates(as(lns, 'SpatialPoints'))
pts <- crds[c(1, nrow(crds)), ]

或者做:

pts <- geom(lns)[c(1, nrow(g)), c('x', 'y')]

看看它

plot(lns)
points(pts, col=c('red', 'blue'), pch=20, cex=2)

答案 2 :(得分:1)

sf中,LINESTRING是一个矩阵。

取消列出sf对象的几何图形并转换为矩阵,然后获取您想要的任何行

library(sf)

sfc_line <- st_as_sfc(c("LINESTRING(0 0 , 0.5 1 , 1 1 , 1 0.3)"))

sf_line <- st_sf(geometry = sfc_line)

m <- matrix( unlist( st_geometry(sfc_line) ), ncol = 2)
m[c(1, nrow(m)), ]
#      [,1] [,2]
# [1,]    0  0.0
# [2,]    1  0.3