Campionamento casuale di raster usando R?


13

Esiste un modo semplice per campionare casualmente un raster in modo che l'output del processo sia un raster?

Sto usando un esempio che ho trovato r-sig-geo nell'elenco e ho anche provato la sampleRandomfunzione nel rasterpacchetto. Entrambi questi approcci producono un risultato che non sono sicuro di come trasformare in un raster. Non sono riuscito a trovare un approccio dopo aver cercato diverse combinazioni di "SpatialPointsDataFrame raster".

library(raster)

# read in raster
rasterSource <- 'landsat.TIF'
r <- raster(rasterSource)

# convert to spatial points data frame
r.spgrd<-as(r,"SpatialPointsDataFrame") 

# elminate NA values
r.spgrd = r.spgrd[!is.na(r.spgrd[[1]]),] 

# sample points
selectedPoints = sample(1:length(r.spgrd[[1]]), 1000)
r.sampled = r.spgrd[selectedPoints,]

# try to make spgrd into a raster
r.test <- raster(r.sampled)

Quando corro r.testottengo l'output:

class       : RasterLayer 
dimensions  : 10, 10, 100  (nrow, ncol, ncell)
resolution  : 28617, 14766  (x, y)
extent      : 1838505, 2124675, 2328685, 2476345  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=23 +lon_0=-96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
values      : none

In modo che la seguente riga che tenta di scrivere un raster produca il messaggio:

# write out as ascii file
writeRaster(r.test, filename="test1.ASC", datatype="ascii", overwrite=TRUE)

Error: hasValues(x) is not TRUE

Il mio obiettivo principale è quello di produrre un tipo di raster dopo il processo di campionamento. Sto bene anche solo cambiando i valori all'interno del mio raster (non sono sicuro di come farlo).

Risposte:


21

È possibile adattare esempi dalla vignetta del Rasterpacchetto , sezione 5.2. Ecco un modo:

r <- raster(ncol=30,nrow=20)
r[] <- 1:(30*20)              # Raster for testing
#plot(r)                      # (If you want to see it)
r[runif(30*20) >= 0.30] <- NA # Randomly *unselect* 70% of the data
plot(r)

Selezione raster


10
Questa risposta mi fa venire voglia di imparare R ...
SaultDon

2
Questo può essere estremamente ovvio, ma mi ci è voluto un po 'di tempo per capire che è possibile fare riferimento al valore di qualsiasi cella r[r "condition"]. Quindi, se vuoi impostare tutto il valore del raster che devi 100essere 1, puoi scrivere r[r == 100] <- 1. Grazie @whuber - esempio estremamente utile!
djq,

@whuber Qualche idea sul perché l'errore: hasValues ​​(x) non sia VERO spuntato?
csheth,

2

Puoi usare la sampleRandomfunzione:

library(raster)
r <- raster(ncol=30,nrow=20)
r[] <- 1:ncell(r)

x <- sampleRandom(r, ncell(r)*.3, asRaster=TRUE)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.