Comment extraire les valeurs des rasters à l'emplacement des points dans R?

13

Ma question concerne l'extraction des valeurs des rasters à l'emplacement des points. Avec l'extrait de fonction, c'est très facile, et la fonction me donne une trame de données avec les valeurs de toutes les variables dans les points. Je veux avoir dans cette trame de données les coordonnées de chaque point. Comment puis-je y arriver? Est-il possible de dire à R que lors de l'extraction des valeurs du raster, ajoutez également les colonnes du point de localisation.

Voici ma procédure:

presencias=read.table("c:/SDM_R/presencias/P_lentiscus_pres.csv",header=TRUE,sep=";")

lista_variables <-list.files(path="Variables_modelizacion/solo_ascii",pattern='*.asc',full.names=TRUE)
variables <- stack(lista_variables)

variables_presencia<-extract(variables, presencias)

les résultats sont quelque chose comme ceci:

> bio1  bio12  bio18  bio2  bio4 
> 90    875    165    95    4886
> 115   1085   158    83    4075
> 135   1153   153    67    3402
> 85    1026   137    99    5203
> 96    667    128    108   5823
> 98    531    109    113   6305
> 132   450    63     123   6598
> 132   569    104    106   5963
> 95    814    196    98    5571
> 146   474    39     114   6603

Mais je veux deux autres colonnes avec les données de coordonnées (mais il pourrait y avoir d'autres colonnes de ma table de localisation d'extraction csv).

Merci beaucoup.

JMCosta
la source
Désolé, le format des résultats affichés précédemment n'est pas correct.
JMCosta
Doit être de cinq colonnes (bio1, bio12 .... bio4)
JMCosta
Les valeurs ne devraient-elles pas correspondre aux coordonnées de votre presencias?
Roman Luštrik
Les valeurs des variables proviennent des points de présence. Mais je veux aussi les coordonnées des points du tableau. mais je ne sais pas comment faire.
JMCosta
Et quelque chose dans le sens de cbind(coordinates(presencias), variables_presencia)? Vous pouvez ensuite convertir en SPDF à l'aide coordinates(result) <- ~ X + Yet vous pouvez utiliser à nouveau la pléthore de méthodes conçues pour les objets spatiaux.
Roman Luštrik

Réponses:

20

En supposant cela presenciaset variablespartageant la même projection, cela devrait être une tâche facile. Je vous recommande d'ajouter ces lignes de code après votre read.table()instruction afin de convertir presenciasdataframe en un objet SpatialPointsDataFrame (affinez simplement les noms des colonnes contenant les coordonnées x et y si elles diffèrent de mon exemple).

coordinates(presencias) <- c("x", "y")

Pour fournir un exemple reproductible, j'essaie d'ouvrir un peu plus le champ de ma réponse. Tout d'abord, téléchargez et décompressez ce fichier de formes ESRI avec des emplacements plus ou moins importants en Allemagne. Celles-ci serviront de données ponctuelles ultérieurement. Vous aurez également besoin de packages dismo, rgdalet rasterpour ce court exemple, assurez-vous que ces bibliothèques (et toutes leurs dépendances) sont installées sur votre disque dur local.

Commençons par charger les packages requis.

library(dismo)
library(rgdal)
library(raster)

Ensuite, vous devez générer un exemple de RasterLayer. Dans notre cas, nous utiliserons la gmap()fonction du dismopackage afin d'obtenir une carte physique de l'Allemagne.

germany.mrc <- gmap("Germany")

Vous pouvez maintenant importer votre fichier de formes de points via readOGRle rgdalpackage de R. Veillez à ajuster le nom de la source de données (dsn = ...). L'ensemble de la projection est obsolète dans votre cas particulier. Cependant, cela doit être fait dans notre exemple afin de superposer avec succès nos données de point avec le RasterLayer d'Allemagne.

# Import SpatialPointsDataFrame
germany.places <- readOGR(dsn = "/path/to/shapefile", layer = "places")
# Define shapefile's current CRS
projection(germany.places) <- CRS("+proj=lonlat +ellps=WGS84")
# Reproject to RasterLayer's CRS
germany.places.mrc <- spTransform(germany.places, CRS(projection(germany.mrc)))

Pour réduire la taille énorme de nos données ponctuelles, nous allons tirer un échantillon aléatoire de dix sites en Allemagne. Cela devrait suffire à nos fins.

set.seed(35)
germany.places.mrc.sample <- germany.places.mrc[sample(nrow(germany.places.mrc), 10), ]

Maintenant que la préparation est terminée, nous pourrions commencer à extraire les valeurs de ces pixels particuliers dans lesquels se trouvent nos dix points échantillonnés au hasard.

data <- data.frame(coordinates(germany.places.mrc.sample),
                   germany.places.mrc.sample$name, 
                   extract(germany.mrc, germany.places.mrc.sample))
names(data) <- c("x", "y", "name", "value")

Afin de fusionner les coordonnées du point avec les valeurs de pixels extraites, nous avons juste besoin de configurer une trame de données contenant les coordonnées de notre SpatialPointsDataFrame. C'est ça!

data
           x       y          name value
1  1073490.3 6513446 Veitsteinbach   208
2  1269100.8 6156690   Assenhausen   231
3  1336757.5 6246284    Frauenwahl   195
4   828579.9 6634122      Altenhof   189
5  1571418.1 6662558         Wohla   151
6  1192299.4 6864087     Flechtorf   170
7   976270.0 6362050    Hilsenhain   208
8  1117416.4 6092146      Nestbaum   175
9  1274192.0 6344490 Wappeltshofen   236
10  878488.2 6839843        Leeden   208
fdetsch
la source
1

Vous pouvez sûrement simplement faire:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(en supposant que vos données de coordonnées sont dans deux colonnes appelées «x» et «y»)

Jack Harrison
la source
J'ai pensé de cette façon, mais j'avais ces doutes: la trame de données issue de l'extrait a le même ordre que la présence. (la première ligne de la trame de données est la première ligne de la table de présence)
JMCosta
Et une autre chose, s'il n'y avait aucune donnée variable pour aucun point (3 ou 4), le nombre de rangées ne sera pas le même, et l'ordre ne sera pas le même à coup sûr.
JMCosta
@JMCosta: vous vous trompez à ce sujet. Les valeurs NA seraient retournées pour ces points.
Robert Hijmans