从R中的多个PRISM栅格之一提取值

时间:2020-08-03 22:05:59

标签: r raster sp

我有一组100纬度/经度和100(有时是重复的)年。对于每一个纬度/经度,我想找到相应年份的年度温度(使用PRISM数据)。

我为循环和函数创建了迭代过程,但是它们一直卡住。我知道必须有一种更简单的方法(最好避免使用for循环!)。

举个例子,这里有4个经/纬度和年,我(可笑的)尝试遍历它们。

library(prism)
library(raster)

locs <- data.frame( lat = c(46.30101, 42.65503, 44.38075, 43.90637), lon = c(-91.764380  -86.201983, -88.951511, -91.081340, -87.896017))

years <- c(1989,1954,2010,1954)

coordinates(locs) <- c('lat', 'lon')

temps <- NULL

for(i in 1:length(years)) {
  tryCatch({dir.create(paste0(getwd(),"/",years[i]))}, error=function(e){}) # skip making a new directory for any years that already exist
  options(prism.path = paste0(getwd(),"/",years[i]))
  get_prism_annual(type = "tmean", years = as.numeric(years[i])) # Get the data
  climate_data <- prism_stack(ls_prism_data()) # Stack it
  climate_crs <- climate_data@crs@projargs # Get the projection
  proj4string(occ.latlong) <- CRS(climate_crs) # Project the climate data's CRS onto the coordinates
  
  temps <- rbind(temps, extract(climate_data, locs[i,]))
}

此循环将重复出现NA(重复1954年)。有更简单的方法吗?!

1 个答案:

答案 0 :(得分:1)

因为要下载大量数据,所以我将循环分为两部分,然后首先进行下载。这样,调试代码也更加容易。我还简化了代码的实现。

years <- c(1989, 1954, 2010, 1954)

library(prism)
for (y in unique(years)) {
    dir.create(y, FALSE)
    options(prism.path = y)
    get_prism_annual(type = "tmean", years = y) 
}

现在提取位置。

locs <- data.frame( lat = c(46.30101, 42.65503, 44.38075, 43.90637), lon = c(-91.764380  -86.201983, -88.951511, -91.081340, -87.896017))
# lon/lat order!    
locs <- locs[,2:1]

让事情变得简单,然后将结果放在列表的第一位

temps <- list()
for(i in 1:length(years)) {
    options(prism.path = years[i])
    climate_data <- prism_stack(ls_prism_data()) 
    temps[[i]] <- extract(climate_data, locs)
}

合并结果

x <- do.call(cbind, temps)

请注意,多次提取相同的值(相同年份)而不是重用提取的值可能会很无效率。