Come produrre una griglia spaziale da raster?


9

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?


6
Lanciaci degli scarti qui. Un piccolo codice per creare un raster e cosa ti aspetti da esso?
Spacedman,

Risposte:


14

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 SpatialGridoggetti sono definiti griglie rettangolari complete, quindi uno senza i pixel NA non ha senso.


grazie amico, non sono nemmeno sicuro di cosa desiderare. Cerco di sviluppare un flusso di lavoro per produrre mappe raster identiche (in termini di risoluzione, coorinati, crs, ...) da vari dati di punti spaziali. rasterizzare non è un'opzione a causa della dispersione del punto spaziale. È necessario utilizzare iwd o simili. Hai ragione, la griglia è rettilinea - quello di cui ho bisogno come modello principale è probabilmente uno SpatialPointsDataFrame. quale può essere grigliato. S.
Janbob Squarebrains,

Probabilmente vorrai un master raster (ah!) E quindi creare tutte le griglie successive ad essa associate.
Radar,

2
Concordato. Se le cose sono soddisfatte, il raster è quasi sempre la risposta. O quello, o passando in rassegna circa 20 pagine di Applied Spatial Data Analysis in R per capire come fare SpatialPixels. Ho dato quella scelta a uno studente di dottorato oggi, in effetti. Ha scelto ... saggiamente!
Spacedman,

20

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)

7

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.

  • (Probabilmente, dal momento che puoi memorizzare celle sparse semplicemente memorizzando il loro indice anziché coordinate esplicite, e le coordinate delle celle "leggermente irregolari" in origine potrebbero essere memorizzate come attributi se le desideri davvero. Né sp né raster si occupano affatto di raster irregolari, nemmeno il semplice caso rettilineo - questo è in linea con la maggior parte degli strumenti GIS, ma è sfortunato poiché è abbastanza comune in formati come NetCDF ed è gestito dalla buona vecchia funzione grafica :: image di R (anche se non se si utilizza la recente opzione rasterImage) .)

Grazie per le dichiarazioni molto istruttive, che devo digerire. Spero che mi permetta di risolvere il mio problema o pubblicare una domanda più esplicita!
Janbob Squarebrains,

Anche @Spacedman: ho definito più precisamente il mio background di domande qui nel forum.
Janbob Squarebrains,
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.