R - итерация стирания фрейма данных пространственных полигонов из линий и сохранение в новый список - PullRequest
0 голосов
/ 01 апреля 2019

original SLDF are thick grey (n=4), and the red and black lines (n=5) are what I want to end up with in the new list

Мне нужно выполнить итерацию по многофункциональному объекту 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 с различными пространственными данными. Кадры ), но вот копия-управляемый пастой набор данных.По-прежнему приводит к той же проблеме.

...