es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Accede a los valores del objeto raster/terra desde Rcpp.

¿Existe alguna manera de leer los valores de celdas de un objeto raster o terra desde dentro de Rcpp? Actualmente convierto el objeto en un vector y accedo a través de la función cell (o row/col):

Rcpp:

#include <rcpp.h>

// [[Rcpp::export]]
double value_from_cell(const Rcpp::NumericVector &x, const int cell) {
  double out = x[cell-1];
  return out;
}

R:

library(terra)

# Crear un SpatRaster desde cero
x <- rast(nrows = 108, ncols = 21, xmin = 0, xmax = 10,
          vals = runif(108*21))

# Convertir a vector
x_vec <- terra::values(x, mat = FALSE)

value_from_cell(x = x_vec, cell = 20)

Sé que puedo acceder a información básica (por ejemplo, ncol, xmin, …) a través de Rcpp::S4 como se ve en el paquete fasterize. Pero me gustaría poder leer los valores directamente desde Rcpp, ya que la conversión a un vector consume mucha memoria RAM o incluso puede ser demasiado grande. ¡Cualquier ayuda o guía sería genial!</rcpp.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible leer los valores de celda de un objeto raster o terra desde Rcpp. Puede usar el método “.get” de un objeto SpatRaster* o AbstractRaster* para obtener un puntero a los valores de celda, y luego usarlo para leer los valores en la posición deseada. Aquí hay un ejemplo de una función de Rcpp que lee un valor de celda de un objeto SpatRaster directamente:

    #include <rcpp.h>
    #include "terra.h"
    
    // [[Rcpp::depends(terra)]]
    // [[Rcpp::export]]
    
    double read_cell(SpatRaster* r, int row, int col) {
    
      double* values = r->get(0, 0, row, col, 1, 1); // obtener un puntero a los valores de celda
      double val = values[0]; // leer el valor en la posición deseada
      return val;
    
    }
    

    Puede llamar a esta función desde R con un objeto SpatRaster y los índices de fila y columna de la celda que desea leer:

    library(terra)
    library(Rcpp)
    
    x <- rast(nrows = 108, ncols = 21, xmin = 0, xmax = 10, vals = runif(108*21))
    
    read_cell(x$terra, 10, 5)
    

    Esto devolverá el valor en la fila 10, columna 5 del objeto SpatRaster “x”. Tenga en cuenta que necesita incluir el archivo de encabezado “terra.h” y el paquete “terra” en su código Rcpp para acceder al tipo SpatRaster* y al método “.get”.</rcpp.h>

Comments are closed.