在SpatialLinesDataFrame(或类似的东西)中,由于循环而产生的行聚合困难。
我有一系列的海岸线,我会在这些海岸线上进行过渡,以相等的间隔创建垂直样条,最终喜欢存储这些样条。在以后的阶段中,我将为每个样条线进行一些计算,例如将其覆盖在栅格上以计算特定特征的范围。因此,最终的SpatialLinesDataFrame应该允许我循环访问各个行。
与shapefile中的形状ID对应的可复制输出表。
类是我要保留的那一行的元数据示例。
# 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不匹配。但是错误表明不是吗?
提前谢谢!
答案 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)))
要创建df
,lines
中的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