簡體   English   中英

如何獲得多個多邊形的交集?

[英]How to get intersection of multiple polygons?

我有一個“SpatialPolygonsDataFrame”列表,我想接收所有這些多邊形的交集。 我已經在 stackoverflow.com 如何解決這個問題上找到了一些提示,但是,我想知道為什么我會收到這個錯誤消息。

see URL: https://gis.stackexchange.com/questions/140504/extracting-intersection-areas-in-r URL: https://gis.stackexchange.com/questions/156660/loop-to-check-multiple-多邊形重疊-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”

提前非常感謝!

我無法確認這一點,因為您沒有提供可重復的示例,但看起來您的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")

在此處輸入圖像描述

##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)

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM