循环通过SpatialPolygonsDataFrame

时间:2017-08-23 22:00:14

标签: r

我试图通过在rgeos包中使用gArea,gUnion和gIntersection的组合来获得重叠多边形的区域。

对于这个问题,我使用adehabitatLT提供的动物位置来创建将成为多边形的家庭范围。

library(adehabitatHR)
library(rgeos)
data(puechabonsp)

以我想要的格式处理数据

locs <- puechabonsp$relocs
locs <- as.data.frame(locs)
da <- as.character(locs$Date)
da <- as.POSIXct(strptime(as.character(locs$Date),"%y%m%d"))
puech <- as.ltraj(xy = locs[,c("X","Y")], date = da, id = locs$Name)
puech2<-ld(puech)

完成操作 - 数据现在是spatialpointsdataframe

pigsp<-SpatialPointsDataFrame(coords=cbind(puech2$x,puech2$x), 
data=data.frame(puech2$id),proj4string = CRS("+proj=utm +zone=14"))

pigkern<-kernelUD(pigsp) #kernel homeranges

pigvert<-getverticeshr(pigkern,95) #vertice of home ranges (the polygons)

proj4string(pigvert)<-CRS("+proj=utm +zone=14") #add projection

uniqueID<-unique(pigvert@data$id) #list of unique animal ids

以下代码是我被困的地方。我试图为每种可能的动物ID组合获得重叠区域。

test <-  lapply( combn( uniqueID, 2 ), 2,
              function(x) { 
              SIcomb <- gArea(gIntersection(pigvert@data$id[ x[1] ], 
                pigvert@data$id[ x[2] ]))/
                gArea(gUnion(pigvert@data$id[ x[1] ], pigvert@data$id[ x[2] 
]))
            }  )    

我怀疑我没有正确地做出来,但无法弄明白。提示将不胜感激!

1 个答案:

答案 0 :(得分:0)

我认为您没有将sp对象传递给gUnion(),这是造成问题的原因。我能够根据唯一名称使用for()循环和原始数据的子集:

> uniqueID_combn <- combn(uniqueID, 2)
> for(x in 1:(length(uniqueID_combn)/2)){
+   sp1 <- subset(pigvert, id == uniqueID_combn[1, x])
+   sp2 <- subset(pigvert, id == uniqueID_combn[2, x])
+   print(gArea(gUnion(sp1, sp2)))
+ }
[1] 3337444
[1] 3793138
[1] 3319134
[1] 2462282
[1] 1162276
[1] 2462282