19 votos

R: ¿Cómo obtener latitudes y longitudes de un RasterLayer?

Soy un principiante absoluto de los datos geográficos, así que por favor, perdóneme si la pregunta no es apropiada.

He descargado los datos del NCDC NARR y he conseguido cargarlos en R utilizando el programa raster paquete. Me gustaría obtener una lista con latitud, longitud y valor. Tengo entendido que rasterToPoints() debería hacer exactamente lo que quiero, sin embargo, mis valores de latitud y longitud tienen un aspecto extraño:

r <- raster(myfile)
data_matrix <- rasterToPoints(r)
head(data_matrix)
            x       y value
[1,] -5405401 4347242    70
[2,] -5372938 4347242    88
[3,] -5340475 4347242    76
[4,] -5308012 4347242    85
[5,] -5275549 4347242    87
[6,] -5243086 4347242    88

Supongo que debería hacer algo con la proyección, que actualmente es Lambert Conformal Conic (LCC). Aquí hay más información sobre la trama.

> r
class       : RasterLayer 
dimensions  : 277, 349, 96673  (nrow, ncol, ncell)
resolution  : 32463, 32463  (x, y)
extent      : -5648874, 5680713, -4628777, 4363474  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=lcc +lat_1=50 +lat_2=50 +lat_0=50 +lon_0=-107 +x_0=0 +y_0=0 +a=6371200 +b=6371200 +units=m +no_defs 
data source : mypath-to-file
names       : value

¿Qué debo hacer para obtener los valores reales de latitud y longitud de EE.UU.?

17voto

Dan Puntos 16

Necesita reproyectar la trama en una proyección geográfica (grados decimales) utilizando "projectRaster" o "spTransform". Consulte también las definiciones CRS sp que especifican la cadena de proyección deseada. El ejemplo en la ayuda para el "projectRaster" es bastante claro en cómo hacer esto.

Si coacciona sus datos ráster en un objeto SpatialPointsDataFrame entonces usaría "spTransform" y extraería las coordenadas de la ranura @coordinates y las añadiría al data.frame en la ranura @data. A continuación se muestra un ejemplo.

library(raster)
library(rgdal) # for spTransform

# Create data
r <- raster(ncols=100, nrows=100)
  r[] <- runif(ncell(r))
  crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"
  projection(r)

# Convert raster to SpatialPointsDataFrame
r.pts <- rasterToPoints(r, spatial=TRUE)
  proj4string(r.pts)

# reproject sp object
geo.prj <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
r.pts <- spTransform(r.pts, CRS(geo.prj)) 
  proj4string(r.pts)

# Assign coordinates to @data slot, display first 6 rows of data.frame
r.pts@data <- data.frame(r.pts@data, long=coordinates(r.pts)[,1],
                         lat=coordinates(r.pts)[,2])                         
head(r.pts@data)

Debo señalar que no es una buena práctica convertir rásters a una clase de objeto vectorial y anula las ventajas del paquete raster que proporciona un procesamiento seguro en memoria. A menudo es prudente pensar realmente en tu problema y evaluar si lo estás enfocando correctamente. Si el OP hubiera proporcionado el contexto de por qué necesitan coordenadas [x,y] para cada celda, la comunidad del foro podría haber sido capaz de proporcionar alternativas computacionales que mantendrían el problema en un entorno raster.

5voto

sgwill Puntos 2444

Obtener las coordenadas de los centros de las celdas y crear un objeto Spatial:

spts <- rasterToPoints(r, spatial = TRUE)

Transforma los puntos en el objetivo deseado:

library(rgdal)
llprj <-  "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
llpts <- spTransform(spts, CRS(llprj))

Los valores ya están copiados como columnas en este SpatialPointsDataFrame.

print(llpts)

Ahora para terminar, obtén un data.frame:

x <- as.data.frame(llpts)

Existe una implementación general de esto en el paquete SGAT, véase la función lonlatFromCell aquí:

https://github.com/SWotherspoon/SGAT/blob/master/R/Raster.R

1voto

Abtin Forouzandeh Puntos 449
    library(raster)
r<-pt$cpc.pr[[1]] #my raster taken from a first layer of a stack
    rlon<-rlat<-r #copy r to rlon and rlat rasters [1]][1]which will contain the longitude and latitude
    xy<-xyFromCell(r,1:length(r)) #matrix of logitudes (x) and latitudes(y)
    rlon[]<-xy[,1] #raster of longitudes
    rlat[]<-xy[,2] #raster of latitides
    par(mfrow=c(1,2))
    image(rlon,main="longitudes")
    image(rlat,main="latitudes")

RThe result is shown in the image

0voto

jbchurchill Puntos 1637

Parece que tiene coordenadas proyectadas (no latitud/longitud, también conocidas como coordenadas GCS). Probablemente no estaba claro para usted que ese era el problema. Vea este post. Conversión del sistema de coordenadas geográficas en R

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X