Comment produire une grille spatiale à partir d'un raster?
9
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?
Jetez-nous quelques morceaux ici. Un petit code pour faire un raster et ce que vous en attendez?
Spacedman
Réponses:
14
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.3750.7[2,]0.1250.5[3,]0.3750.5[4,]0.6250.5[5,]0.8750.5[6,]0.1250.3[7,]0.3750.3[8,]0.6250.3[9,]0.3750.1[10,]0.8750.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.1250.254
y 0.1000.204
SpatialPoints:
x y[1,]0.3750.7[2,]0.1250.5[3,]0.3750.5[4,]0.6250.5[5,]0.8750.5[6,]0.1250.3[7,]0.3750.3[8,]0.6250.3[9,]0.3750.1[10,]0.8750.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 SpatialGridobjets définissent des grilles rectangulaires complètes, donc une sans les pixels NA n'a pas de sens.
merci mon pote, je ne sais pas trop quoi vouloir. J'essaie de développer un workflow pour produire des cartes raster identiques (en termes de résolution, coorinates, crs, ...) à partir de différentes données ponctuelles spatiales. la pixellisation n'est pas une option en raison de la diffusion spatiale ponctuelle. Besoin d'utiliser iwd ou similaire. Vous avez raison, la grille est rectangulaire - ce dont j'ai besoin en tant que modèle principal est probablement un SpatialPointsDataFrame. qui peut être maillé. S.
Janbob Squarebrains
Vous voudrez probablement un raster maître (ha!) Et ensuite créer toutes les grilles suivantes en même temps.
Radar
2
D'accord. Si les choses sont maillées, le raster est presque toujours la réponse. Soit cela, soit en parcourant environ 20 pages d'Applied Spatial Data Analysis dans R pour comprendre comment faire des SpatialPixels. J'ai donné ce choix à un doctorant aujourd'hui, en fait. Il a choisi ... sagement!
Spacedman
20
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 010
s2 -9090## 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:
(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.
(Sans doute, puisque vous pouvez stocker des cellules clairsemées en stockant simplement leur index plutôt que des coordonnées explicites, et à l'origine les coordonnées de cellule "légèrement irrégulières" pouvaient simplement être stockées en tant qu'attributs si vous les vouliez vraiment. Ni sp ni raster ne traitent du tout des rasters irréguliers, pas même le cas rectiligne simple - cela correspond à la plupart des outils SIG, mais c'est regrettable car il est assez courant dans des formats comme NetCDF et est géré par la bonne vieille fonction graphics :: image de R (mais pas si la récente option rasterImage est utilisée) .)
Merci pour les déclarations très instructives que je dois digérer. J'espère que cela me permettra de résoudre mon problème ou de poster une question plus explicite!
Janbob Squarebrains
Aussi @Spacedman: J'ai défini plus précisément l'arrière-plan de ma question ici dans le forum.
Réponses:
Vous pouvez obtenir toutes les coordonnées non-NA des cellules dans un raster avec:
ce sont les cellules qui ne sont pas NA. Vous pouvez alors probablement les envoyer à SpatialPixels
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.la source
Pour transformer un RasterLayer en un objet Spatial * (Grille ou Pixels), vous pouvez utiliser la fonction de coercition "as"
la source
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":
En les reliant tous ensemble, nous pouvons passer du raster au sp:
(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:
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.
la source