R: Come ottenere latitudini e longitudini da un RasterLayer?


14

Sono un principiante assoluto di dati geografici, quindi per favore, perdonami se la domanda non è appropriata.

Ho scaricato i dati da NCDC NARR e sono riuscito a caricarli in R usando il rasterpacchetto. Vorrei ottenere un elenco con latitudine, longitudine e valore. Capisco che rasterToPoints()dovrebbe fare esattamente quello che voglio, tuttavia, i miei valori di latitudine e longitudine sembrano strani:

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

Suppongo che dovrei fare qualcosa con la proiezione che è attualmente Lambert Conformal Conic (LCC). Ecco ulteriori informazioni sul raster.

> 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

Cosa devo fare per ottenere valori reali di latitudine e longitudine negli Stati Uniti?

Risposte:


14

devi riproiettare il raster in una proiezione geografica (gradi decimali) usando "projectRaster" o "spTransform". Guarda anche le definizioni di CRS sp che specificano la stringa di proiezione desiderata. L'esempio nella guida di "projectRaster" è abbastanza chiaro su come farlo.

Se si forzano i dati raster in un oggetto SpatialPointsDataFrame, utilizzare "spTransform", estrarre le coordinate dallo slot @coordinates e aggiungerle a data.frame nello slot @data. Ecco un esempio di come sarebbe.

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)

Dovrei notare che non è buona pratica convertire i raster in una classe di oggetti vettoriali e negare i vantaggi del pacchetto raster che fornisce elaborazione sicura della memoria. Spesso è prudente pensare davvero al tuo problema e valutare se lo stai affrontando correttamente. Se l'OP avesse fornito un contesto sul perché avessero bisogno di coordinate [x, y] per ogni cella, la comunità del forum potrebbe essere stata in grado di fornire alternative computazionali che avrebbero mantenuto il problema in un ambiente raster.


1
Un modo per attirare l'attenzione (sull'evitare la conversione dei dati) a cuore è di non proiettare il raster originale (forse su una griglia molto grossolana), creare due griglie di valori di latitudine e longitudine che coprano l'estensione della non proiezione e proiettarle nel estensione della griglia originale. Non vengono create classi vettoriali: è interamente un insieme di operazioni raster.
whuber

4

Ottieni le coordinate dei centri cellulari e crea un oggetto spaziale:

spts <- rasterToPoints(r, spatial = TRUE)

Trasforma i punti nel bersaglio desiderato:

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

I valori sono già copiati come colonne su questo SpatialPointsDataFrame.

print(llpts)

Ora per finire, ottieni un data.frame:

x <- as.data.frame(llpts)

C'è un'implementazione generale di questo nel pacchetto SGAT, vedi la funzione lonlatFromCellqui:

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


Ho provato questo, ma ho ricevuto il seguente messaggio di errore: > llpts$layer1 <- values(r[[1]]) Error in [[<-. Data.frame (* tmp *, name, value = c(NA, NA, NA, NA, NA, : replacement has 96673 rows, data has 95025
janosdivenyi

In realtà non è necessario trasferire gli attributi, lo rimuoverò.
mdsumner,

Oltre alla consulenza sul pacchetto SGAT, questa non è esattamente la stessa risposta / esempio che ho fornito? Le coordinate non vengono propagate a data.frame nello slot dati, ma solo ai valori dal raster. Le coordinate, infatti, si trovano nello slot delle coordinate e devono essere aggiunte a data.frame.
Jeffrey Evans,

Grazie, ho aggiunto il passaggio as.data.frame. Penso che sia un consiglio terribile aggiungere le coordinate come attributi, specialmente mescolando con lo slot, poiché le coordinate dell'oggetto possono cambiare. Se vuoi un data.frame non elaborato, creane uno. Non mi importa dove siano le informazioni, forse basta modificare le tue e possiamo zappare questa risposta.
mdsumner,

L'OP voleva specificamente le coordinate e penso che sia ridondante salvare in un data.frame separato. Normalmente non mi piace aggiungere coordinate allo slot dati principalmente, perché è ridondante con lo slot coordinate. Oltre a questo, non è un "consiglio terribile" aggiungere informazioni allo slot di dati. Che cosa succede se si desidera avere due sistemi di coordinate. È possibile aggiungere lat / long allo slot dati e disporre l'oggetto in una proiezione completamente diversa. Inoltre, se desideri esportare solo un file flat e non un formato GIS in sé, puoi aggiungere coordinate a data.frame e salvarlo come CSV.
Jeffrey Evans,

0

Sembra che ci siano Coordinate proiettate lì (non Latitudine / Longitudine aka Coordinate GCS). Probabilmente non ti era chiaro che quello era il problema. Vedi questo post. Conversione del sistema di coordinate geografiche in R


Non ho ricevuto il post a cui hai fatto riferimento prima di rispondere. Potresti voler contrassegnare questo come duplicato. Sebbene l'aggiunta della coercizione SpatialPointsDataFrame e l'assegnazione delle coordinate rendano se un po 'diverso. La tua chiamata.
Jeffrey Evans,

Ho pensato di contrassegnarlo come tale, ma ho pensato che se un'altra persona è alla ricerca di una risposta simile non sapendo che hanno bisogno di proiettare i valori, questo potrebbe rivelarsi per loro. Inoltre la tua risposta offre un modo diverso per arrivarci (potenziato).
jbchurchill,

Ho provato a guardare le fonti che hai elencato. Al fine di ottenere latitudini / longitudini standard che ho emesso lonlat_r <- projectRaster(r, crs="+init=epsg:4326"). Tuttavia, l'estensione del nuovo raster è -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)ben lontana da ciò che mi aspetterei dagli Stati Uniti (che dovrebbe essere compreso tra 30 e 70 e tra -60 e -160). Avrei dovuto fraintendere qualcosa.
Janosdivenyi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.