2016-12-19 1 views
1

J'ai SpatialPoints objet avec 3 dimensions:Retrait de la troisième dimension dans SpatialPointsDataFrame

x <- c(1,1,1,2,2,2,3,3,3) 
y <- c(1,2,3,1,2,3,1,2,3) 
z <- c(1,3,5,2,1,2,1,2,3) 
xyz <- cbind(x,y,z) 
ss <- SpatialPoints(xyz) 
dimensions(ss) 

et un objet raster:

rr <- raster(matrix(round(runif(49,0,10)),7,7), xmn=0, xmx=4, ymn=0, ymx=4, crs=NA, template=NULL) 

Je veux extraire les valeurs de raster en utilisant l'objet SpatialPoints:

extract(rr,ss) 
#Error in .xyValues(x, coordinates(y), ..., df = df) : 
# xy should have 2 columns only. 
#Found these dimensions: 9, 3 

Vous pouvez visualiser les données si vous nt:

plot(rr) 
plot(ss, add=T) 

Le problème est que la fonction extract du paquet raster nécessite une dimension 2 objet SpatialPoints. Mine (dans mes données réelles) en 3 dimensions. Y a-t-il un moyen de laisser tomber la 3ème dimension de ma forme de point? J'ai essayé:

coordinates(ss) <- coordinates(ss)[,-3] 
#Error in `coordinates<-`(`*tmp*`, value = c(1, 1, 1, 2, 2, 2, 3, 3, 3, : 
# setting coordinates cannot be done on Spatial objects, where they have #already been set 

Je ne veux pas avoir à reconstruire ma forme à partir de zéro.

+0

recherchez-vous ceci: ss @ coords [, 1: 2]? – MLavoie

+0

@MLavois, ce que vous dites me donne la double dimension d'une matrice (qui est la même que ma: 'coordonnées (ss) [, - 3]'), ce n'est pas ce que je veux, je veux un nouvel objet forme mais avec seulement 2 dimensions, pas trois. Garder tout le reste identique (données, projection, etc.) – Bastien

+1

Il suffit d'écraser la fente 'coords':' ss @ coords <- ss @ coords [, 1: 2] ' – rcs

Répondre

1

écraser juste la fente coords de l'objet S4:

[email protected] <- [email protected][, 1:2] 

Je ne sais pas comment votre objet SpatialPoints est créé, mais si vous utilisez rgdal::readOGR il y a un argument pointDropZ (par défaut FALSE)

+0

L'argument 'pointDropZ' est aussi une bonne solution dont je n'étais pas conscient. Je vais utiliser celui-là comme j'utilise 'readOGR'. Merci. – Bastien

0

de réponse est meilleure, mais cela fonctionne aussi bien:

ss <- SpatialPoints(coordinates(ss)[,-3]) 

et si vous avez un SpatialPointsDataFrame:

ss <- SpatialPointsDataFrame(coordinates(ss)[,-3], [email protected],proj4string=CRS(proj4string(ss)))