ich hab ein grosses shapefile mit sehr vielen Polygonen (17769 Polygone, 104.4 Mb), welche ich in ein Raster umwandeln will. Jede Gridzelle des Rasters kann entweder von keinem, einem oder mehreren Polygonen belegt sein. Ich möchte die prozentuale Deckung jeder Gridzelle mit Polygonen ausgegeben haben bei der Umwandlung ins Raster, so wie das die Funktion rasterize rasterize (x, y, getCover=TRUE) macht wenn man getCover=TRUE setzt. Das Problem ist nur, dass die Funktion rasterize nur die Polygone beachtet, welche über dem Mittelpunkt der entsprechenden Rasterzelle liegen, alle anderen werden ignoriert. Dadurch verliere ich mehr als die Hälfte meines Datensatzes. Deshalb habe ich folgendes versucht:
(r = raster, ln = shapefile with polygons)
Code: Alles auswählen
rp <- rasterToPolygons(r)
covers <- unique(ln@data$PERCENTAGE)
for(cover in covers){
psub <- subset(ln, PERCENTAGE==cover)
pu <- gUnaryUnion(psub)
gi <- gIntersection(rp, pu, byid = T)
ind <- as.numeric(do.call(rbind, strsplit(names(gi), " "))[,1])
r[] <- NA
r[ind] <- sapply(gi@polygons, function(x) slot(x, 'area')) # a bit faster than gArea(gi, byid = T)
writeRaster(r, paste0("cover/", cover, "area.tif"))
}
Erklärung zum Code: in meinem Shapefile gibt es jede Menge Polygone die je einer von vier Deckungsklassen einer invasiven Pflanzenart angehören. Die Deckung ist in der Spalte PERCENTAGE gespeichert. Zu Beginn der Schleife teile ich das Shapefile nach den Deckungsklassen (covers) in vier Teile.
Am Ende der Schleife bekomme ich dann vier Rasterlayer die je eine der Deckungsklassen enthalten, wobei die Deckungsklasse im Namen des entsprechenden Rasters gespeichert ist. Jede Zelle des Rasters hat gespeichert wie viel von ihrer Fläche anteilig mit Polygonen bedeckt ist. Mit diesen beiden Informationen kann ich anschliessenden alle Raster stacken und die Gesamtdeckung jeder Zelle anteilig für die Deckungsklassen berechnen. Leider bricht R die Session immer ab. Daher meine Frage: hat jemand eine Idee wie ich entweder die rasterize Funktion dazu bringen kann alle Polygone zu beachten oder wie mein Problem mit den grossen Daten löse? Parallelisierung auf 8 Kernen dauert auch ewig....
Vielen, vielen lieben Dank!