Losowe próbkowanie rastra za pomocą R?

13

Czy istnieje prosty sposób losowego próbkowania rastra, aby wynik procesu był rastrem?

Korzystam z przykładu, który znalazłem na r-sig-geo liście, a także wypróbowałem sampleRandomfunkcję w rasterpakiecie. Oba te podejścia dają wynik, którego nie jestem pewien, jak przekształcić w raster. Nie udało mi się znaleźć rozwiązania po wyszukaniu kilku kombinacji „rastra SpatialPointsDataFrame”.

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)

Po uruchomieniu r.testotrzymuję wynik:

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

Tak więc następujący wiersz, który próbuje zapisać raster, generuje komunikat:

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

Error: hasValues(x) is not TRUE

Moim głównym celem jest wytworzenie pewnego rodzaju rastra po procesie pobierania próbek. Nie mam nic przeciwko zmianie wartości w moim rastrze (po prostu nie jestem pewien, jak to zrobić).

djq
źródło

Odpowiedzi:

21

Możesz dostosować przykłady z winietyRaster opakowania , sekcja 5.2. Oto jeden ze sposobów:

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)

Wybór rastra

Whuber
źródło
10
Ta odpowiedź sprawia, że ​​chcę się uczyć R ...
SaultDon,
2
Może to być bardzo oczywiste, ale zajęło mi trochę czasu, aby uświadomić sobie, że można odwoływać się do wartości dowolnej komórki r[r "condition"]. Więc jeśli chcesz ustawić wszystkie wartości rastra, które mają 100być 1, możesz napisać r[r == 100] <- 1. Dzięki @whuber - niezwykle przydatny przykład!
djq,
@whuber Jakiś pomysł, dlaczego pojawił się komunikat Error: hasValues ​​(x) nie jest PRAWDA?
csheth
2

Możesz użyć sampleRandomfunkcji:

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

x <- sampleRandom(r, ncell(r)*.3, asRaster=TRUE)
Robert Hijmans
źródło