标签: terra

如何从 terra SpatRaster 构建 lon、lat、value 数据框

我已使用优秀的terra包将单变量 .nc 文件作为 SpatRaster 对象读入 R ,目的是基于单元质心拟合地统计模型。为此,我需要使用 SpatRaster 中的数据构建一个数据框,其中的列对应于“lon、lat、value”。这感觉像是一个可能有标准解决方案的任务,但我不熟悉 R 的空间统计生态系统。

任何意见/建议将不胜感激。

gis r raster terra

3
推荐指数
1
解决办法
1577
查看次数

使用 Rstudio 服务器加载某些包不起作用,而使用 R 服务器则可以

我正在Rstudio server远程服务器上使用,并且已经安装了一些软件包。

\n

当我尝试加载类似rasterterrausing 之类的库时Rstudio server,出现错误:

\n
> 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\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,使用 …

linux r rstudio-server terra

3
推荐指数
1
解决办法
1417
查看次数

在 foreach 循环 R 中,NULL 值作为符号地址错误传递

我以前从未遇到过此问题,但是当我尝试在 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)

foreach r doparallel terra

3
推荐指数
1
解决办法
1426
查看次数

我可以将 SpatRaster “保存”在 R 工作区 (RData) 文件中吗?

我注意到,如果我使用 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)

gis r terra

3
推荐指数
1
解决办法
769
查看次数

如何在R中使用terra包编写栅格逐层?

我想使用包逐层编写栅格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)

r r-raster terra

2
推荐指数
1
解决办法
1480
查看次数

R中有没有办法将多层栅格(Terra)转换为rasterStack对象(Raster)?

正如问题所说,我正在尝试将多层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)

r raster spatial terra

2
推荐指数
1
解决办法
1119
查看次数

使用 terra 和 raster 包读取 tif 文件给出不同的结果

我正在使用 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)

r raster terra

2
推荐指数
1
解决办法
1001
查看次数

在 terra 包中读取多个栅格

我正在更改我的空间工作流程以使用 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)

r raster r-raster terra

1
推荐指数
1
解决办法
244
查看次数

terra R 包中的水平图例

我想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)

在此输入图像描述

plot dictionary r legend terra

1
推荐指数
1
解决办法
1403
查看次数

使用 terra 有条件地更新另一个栅格的栅格值

我正在 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)

gis r raster spatial terra

1
推荐指数
1
解决办法
577
查看次数

如何使用 terra 包将从栅格堆栈中提取的值添加到空间对象的 data.frame 中?

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)

r r-raster terra

0
推荐指数
1
解决办法
1526
查看次数

标签 统计

r ×11

terra ×11

raster ×5

gis ×3

r-raster ×3

spatial ×2

dictionary ×1

doparallel ×1

foreach ×1

legend ×1

linux ×1

plot ×1

rstudio-server ×1