Мне нужно выполнить итерацию по многофункциональному объекту SpatialPolygonsDataFrame
(здесь SPDF) и стереть место пересечения каждого многоугольника с пространственными линиями, содержащимися в списке однофункциональных объектов.SpatialLinesDataFrames
(SLDF) и сохраните обновленные «стертые» SLDF в новый список, добавив при этом некоторую информацию от каждой функции к каждому элементу списка.На рисунке, который я включил, оригинальные SLDF имеют толстый серый (n = 4), а красные и черные линии (n = 5) - это то, что я хочу получить в новом списке.
#example data prep:
library(sp)
#create multi-feature SpatialPolygonDataFrame
p <-
SpatialPolygons(list(Polygons(list(Polygon(cbind(c(2,4,3,2),c(2,2,4,2)))),
"1"),
Polygons(list(Polygon(cbind(c(12,14,13,12),c(0,0,2,0)))), "2"),
Polygons(list(Polygon(cbind(c(15,14,12,15),c(12,13,12,12)))), "3"),
Polygons(list(Polygon(cbind(c(0,2,1,0),c(12,12,14,12)))), "4")))
# Create a dataframe and display default rownames
p.df <- data.frame( ID=1:length(p))
rownames(p.df)
# Extract polygon ID's
pid <- sapply(slot(p, "polygons"), function(x) slot(x, "ID"))
# Create dataframe with correct rownames
p.df <- data.frame( ID=1:length(p), row.names = pid)
# coersion and check class
p <- SpatialPolygonsDataFrame(p, p.df)
class(p)
#create list of single-feature SpatialLineDataFrame
l1 <- cbind(c(0,3), c(0,3))
l2 <- cbind(c(0, 13), c(0, 1))
l3 <- cbind(c(0, 14), c(0,12.5))
l4 <- cbind(c(0, 1), c(0,13))
Sl1 <- Line(l1)
Sl2 <- Line(l2)
Sl3 <- Line(l3)
Sl4 <- Line(l4)
Sl1 <- Lines(list(Sl1), ID = "1")
Sl2 <- Lines(list(Sl2), ID = "2")
Sl3 <- Lines(list(Sl3), ID = "3")
Sl4 <- Lines(list(Sl4), ID = "4")
Sl <- SpatialLines(list(Sl1, Sl2, Sl3, Sl4))
# Create a dataframe and display default rownames
Sl.df <- data.frame( ID=1:length(Sl))
rownames(Sl.df)
# Extract polygon ID's
pidl <- sapply(slot(Sl, "lines"), function(x) slot(x, "ID"))
# Create dataframe with correct rownames
Sl.df <- data.frame( ID=1:length(Sl), row.names = pidl)
# Try coersion again and check class
Sldf <- SpatialLinesDataFrame(Sl, Sl.df)
#convert multipart SpatialLineDataFrame feature to individual features in
list
linel <- list()
linel[[1]] <- Sldf[1,]
linel[[2]] <- Sldf[2,]
linel[[3]] <- Sldf[3,]
linel[[4]] <- Sldf[4,]
#for-loop attempt
line_erasel <- list()
for (i in seq_along(p)) {
for (j in seq_along(linel)) {
#for the LCP lines that do not intersect with a specific polygon, do nothing
#and move to next step, i.e, else...
if (tryCatch(!is.null(raster::intersect(linel[[j]], p[i,])),
error=function(e) return(FALSE)) == 'TRUE'){
#erase part of line overlapped by intersected polygon
line_erasel[[i]] <- erase(linel[[j]],p[i,])
#add original START/PARENT polygon id back to new list
line_erasel[[i]]@data["id.parent"] <- linel[[j]]@data$ID
#add intersected polygon ID to the line attribute table
line_erasel[[i]]@data["id.intersect"] <- p[i,]@data$ID }
}}
Если линия пересекается с двумя (или более) различными объектами многоугольника, я хочу получить два (или = количество пересеченных многоугольника) обновленных «стертых» SLDF, которые будут созданы и добавлены в новый список SLDF.В приведенном ниже примере SLDF пересекаются ровно с одним SPDF, за исключением того, что один из SLDF пересекается с двумя различными элементами полигона SPDF.Следовательно, обновленный список должен содержать дополнительный элемент SLDF.
Однако, когда я запускаю вложенный цикл for, результирующий «стертый» список SLDF содержит то же количество элементов, что и исходный список SLDF.Я думаю, что есть проблема с моей структурой цикла, но я не могу понять это.
Вчера я опубликовал очень похожий вопрос с более сложными примерами данных (здесь: R - как написать вложенный цикл for с различными пространственными данными. Кадры ), но вот копия-управляемый пастой набор данных.По-прежнему приводит к той же проблеме.