将几个SpatialPointsDataFrames转换为栅格


9

我的工作区中有100个SpatialPointsDataFrames。我以这种方式加载它们:

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

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

他们这样称呼:

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

等等

如何将它们转换为在工作区中循环的栅格?

我是R用户的新手,希望能找到一些帮助。非常感谢。


1
编辑您的帖子以指定您的点是在规则网格上还是需要插值
Etienne Racine

Answers:


9

如果您的数据包含xyz数据(其中z是栅格值)并且您的点在常规网格上(无需插值)。

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

如果需要插值,可以使用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)

现在,要按顺序执行此操作,您只需要将其包装在一个for循环中即可(我尝试与问题中提供的信息保持尽可能近的距离):

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
}

我建议不要使用travel@data(或完全使用@),因为这取决于的内部名称SpatialPointsDataFrame,该名称可能会发生变化。我建议使用as.data.frame,它不依赖于这些内部名称。
Paul Hiemstra

好点子。我已经改变了。我喜欢使用插槽,因为它更紧凑,但是您是对的。
Etienne Racine 2012年

5

除了@Etiennebr的答案外,我还要进行Apply样式循环(这更像R-ish,并且对同一件事使用更少的代码):

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")])
})

保罗,非常感谢您的回答!!您的方法比我所想的要容易得多。如果您对我的方法感兴趣,请告诉我。最好的问候,Livia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.