我已使用优秀的terra包将单变量 .nc 文件作为 SpatRaster 对象读入 R ,目的是基于单元质心拟合地统计模型。为此,我需要使用 SpatRaster 中的数据构建一个数据框,其中的列对应于“lon、lat、value”。这感觉像是一个可能有标准解决方案的任务,但我不熟悉 R 的空间统计生态系统。
任何意见/建议将不胜感激。
我正在Rstudio server远程服务器上使用,并且已经安装了一些软件包。
当我尝试加载类似raster或terrausing 之类的库时Rstudio server,出现错误:
> library(terra)\n\nError: package or namespace load failed for \xe2\x80\x98terra\xe2\x80\x99 in dyn.load(file, DLLpath = DLLpath, ...):\n unable to load shared object '/home/pearless/R/x86_64-pc-linux-gnu-library/4.1/terra/libs/terra.so':\n libproj.so.15: cannot open shared object file: No such file or directory\n\n> library(raster)\n\nError: package or namespace load failed for \xe2\x80\x98raster\xe2\x80\x99 in dyn.load(file, DLLpath = DLLpath, ...):\n unable to load shared object '/home/pearless/R/x86_64-pc-linux-gnu-library/4.1/terra/libs/terra.so':\n libproj.so.15: cannot open shared object file: No such file or directory\nRun Code Online (Sandbox Code Playgroud)\n请注意,使用 …
我以前从未遇到过此问题,但是当我尝试在 R 中使用 foreach 循环时遇到此错误:“{ 中的错误:任务 1 失败 - “NULL 值作为符号地址传递”。
我几乎不可能生成一个小的、可重复的示例(我已经尝试过!),因为我试图从巨大的栅格中提取数据并从该数据创建 csv 文件。但是,这是我的代码。
bi_2021 <- rast('G:\\GridMet_Yearly\\bi_2021.nc')
cl <- makeCluster(2)
registerDoParallel(cl)
r = 1
foreach (r=1:10, .packages = c('tidyverse','lubridate')) %dopar% {
rc <- row_char[r]
cc <- col_char[r]
ce <- cell_char[r]
rn <- row_num[r]
cn <- col_num[r]
fname <- paste0('G:/GridMet_Cells_RawData/row',rc,'_col',cc,'_cell',ce,'.csv')
data_df <- data.frame(read_csv(fname, show_col_types = FALSE)) # read previous data in
data_df <- data[which(year(data$Date) < 2021),]
# add rows for 2021 daily data
data_df[15342:15673,] <- NA
data_df$Date[15342:15673] <- seq(as.Date('2021-01-01'),as.Date('2021-11-28'),'days')
data_df$bi[15342:15673] <- …Run Code Online (Sandbox Code Playgroud) 我注意到,如果我使用 terra 包从存储在本地硬盘上的文件加载栅格,然后稍后加载工作区,则 SpatRaster 对象没有任何与其关联的数据。有没有办法在保存和加载工作空间时保留与 SpatRaster 对象关联的所有信息?
这是一个示例代码来说明这个问题:
library(terra)
f <- system.file("ex/elev.tif", package="terra")
r <- rast(f)
#This produces the following output
r
#class : SpatRaster
#dimensions : 90, 95, 1 (nrow, ncol, nlyr)
#resolution : 0.008333333, 0.008333333 (x, y)
#extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax,
ymin, #ymax)
#coord. ref. : lon/lat WGS 84 (EPSG:4326)
#source : elev.tif
#name : elevation
#min value : 141
#max value : 547
sources(r)#this works
save.image("delete_if_found.RData")
rm(list = ls())
load("delete_if_found.RData")
r
#which returns …Run Code Online (Sandbox Code Playgroud) 我想使用包逐层编写栅格terra。我正在使用以下代码
library(terra)
# first create a raster
r1 <- r2 <- r3 <- rast(nrow=10, ncol=10)
# Assign random cell values
values(r1) <- runif(ncell(r1))
values(r2) <- runif(ncell(r2))
values(r3) <- runif(ncell(r3))
s <- c(r1, r2, r3)
s
plot(s)
writeRaster(s, names(s), overwrite=TRUE)
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误
错误:[writeRaster] 无法打开文件:C:/Users/nn/Desktop/lyr.1 另外:警告消息:C:/Users/nn/Desktop/lyr.1:没有这样的文件或目录(GDAL 错误 4)
我想raster使用以下函数在包中提供相同的输出
raster::writeRaster(s, names(s), bylayer=TRUE, format='GTiff', overwrite=TRUE)
Run Code Online (Sandbox Code Playgroud) 正如问题所说,我正在尝试将多层terra栅格转换为rasterStack对象,以便我可以将它与另一个biomod2仅接受旧raster对象的包()一起使用。
有没有有效的方法来做到这一点?我唯一的其他选择似乎是将其保存为.tif,然后使用 .tif 将其重新导入到 R 中raster。
当我使用时stack(terraRaster),它复制了一些图层。例如,我有一个堆栈,其中包含 19 个 WorldClim 生物气候变量以及地质层。它看起来是这样的:
> names(current.clim) # Terra rast object
[1] "bio1" "bio2" "bio3" "bio4" "bio5" "bio6" "bio7" "bio8" "bio9" "bio10" "bio11" "bio12" "bio13"
[14] "bio14" "bio15" "bio16" "bio17" "bio18" "bio19"
> names(stack(current.clim)) # Converted to rasterStack
[1] "bio1" "bio2" "bio3" "bio4" "bio5" "bio6" "bio7" "bio8" "bio9" "bio10" "bio11" "bio12" "bio13"
[14] "bio14" "bio15" "bio16" "bio17" "bio18" "bio19"
> …Run Code Online (Sandbox Code Playgroud) 我正在使用 terra 和 raster 包读取光栅文件
library(raster)
library(terra)
fl_terra <- terra::rast('my_raster.tif')
fl_raster <- raster::raster('my_raster.tif')
fl_terra
class : SpatRaster
dimensions : 157450, 327979, 1 (nrow, ncol, nlyr)
resolution : 0.0002777778, 0.0002777778 (x, y)
extent : -142.4107, -51.30541, 41.12569, 84.86181 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326)
source : xxxx.tif
categories : DepthBand
name : DepthBand
min value : 0.0m <= x <= 0.3m
max value : x > 9.0m
fl_raster
class : RasterLayer
dimensions : 157450, 327979, 51640293550 …Run Code Online (Sandbox Code Playgroud) 我正在更改我的空间工作流程以使用 terra 包而不是 raster 包。使用光栅包,我曾经将多个光栅直接读入堆栈。
filelist_temp <- list.files(datapath("Climate/World Clim 1 yr Monthly Weather/LCC June and July/June"), full.names = TRUE)
temp_rasters <- stack(filelist_temp)
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以在 terra 中进行相同的操作?
这是我最初想到的,但它不起作用。我最终得到了一个包含 25 个 spatRaster 的列表
temp_rasters <- c(lapply(filelist_temp, rast))
Run Code Online (Sandbox Code Playgroud) 我想terra将图例水平放置在地图下方。看来,这可以通过将一个字符传递给(eg ) 或将一个列表传递给带有来自 base-R legend 函数的参数来help完成。然而,对我来说这些都不起作用。请参阅下面的代码示例。legendlegend = "bottomleft"plg
谢谢!
rm(list = ls())
library(terra)
f <- system.file("ex/elev.tif", package="terra")
r <- rast(f)
terra::plot(r)
terra::plot(r, legend = "bottomleft")
terra::plot(r, plg = list(horiz = TRUE))
terra::plot(r, plg = list(x = 6, y = 49.5, horiz = TRUE))
Run Code Online (Sandbox Code Playgroud)
在所有情况下生成的地图如下:
编辑:通过将范围传递给 plg,覆盖绘图轴限制之外的区域,图例将移动到正确的位置,但horiz = TRUE仍然不会旋转它:
e <- c(5.6, 6.6, 49.2, 49.3)
terra::plot(r, plg = list(ext = e, horizontal = TRUE), mar = rep(4, 4))
Run Code Online (Sandbox Code Playgroud)
我正在 R 中使用 {terra} 的 lapp 函数,我想根据 rast_a 每个单元格中的值使用 rast_b 或 rast_c (以及其他一些数学)中的值更新 rast_a 。
样本数据
rast_a <- rast(ncol = 2, nrow = 2)
values(rast_a) <- 1:4
rast_b <- rast(ncol = 2, nrow = 2)
values(rast_b) <- c(2,2,2,2)
rast_c <- rast(ncol = 2, nrow = 2)
values(rast_c) <- c(3,3,3,3)
Run Code Online (Sandbox Code Playgroud)
问题
这是我的(错误的)尝试。
my_update_formula <- function(a, b, c) {
a[a == 1] <- b[a == 1] + 10 + 20 - 30
a[a == 2] <- c[a == 2] + 10 + …Run Code Online (Sandbox Code Playgroud) terra我想使用包将从栅格堆栈中提取的值添加到空间对象的 data.frame 中
f <- system.file("ex/logo.tif", package="terra")
r <- rast(f)
#Plot the raster
plot(r, 1:3)
#Create a vector file
points <- cbind.data.frame(Longitude = 40, Latitude = 40, val = 0.5)
points <- rbind.data.frame(points-1, points, points+1)
points_vect <- vect(points, geom=c("Longitude", "Latitude"), crs=crs(r, proj=T),
type = "points")
#Extract the values from raster using the point vector
terra::extract(r, points_vect, xy = T, method = "simple")
#> ID red green blue x y
#> 1 1 255 255 253 30 30
#> 2 …Run Code Online (Sandbox Code Playgroud)