Convertir plusieurs SpatialPointsDataFrames en raster

9

Il y a 100 SpatialPointsDataFrames dans mon espace de travail. Je les ai chargés de cette façon:

filenames <- list.files(path="",
                        pattern="XYhectareTravelTimes_ez+.*shp")

for(i in filenames){
              filepath <- file.path("/",i)
              assign(i, readShapePoints(filepath))

Ils sont appelés comme ceci:

XYhectareTravelTimes_ez10.*shp 
XYhectareTravelTimes_ez11.*shp 
XYhectareTravelTimes_ez12.*shp 

etc.

Comment puis-je les convertir en rasters en boucle dans l'espace de travail?

Je suis un nouvel utilisateur de R et j'espère trouver de l'aide. Merci beaucoup.

Trident
la source
1
Modifiez votre message pour spécifier si vos points sont sur une grille régulière ou si vous avez besoin d'une interpolation
Etienne Racine

Réponses:

9

Si vos données contiennent des données xyz (où z est la valeur raster) et vos points sont sur une grille régulière (pas besoin d'interpolation).

library("raster")
r <- rasterFromXYZ(as.data.frame(travel)[, c("x", "y", "z")])

Si vous avez besoin d'une interpolation, vous pouvez utiliser la bibliothèque akima:

library("raster")
library("akima")

steps <- 100
isu <- with(travel@data, interp(x, y, z, 
    xo=seq(min(x), max(x), length = steps),
    yo=seq(min(y), max(y), length = steps)
))

r <- raster(isu)

Maintenant, pour faire cela séquentiellement, il vous suffit de l'enrouler en forboucle (j'ai essayé de rester aussi proche que possible des informations que vous avez fournies dans votre question):

library("raster")

filenames <- list.files(path="", pattern="XYhectareTravelTimes_ez+.*shp")

# create a container for all the rasters
raster_cat <- list()

for (i in filenames) { 
  travel <- readShapePoints(i)
  r <- rasterFromXYZ(as.data.frame(travel)[, c("x", "y", "z")])
  raster_cat[[i]] <- r
}
Etienne Racine
la source
Je déconseille d'utiliser travel@data(ou d'utiliser @du tout), car cela dépend des noms internes de a SpatialPointsDataFrame, qui pourraient changer. Je suggère d'utiliser as.data.frame, qui ne repose pas sur ces noms internes.
Paul Hiemstra
Bon point. Je l'ai changé. J'aime l'utilisation de la fente parce qu'elle est plus compacte, mais vous avez raison.
Etienne Racine
5

En plus de la réponse de @ Etiennebr, j'opterais pour une boucle de style d'application (qui est plus R-ish et utilise moins de code pour la même chose):

library("raster")

filenames <- list.files(path="", pattern="XYhectareTravelTimes_ez+.*shp")

raster_cat = lapply(filenames, function(x) {
  travel <- as.data.frame(readShapePoints(x))
  r <- rasterFromXYZ(travel[, c("x", "y", "z")])
})
Paul Hiemstra
la source
Hoi Paul, merci beaucoup pour la réponse !! Votre méthode est beaucoup plus simple que celle que j'ai imaginée. Si vous êtes intéressé par ma méthode, faites le moi savoir. Cordialement, Livia