Почему заполнение строки SpatialLinesDataFrame приводит к ошибке? - PullRequest
0 голосов
/ 06 сентября 2018

У меня проблемы с агрегацией строк в результате цикла в SpatialLinesDataFrame (или аналогичном)

У меня есть ряд береговых линий, на которых я иратирую, создаю перпендикулярные разрезы через равные промежутки времени и в конечном итоге люблю хранить эти разрезы. Для каждого разреза я на следующем этапе выполню некоторые вычисления, например, наложив их на растр, чтобы вычислить экстент определенной функции. Таким образом, последний SpatialLinesDataFrame должен позволить мне получить доступ к отдельным строкам в цикле.

Таблица воспроизводимых выходных данных, которая соответствует идентификатору формы в шейп-файле.

  • Положение соответствует уникальному идентификатору и количеству метров на линии вдали от начальной точки линии.
  • 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))

Выдает ошибку:

Ошибка в слоте (sl, «линии»): невозможно получить слот («линии») из объект типа "список"

В конечном счете это, вероятно, сводится к тому, что я не до конца понимаю работу SpatialDataFrame и свойства SpatialLines, я читаю документацию и т. Д., И я думал, что соответствующие идентификаторы между lines_sf и out не совпадают. Но ошибка говорит об обратном?

Заранее спасибо!

1 Ответ

0 голосов
/ 06 сентября 2018

Ваш lines является списком, а не объектом SpatialLines. В этом можно убедиться, введя class(lines) в консоли.

Чтобы сделать каждый элемент в lines объектом Lines, попробуйте заменить последнюю строку кода в цикле на:

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

Как только мы выйдем из цикла, у нас будет lines в виде списка объектов Lines, но это не сам объект SpatialLines. К счастью, создать объект SpatialLines из списка объектов Lines очень просто:

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

Чтобы создать df, идентификаторы в lines должны совпадать с именами строк в 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
...