J'ai besoin d'une grille spatiale comme grille principale pour diverses cartes thématiques. Comment produire une grille spatiale à partir d'un raster supprimant tous les pixels NA?
J'ai besoin d'une grille spatiale comme grille principale pour diverses cartes thématiques. Comment produire une grille spatiale à partir d'un raster supprimant tous les pixels NA?
Réponses:
Vous pouvez obtenir toutes les coordonnées non-NA des cellules dans un raster avec:
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
ce sont les cellules qui ne sont pas NA. Vous pouvez alors probablement les envoyer à 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
Bien que personnellement, je ne garde rien sur une grille comme un raster.
Je ne suis pas encore totalement sûr de ce que vous voulez - les SpatialGrid
objets définissent des grilles rectangulaires complètes, donc une sans les pixels NA n'a pas de sens.
Pour transformer un RasterLayer en un objet Spatial * (Grille ou Pixels), vous pouvez utiliser la fonction de coercition "as"
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)
Vos deux exigences semblent concerner des choses différentes:
1) Une sorte de modèle de grille raster fiable.
2) Une grille clairsemée qui ne stocke pas explicitement les cellules manquantes.
sp :: GridTopology fournit le premier, c'est juste une description de la grille basée sur la coordonnée de cellule inférieure gauche (cellcentre.offset), l'espacement des cellules (cellsize) et les dimensions de la grille (cells.dim).
La classe sp :: SpatialPixelsDataFrame vous permet de stocker des grilles clairsemées, mais en elle-même, elle stocke beaucoup plus que le "modèle" - elle stocke également chaque coordonnée explicitement. En effet, il effectue deux tâches, l'une vous permet de conserver les coordonnées d'origine qui proviennent de la grille et sont peut-être légèrement irrégulières, deux elle vous permet de stocker uniquement les cellules qui ont des valeurs valides. (Sans doute * ces deux objectifs auraient dû être séparés, mais c'est une autre histoire).
Je ne pense pas que le package raster ait un analogue explicite de GridTopology, mais vous pouvez vous procurer les composants pour "rouler le vôtre":
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
En les reliant tous ensemble, nous pouvons passer du raster au sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Notez comment les dimensions doivent être inversées). Un autre moyen plus simple consiste à contraindre SpatialGrid et à utiliser getGridTopology de sp, bien que cela soit plus coûteux car les coordonnées finissent par être générées en cours de route:
getGridTopology(as(r1, "SpatialGrid"))
Ces trois parties de la "topologie" raster ne sont pas toutes nécessaires, car certaines sont redondantes mais il n'y a pas autrement un moyen de les capturer toutes en un seul objet - sauf que le raster créé ci-dessus est "vide" et qu'il peut donc faire le travail que GridTopology fait pour sp. Je ne suis pas sûr des détails sur la façon dont il est "vide", mais il ne stocke certainement pas explicitement le slot "data" et est plus petit qu'il ne le serait avec des valeurs. Le paquetage raster fait en général de son mieux pour réduire au minimum l'utilisation de la mémoire. Ainsi, avec lui, vous n'aurez peut-être pas à vous soucier d'être vraiment "clairsemé".
Cela pourrait aider à expliquer un peu plus, je sais que je chevauche la réponse de Spacedman, mais ce n'est pas encore clair ce que vous voulez dire dans la question.