¿Cómo extraer valores de rásteres en la ubicación de puntos en R?

13

Mi pregunta es sobre la extracción de valores de rásteres en la ubicación de los puntos. Con la función de extracción, esto es muy fácil, y la función me da un marco de datos con los valores de todas las variables en los puntos. Quiero tener en ese marco de datos las coordenadas de cada punto. ¿Cómo puedo hacer que eso suceda? ¿Es posible decirle a R que al extraer los valores del ráster también se agregan las columnas del punto de ubicación?

Este es mi procedimiento:

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)

los resultados son algo como estos:

> 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

Pero quiero dos columnas más con los datos de coordenadas (pero podrían ser otras columnas de mi tabla de ubicación de extracción de csv).

Muchas gracias.

JMCosta
fuente
Lo sentimos, el formato de los resultados mostrados anteriormente no es correcto.
JMCosta
Debe tener cinco columnas (bio1, bio12 .... bio4)
JMCosta
¿No deberían los valores corresponder a las coordenadas de su presencias?
Roman Luštrik
Los valores de las variables son de los puntos de prensencia. Pero también quiero las coordenadas de los puntos en la tabla. Pero no sé cómo hacerlo.
JMCosta
¿Qué pasa con algo en la línea de cbind(coordinates(presencias), variables_presencia)? Luego puede convertir a SPDF usando coordinates(result) <- ~ X + Yy puede usar la gran cantidad de métodos diseñados para objetos espaciales nuevamente.
Roman Luštrik

Respuestas:

20

Asumiendo eso presenciasy variablescompartiendo la misma proyección, esta debería ser una tarea fácil. Le recomiendo que agregue estas líneas de código después de su read.table()declaración para convertir el presenciasmarco de datos en un objeto SpatialPointsDataFrame (solo refine los nombres de las columnas que contienen las coordenadas xey si difieren de mi ejemplo).

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

Para proporcionar un ejemplo reproducible, trato de abrir un poco más el alcance de mi respuesta. En primer lugar, descargue y descomprima este archivo de forma ESRI con ubicaciones más o menos importantes en Alemania. Estos servirán como datos puntuales más adelante. También necesitará paquetes dismo, rgdaly rasterpara este breve ejemplo, asegúrese de que estas bibliotecas (y todas sus dependencias) estén instaladas en su disco duro local.

Comencemos cargando los paquetes requeridos.

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

A continuación, debe generar una muestra RasterLayer. En nuestro caso, haremos uso de la gmap()función del dismopaquete para obtener un mapa físico de Alemania.

germany.mrc <- gmap("Germany")

Ahora puede importar su archivo de forma de puntos a través readOGRdel rgdalpaquete de R. Asegúrese de ajustar el nombre de la fuente de datos (dsn = ...). Todo el material de proyección es obsoleto en su caso particular. Sin embargo, debe hacerse en nuestro ejemplo para superponer con éxito nuestros datos de puntos con el RasterLayer de Alemania.

# 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)))

Para reducir el enorme tamaño de nuestros datos de puntos, extraeremos una muestra aleatoria de diez ubicaciones en Alemania. Esto debería ser suficiente para nuestros propósitos.

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

Ahora que el material de preparación ha finalizado, podríamos comenzar a extraer los valores de esos píxeles particulares en los que se encuentran nuestros diez puntos muestreados al azar.

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")

Para fusionar las coordenadas del punto con los valores de píxeles extraídos, solo necesitamos configurar un marco de datos que contenga las coordenadas de nuestro SpatialPointsDataFrame. ¡Eso es!

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
fuente
1

Seguramente puedes hacer:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(suponiendo que sus datos de coordenadas estén en dos columnas llamadas 'x' e 'y')

Jack Harrison
fuente
Pensé de esa manera, pero tenía estas dudas: el marco de datos resultante del extracto tiene el mismo orden que la presencia. (la primera fila del marco de datos es la primera fila de la tabla de presencia)
JMCosta
Y otra cosa, si no hubiera datos variables para ningún punto (3 o 4), el número de filas no será el mismo y el orden no será el mismo con seguridad.
JMCosta
@ JMCosta: estás equivocado sobre eso. Los valores de NA serían devueltos para esos puntos.
Robert Hijmans