Как получить пересечение нескольких полигонов? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть список SpatialPolygonsDataFrame, и я хочу получить пересечение всех этих многоугольников. Я уже нашел некоторые подсказки на stackoverflow.com, как решить эту проблему, тем не менее, я хотел бы знать, почему я получаю это сообщение об ошибке.

см. URL: https://gis.stackexchange.com/questions/140504/extracting-intersection-areas-in-r URL: https://gis.stackexchange.com/questions/156660/loop-to-check-multiple-polygons-overlap-in-r

length_b_loop <- length(as.vector(dat_ftprints))-1
# dat_ftprints is the list of 25 SpatialPolygonsDataFrame

for (b in length_b_loop){
  if (b == 1){
    spc_intersect_poly1 <- dat_ftprints[[b]]
    spc_intersect_poly2 <- dat_ftprints[[b+1]]
    spc_intersect_temp <- raster::intersect(spc_intersect_poly1, spc_intersect_poly2)
  } else {
    spc_intersect_poly3 <- dat_ftprints[[b+1]]
    spc_intersect_temp <- raster::intersect(spc_intersect_temp, spc_intersect_poly3)
  }
}
# get a single polygon which represents the intersection of all polygons stored in the list

Сообщение об ошибке:

Ошибка в xy.coords (x, y, xlabel, ylabel, log): «x» является списком, но не имеет компонентов'x' и 'y'

Заранее большое спасибо!

1 Ответ

0 голосов
/ 06 ноября 2019

Я не могу подтвердить это, поскольку вы не предоставили повторяемый пример, но похоже, что в вашем цикле for есть ошибка. Вы выполняете итерацию только по значению 24, а не по значениям от 1 до 24. Это означает, что spc_intersect_temp создан неправильно и по-прежнему соответствует последнему значению, которое вы ему присвоили. Попробуйте это:

length_b_loop <- length(dat_ftprints)-1

for (b in 1:length_b_loop){
  if (b == 1){
    spc_intersect_poly1 <- dat_ftprints[[b]]
    spc_intersect_poly2 <- dat_ftprints[[b+1]]
    spc_intersect_temp <- raster::intersect(spc_intersect_poly1, spc_intersect_poly2)
  } else {
    spc_intersect_poly3 <- dat_ftprints[[b+1]]
    spc_intersect_temp <- raster::intersect(spc_intersect_temp, spc_intersect_poly3)
  }
}

РЕДАКТИРОВАТЬ Сначала я проверил бы ваши входные данные, используя lapply(dat_ftprints,is), чтобы убедиться, что все они являются фреймами данных пространственного многоугольника. Если они есть, то код должен работать. Пример ниже с полигонами, построенными на странице справки:

##construct polygons
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,2,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,5,2,2)))
Sr3 = Polygon(cbind(c(4,2,5,10,4),c(5,3,2,5,5)))

Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3), "s3")

SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)
plot(SpP, col = c(rgb(1,0,0,0.25),rgb(0,1,0,0.25),rgb(0,0,1,0.25)), pbg="white")

enter image description here

##construct list of SPDFs
dat_ftprints=list(SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Sr1), "s1"))), data = data.frame(x=1,row.names = "s1")),
                  SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Sr2), "s2"))), data = data.frame(x=1,row.names = "s2")),
                  SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Sr3), "s3"))), data = data.frame(x=1,row.names = "s3")))

##run previous code
length_b_loop <- length(dat_ftprints)-1

for (b in 1:length_b_loop){
  if (b == 1){
    spc_intersect_poly1 <- dat_ftprints[[b]]
    spc_intersect_poly2 <- dat_ftprints[[b+1]]
    spc_intersect_temp <- raster::intersect(spc_intersect_poly1, spc_intersect_poly2)
  } else {
    spc_intersect_poly3 <- dat_ftprints[[b+1]]
    spc_intersect_temp <- raster::intersect(spc_intersect_temp, spc_intersect_poly3)
  }
}

plot(spc_intersect_temp,col="black",add=T)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...