Ho bisogno di una griglia spaziale come griglia principale per diverse mappe tematiche. Come posso produrre una griglia spaziale da un raster scartando tutti i pixel NA?
Ho bisogno di una griglia spaziale come griglia principale per diverse mappe tematiche. Come posso produrre una griglia spaziale da un raster scartando tutti i pixel NA?
Risposte:
Puoi ottenere tutte le coordinate non NA delle celle in un raster con:
r = raster(matrix(runif(20),5,4))
r[r>.5]=NA
coordinates(r)[!is.na(values(r)),]
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
quelle sono le cellule che non sono NA. Probabilmente puoi quindi inviarli a SpatialPixels
SpatialPixels(SpatialPoints(coordinates(r)[!is.na(values(r)),]))
Object of class SpatialPixels
Grid topology:
cellcentre.offset cellsize cells.dim
x 0.125 0.25 4
y 0.100 0.20 4
SpatialPoints:
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
Coordinate Reference System (CRS) arguments: NA
Anche se personalmente qualsiasi cosa su una griglia terrei come un raster.
Non sono ancora del tutto sicuro di cosa tu voglia: gli SpatialGrid
oggetti sono definiti griglie rettangolari complete, quindi uno senza i pixel NA non ha senso.
Per trasformare un RasterLayer in un oggetto Spatial * (Grid o Pixel) è possibile utilizzare la funzione di coercizione "come"
library(raster)
r <- raster(matrix(runif(20),5,4))
r[r>.5] <- NA
g <- as(r, 'SpatialGridDataFrame')
p <- as(r, 'SpatialPixels')
plot(r)
points(p)
I tuoi due requisiti sembrano riguardare cose diverse:
1) Una sorta di modello di griglia raster affidabile.
2) Una griglia sparsa che non memorizza esplicitamente le celle mancanti.
sp :: GridTopology fornisce il primo, è solo una descrizione della griglia basata sulla coordinata delle celle in basso a sinistra (cellcentre.offset), sulla spaziatura delle celle (cellula) e sulle dimensioni della griglia (cell.dim).
La classe sp :: SpatialPixelsDataFrame ti consente di memorizzare griglie sparse, ma da sola memorizza molto più del "modello" - memorizza anche ogni coordinata in modo esplicito. Questo perché fa due lavori, uno ti consente di preservare le coordinate originali che provengono dalla griglia e sono forse leggermente irregolari, due ti consente di memorizzare solo quelle celle che hanno valori validi. (Probabilmente * questi due obiettivi avrebbero dovuto essere separati, ma questa è un'altra storia).
Non penso che il pacchetto raster abbia un analogo esplicito con GridTopology, ma puoi ottenere i componenti per "creare il tuo":
library(raster)
r1 <- raster(nrows=108, ncols=21, xmn=0, xmx=10)
## "cellsize"
res(r1)
## [1] 0.4761905 1.6666667
## extreme cell corners (just a different convention to sp's cellcentre)
extent(r1)
class : Extent
xmin : 0
xmax : 10
ymin : -90
ymax : 90
## we can also use bbox to get the same thing
bbox(r1)
min max
s1 0 10
s2 -90 90
## grid dimensions (including number of attributes/layers as 3rd "dim")
dim(r1)
## [1] 108 21 1
Collegando questi tutti insieme, possiamo passare dal raster allo sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Nota come le dimensioni devono essere invertite). Un altro modo più semplice è quello di forzare SpatialGrid e utilizzare getGridTopology di sp, anche se questo è più costoso poiché le coordinate finiscono per essere generate lungo il percorso:
getGridTopology(as(r1, "SpatialGrid"))
Queste tre parti della "topologia" raster non sono tutte necessarie, dal momento che alcune sono ridondanti ma non esiste altrimenti un modo per catturarle tutte come un unico oggetto - tranne per il fatto che il raster creato sopra è "vuoto" e quindi può fare il lavoro che GridTopology fa per sp. Non sono sicuro sui dettagli di quanto sia "vuoto", ma certamente non memorizza esplicitamente lo slot "dati" ed è più piccolo di quanto sarebbe con i valori al suo interno. Il pacchetto raster in genere fa del suo meglio per ridurre al minimo l'utilizzo della memoria, quindi con esso potresti non doverti preoccupare di essere veramente "scarso".
Questo potrebbe aiutare a spiegare un po 'di più, so che sto sovrapponendo la risposta di Spacedman, ma non è ancora chiaro esattamente cosa intendi nella domanda.