2017-07-24 2 views
1

Je sais que pour obtenir une raster de et XYZ list (où x et y sont des vecteurs numériques de coordonnées et z est une matrice numérique) je peux utiliser directement la fonction raster. Mais que faire si j'ai un raster et que je veux obtenir une liste XYZ? Y at-il une fonction simple déjà développée sur le paquet raster?Récupère la liste XYZ de l'objet Raster

Bien sûr, je sais que je peux construire une liste indexant les différents niveaux sur l'objet raster, mais j'ai trouvé que je devais faire quelques réversions pour y arriver, donc je me demande s'il y a un simple et efficace façon.

Merci.

+1

cela devrait fonctionner: 'df <- as.data.frame (myrast, xy = TRUE)' – lbusett

+0

@LoBu, je parlais d'avoir comme sortie une liste avec 3 niveaux: sortie (une liste) $ x (vecteur numérique, longitudes) $ y (vecteur numérique, latitudes) $ z (matrice numérique avec longueur (x) lignes et longueur (y) cols) –

+0

Salut. désolé mais je ne sais pas si je vous suis bien: vous voulez des latitudes et des longueurs comme vecteurs et l'image comme matrice? – lbusett

Répondre

2

Il y a deux façons de le faire, mais cela semble être simple pour moi:

Essentiellement, vous utilisez la fonction xyFromCell du package raster pour obtenir les coordonnées des cellules, puis vous liez-le ensemble à la liste désirée.

library(raster) 

# testraster 
r <- raster() 
r[] <- runif(ncell(r)) 

#coordinates 
coords <- xyFromCell(r,1:ncell(r)) 

#create list 
xyzlist <- list(x=coords[,'x'],y=coords[,'y'],z=as.matrix(r)) 

Ce qui vous donne:

> str(xyzlist) 
List of 3 
$ x: num [1:64800] -180 -178 -178 -176 -176 ... 
$ y: num [1:64800] 89.5 89.5 89.5 89.5 89.5 89.5 89.5 89.5 89.5 89.5 ... 
$ z: num [1:180, 1:360] 0.786 0.867 0.0361 0.0605 0.7276 ... 
3

Vous pouvez envisager d'utiliser rasterToPoints:

library(raster) 
r <- raster() 
values(r) <- 1:ncell(r) 

xyz <- rasterToPoints(r) 

head(xyz) 
      x y layer 
#[1,] -179.5 89.5  1 
#[2,] -178.5 89.5  2 
#[3,] -177.5 89.5  3 
#[4,] -176.5 89.5  4 
#[5,] -175.5 89.5  5 
#[6,] -174.5 89.5  6 

Mais notez que la fonction renvoie uniquement les valeurs des cellules qui ne sont pas NA et que ce rendement une matrice unique; pas une liste. Mais cela peut être plus pratique. Sinon, voir la solution @ Val ...

0

J'ai essayé les suggestions ci-dessus, mais je n'ai pas tout à fait obtenir la réponse voulue. Donc, voici un petit tweak et le test qu'il fonctionne:

library(raster) 
xy <- xyFromCell(dem,1:ncell(dem)) 

lns <- contourLines(x=sort(unique(xy[,1])), y=sort(unique(xy[,2])), z=t(as.matrix(dem))) 

plot(dem) 
for (i in 1:length(lns)) lines(lns[[i]]$x, lns[[i]]$y) 
+0

Bienvenue dans StackOverflow. Les réponses contenant uniquement du code ont tendance à être supprimées car elles sont "de mauvaise qualité". Veuillez lire la section d'aide pour répondre aux questions, puis envisager d'ajouter quelques commentaires à votre réponse. – Graham