为什么用行填充SpatialLinesDataFrame会引发错误?

时间:2018-09-06 11:49:28

标签: r list dataframe line spatial

在SpatialLinesDataFrame(或类似的东西)中,由于循环而产生的行聚合困难。

我有一系列的海岸线,我会在这些海岸线上进行过渡,以相等的间隔创建垂直样条,最终喜欢存储这些样条。在以后的阶段中,我将为每个样条线进行一些计算,例如将其覆盖在栅格上以计算特定特征的范围。因此,最终的SpatialLinesDataFrame应该允许我循环访问各个行。

与shapefile中的形状ID对应的可复制输出表。

  • 位置对应于一个唯一的ID,并且是远离线路起点的线路上的米数。
  • CoordX和CoordY是直线上的坐标(横断线的起点) Endx / EndY是样点的端点

类是我要保留的那一行的元数据示例。

# for each coastline inside the shape:

position <- seq(0,3000, by=500)
coordX <- c(279501, 275678, 271002, 270944, 266825, 273316, 278284)
coordY <- c(983194.8, 981770.6, 975915.3, 975824.3, 968631.0, 963332.4, 963716.7)
endx <- c(279501.9, 275678.4, 271002.6, 270944.6, 266825.3,  273316.2, 278284.1)
endy <- c(983194.8, 981770.6, 975915.3, 975824.3, 968631.0, 963332.4, 963716.7)
class <- c(3,3,3,3,3,3,3)

out<- cbind(position, class, coordX, coordY, endx, endy)
beginpoint <- cbind(out[,3], out[,4])
endpoint <- cbind(out[,5], out[,6])

lines <- vector('list', nrow(out)) # empty line vector
# loop over starting points on the line segment and create transects
for(n in seq_along(lines_sf)){
  # n = 1
  col_names <- list('lon', 'lat')
  row_names <- list('begin', 'end')
  # dimnames < list(row_names, col_names)
  x <- as.matrix(rbind(beginpoint[n], endpoint[n,]))


  dimnames(x) <- list(row_names, col_names)

  # Sl <- Line(x) # line based on begin & end coordinates
  # S1 <- Lines(list(Sl), ID = output$pos[n])

  lines[[n]] <- SpatialLines(list(Lines(list(Line(x)), as.character(out[n,1]))), 
                                proj4string = CRS(as.character(kustlijn2001@proj4string)))
}

df <- SpatialLinesDataFrame(lines_sf, data.frame(out))

引发错误:

  

slot(sl,“ lines”)中的错误:无法从   类型为“列表”的对象

最终,它可能归结为以下事实:我不完全了解SpatialDataFrame的工作原理和SpatialLines的属性,我通读了文档等。我当时一直认为lines_sf和out之间的对应ID不匹配。但是错误表明不是吗?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您的lines是一个列表,而不是SpatialLines对象。您可以通过在控制台中输入class(lines)进行验证。

要将lines中的每个项目设置为Lines对象,请尝试将循环中的最后一行代码替换为:

lines[[n]] <- Lines(list(Line(x)), ID = as.character(out[n, 1]))

一旦退出循环,我们将lines作为Lines对象的列表,但这不是SpatialLines对象本身。幸运的是,从Lines对象列表中创建SpatialLines对象非常简单:

lines <- SpatialLines(lines, 
                      proj4string = CRS(as.character(kustlijn2001@proj4string)))

要创建dflines中的ID必须与data.frame(out)中的行名匹配。我们可以明确指定它们:

df <- SpatialLinesDataFrame(lines, 
                            data.frame(out, row.names = out[, 1]))

这就是df的样子。是您所期望的吗?

> df
An object of class "SpatialLinesDataFrame"
Slot "data":
     position class coordX   coordY     endx     endy
0           0     3 279501 983194.8 279501.9 983194.8
500       500     3 275678 981770.6 275678.4 981770.6
1000     1000     3 271002 975915.3 271002.6 975915.3
1500     1500     3 270944 975824.3 270944.6 975824.3
2000     2000     3 266825 968631.0 266825.3 968631.0
2500     2500     3 273316 963332.4 273316.2 963332.4
3000     3000     3 278284 963716.7 278284.1 963716.7

Slot "lines":
[[1]]
An object of class "Lines"
Slot "Lines":
[[1]]
An object of class "Line"
Slot "coords":
           lon      lat
begin 279501.0 279501.0
end   279501.9 983194.8



Slot "ID":
[1] "0"

... #omitted for brevity