Read GRASS raster files from GRASS into R terra "SpatRaster" or sp "SpatialGridDataFrame" objects, and write single columns of terra "SpatRaster" or sp "SpatialGridDataFrame" objects to GRASS. When return_format="terra", temporary binary files and r.out.bin and r.in.bin are used for speed reasons. read_RAST() and write_RAST() by default use "RRASTER" files written and read by GDAL.

read_RAST(vname, cat=NULL, NODATA=NULL,
 return_format="terra", close_OK=return_format=="SGDF",
 flags=NULL, Sys_ignore.stdout = FALSE, ignore.stderr=get.ignore.stderrOption())
write_RAST(x, vname, zcol = 1, NODATA=NULL, flags=NULL,
 ignore.stderr = get.ignore.stderrOption(), overwrite=FALSE, verbose=TRUE)

Arguments

vname

A vector of GRASS raster file names in mapsets in the current search path, as set by “g.mapsets”; the file names may be given as fully-qualified map names using “name@mapset”, in which case only the mapset given in the full path will be searched for the existence of the raster; if more than one raster with the same name is found in mapsets in the current search path, an error will occur, in which case the user should give the fully-qualified map name. If the fully-qualified name is used, @ will be replaced by underscore in the output object.

cat

default NULL; if not NULL, must be a logical vector matching vname, stating which (CELL) rasters to return as factor

return_format

default "terra", optionally "SGDF"

Sys_ignore.stdout

Passed to system.

ignore.stderr

default taking the value set by set.ignore.stderrOption; can be set to TRUE to silence system() output to standard error; does not apply on Windows platforms

close_OK

default TRUE - clean up possible open connections used for reading metadata; may be set to FALSE to avoid the side-effect of other user-opened connections being broken

x

A terra "SpatRaster" or sp "SpatialGridDataFrame" object

zcol

Attribute column number or name

NODATA

by default NULL, in which case it is set to one less than floor() of the data values for FCELL rasters or the range maximum for CELL Byte, UInt16 and Uint32 rasters (with no negative values), and an attempt is made to set NODATA to the upper Int16 and Int32 range if the lower range is occupied; otherwise an integer NODATA value (required to be integer by GRASS r.out.bin)

overwrite

default FALSE, if TRUE inserts "overwrite" into the value of the flags argument if not already there to allow existing GRASS rasters to be overwritten

flags

default NULL, character vector, for example "overwrite"

verbose

default TRUE, report how writing to GRASS is specified

Value

read_RAST by default returns a SpatRaster object, but may return a legacy SpatialGridDataFrame object if return_format="SGDF". write_RAST silently returns the object being written to GRASS.

Author

Roger S. Bivand, e-mail: Roger.Bivand@nhh.no

Examples

run <- FALSE
if (nchar(Sys.getenv("GISRC")) > 0 &&
    read.dcf(Sys.getenv("GISRC"))[1,"LOCATION_NAME"] == "nc_basic_spm_grass7") run <- TRUE
GV <- Sys.getenv("GRASS_VERBOSE")
Sys.setenv("GRASS_VERBOSE"=0)
ois <- get.ignore.stderrOption()
set.ignore.stderrOption(TRUE)
#> [1] FALSE
if (run) {
  meta <- gmeta()
  location_path <- file.path(meta$GISDBASE, meta$LOCATION_NAME)
  previous_mapset <- meta$MAPSET
  example_mapset <- "RGRASS_EXAMPLES"
  execGRASS("g.mapset", "c", mapset = example_mapset)
}

if (run) {
  unlist(strsplit(execGRASS("g.mapsets", flags="p", intern=TRUE), " "))
}
#> [1] "RGRASS_EXAMPLES" "PERMANENT"      
if (run) {
  execGRASS("g.list", type="raster", pattern="soils", flags="m", intern=TRUE)
}
#> [1] "soils@PERMANENT"
if (run) {
  execGRASS("g.list", type="raster", pattern="soils@PERMANENT", mapset=".", flags="m", intern=TRUE)
}
#> character(0)
if (run) {
  execGRASS("g.list", type="raster", pattern="soils", mapset="PERMANENT", flags="m", intern=TRUE)
}
#> [1] "soils@PERMANENT"
run <- run && require("terra", quietly=TRUE)
#> terra 1.7.78
if (run) {
  v1 <- read_RAST("landuse", cat=TRUE, return_format="terra")
  v1
  inMemory(v1)
}
#> [1] FALSE
if (run) {
  write_RAST(v1, "landuse1", flags=c("o", "overwrite"))
  execGRASS("r.stats", flags="c", input="landuse1")
  execGRASS("g.remove", flags="f", name="landuse1", type="raster")
}
#> SpatRaster read into GRASS using r.in.gdal from file
#> 1 226
#> 2 2
#> 3 81
#> 4 65
#> 5 415
#> 6 20
#> 7 1
#> * 1009790
Sys.setenv("_SP_EVOLUTION_STATUS_"="2")
run <- run && require("sp", quietly=TRUE)
if (run) {
  nc_basic <- read_RAST(c("geology", "elevation"), cat=c(TRUE, FALSE),
                        return_format="SGDF")
  print(table(nc_basic$geology))
}
#> Warning: non-unique category labels; category number appended
#> 
#> CZfg_217 CZlg_262 CZig_270 CZbg_405 CZve_583 CZam_720  CZg_766 CZam_862 
#>      292       78      277      102        8        1        2       25 
#> CZbg_910   Km_921 CZam_946 
#>       18        5        2 
if (run) {
  execGRASS("r.stats", flags=c("c", "l", "quiet"), input="geology")
}
#> 217 CZfg 292
#> 262 CZlg 78
#> 270 CZig 277
#> 405 CZbg 102
#> 583 CZve 8
#> 720 CZam 1
#> 766 CZg 2
#> 862 CZam 25
#> 910 CZbg 18
#> 921 Km 5
#> 946 CZam 2
#> * no data 1009790
if (run) {
  boxplot(nc_basic$elevation ~ nc_basic$geology)
}

if (run) {
  nc_basic$sqdem <- sqrt(nc_basic$elevation)
}
if (run) {
  write_RAST(nc_basic, "sqdemSP", zcol="sqdem", flags=c("quiet", "overwrite"))
  execGRASS("r.info", map="sqdemSP")
}
#> SpatialGridDataFrame read into GRASS using r.in.bin
#>  +----------------------------------------------------------------------------+
#>  | Map:      sqdemSP                        Date: Tue Jun 18 19:32:14 2024    |
#>  | Mapset:   RGRASS_EXAMPLES                Login of Creator: floris          |
#>  | Location: nc_basic_spm_grass7                                              |
#>  | DataBase: /home/floris/grassdata                                           |
#>  | Title:                                                                     |
#>  | Timestamp: none                                                            |
#>  |----------------------------------------------------------------------------|
#>  |                                                                            |
#>  |   Type of Map:  raster               Number of Categories: 0               |
#>  |   Data Type:    DCELL                Semantic label: (none)                |
#>  |   Rows:         620                                                        |
#>  |   Columns:      1630                                                       |
#>  |   Total Cells:  1010600                                                    |
#>  |        Projection: Lambert Conformal Conic                                 |
#>  |            N:     320000    S:      10000   Res:   500                     |
#>  |            E:     935000    W:     120000   Res:   500                     |
#>  |   Range of data:    min = 7.59028829155237  max = 12.3394764902613         |
#>  |                                                                            |
#>  |   Data Description:                                                        |
#>  |    generated by r.in.bin                                                   |
#>  |                                                                            |
#>  |   Comments:                                                                |
#>  |    r.in.bin --overwrite --quiet -d input="/home/floris/grassdata/nc_bas\   |
#>  |    ic_spm_grass7/RGRASS_EXAMPLES/.tmp/inbofloris/X834" output="sqdemSP"\   |
#>  |     bytes=8 header=0 bands=1 order="native" north=320000 south=10000 ea\   |
#>  |    st=935000 west=120000 rows=620 cols=1630 anull=6                        |
#>  |                                                                            |
#>  +----------------------------------------------------------------------------+
#> 
if (run) {
  print(system.time(sqdemSP <- read_RAST(c("sqdemSP", "elevation"),
                                         return_format="SGDF")))
}
#>    user  system elapsed 
#>   0.780   0.600   0.686 
if (run) {
  print(system.time(sqdem <- read_RAST(c("sqdemSP", "elevation"),
    return_format="terra")))
}
#>    user  system elapsed 
#>   0.835   1.379   0.557 
if (run) {
names(sqdem)
}
#> [1] "sqdemSP"   "elevation"
if (run) {
  sqdem1 <- read_RAST(c("sqdemSP@RGRASS_EXAMPLES", "elevation@PERMANENT"))
}
if (run) {
  names(sqdem1)
}
#> [1] "sqdemSP_RGRASS_EXAMPLES" "elevation_PERMANENT"    
if (run) {
  execGRASS("g.remove", flags="f", name="sqdemSP", type="raster")
  execGRASS("r.mapcalc", expression="basins0 = basins - 1", flags="overwrite")
  execGRASS("r.stats", flags="c", input="basins0")
}
#> 1 48
#> 3 31
#> 7 32
#> 9 5
#> 11 136
#> 13 22
#> 15 34
#> 17 12
#> 19 108
#> 21 38
#> 23 27
#> 25 35
#> 27 74
#> 29 22
#> * 1009976
if (run) {
  basins0 <- read_RAST("basins0", return_format="SGDF")
  print(table(basins0$basins0))
}
#> 
#>   1   3   7   9  11  13  15  17  19  21  23  25  27  29 
#>  48  31  32   5 136  22  34  12 108  38  27  35  74  22 
if (run) {
  execGRASS("g.remove", flags="f", name="basins0", type="raster")
}
if (run) {
  execGRASS(cmd = "r.mapcalc", expression="test_t=66000", flags="overwrite")
  execGRASS("r.info", flags = "r", map = "test_t", intern = TRUE) # #82
}
#> [1] "min=66000" "max=66000"
if (run) {
  (tt = read_RAST(vname = "test_t"))
}
#> class       : SpatRaster 
#> dimensions  : 620, 1630, 1  (nrow, ncol, nlyr)
#> resolution  : 500, 500  (x, y)
#> extent      : 120000, 935000, 10000, 320000  (xmin, xmax, ymin, ymax)
#> coord. ref. : NAD83(HARN) / North Carolina (EPSG:3358) 
#> source      : file883370ecc607.grd 
#> name        : file883370ecc607 
#> min value   :                0 
#> max value   :            66000 
if (run) {
  execGRASS("g.remove", flags="f", name="test_t", type="raster")
}
if (run) {
  execGRASS("g.mapset", mapset = previous_mapset)
  if (example_mapset != previous_mapset) {
    unlink(file.path(location_path, example_mapset), recursive = TRUE)
  }
}
Sys.setenv("GRASS_VERBOSE"=GV)
set.ignore.stderrOption(ois)
#> [1] TRUE