R: Wie bekomme ich Breiten- und Längengrade von einer Rasterebene?


14

Ich bin ein absoluter Anfänger in Bezug auf geografische Daten, bitte verzeihen Sie mir, wenn die Frage nicht zutreffend ist.

Ich habe Daten von NCDC NARR heruntergeladen und konnte sie mithilfe des rasterPakets in R laden . Ich möchte eine Liste mit Breitengrad, Längengrad und Wert erhalten. Ich verstehe, dass rasterToPoints()das genau das tun sollte, was ich will, aber meine Breiten- und Längengrade sehen seltsam aus:

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

Ich nehme an, ich sollte etwas mit der Projektion machen, die derzeit Lambert Conformal Conic (LCC) ist. Hier finden Sie weitere Informationen zum 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

Was soll ich tun, um echte US-amerikanische Längen- und Breitengrade zu erhalten?

Antworten:


14

Sie müssen das Raster mithilfe von "projectRaster" oder "spTransform" tatsächlich in eine geografische Projektion (Dezimalgrad) umprojizieren. Schauen Sie sich auch die CRS-Definitionen an, in denen die gewünschte Projektionszeichenfolge angegeben ist. Das Beispiel in der Hilfe zum "projectRaster" macht dies sehr deutlich.

Wenn Sie Ihre Rasterdaten in ein SpatialPointsDataFrame-Objekt konvertieren, verwenden Sie "spTransform", ziehen die Koordinaten aus dem @ Koordinaten-Slot und fügen sie dem data.frame im @ Daten-Slot hinzu. Hier ist ein Beispiel, wie das aussehen würde.

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)

Ich sollte beachten, dass das Konvertieren von Rastern in eine Vektorobjektklasse nicht empfehlenswert ist und die Vorteile des Rasterpakets, das eine speichersichere Verarbeitung bietet, negiert. Es ist oft ratsam, wirklich über Ihr Problem nachzudenken und zu beurteilen, ob Sie es richtig angehen. Wenn das OP den Kontext angegeben hätte, warum [x, y] -Koordinaten für jede Zelle benötigt werden, hätte die Forum-Community möglicherweise Berechnungsalternativen bereitstellen können, die das Problem in einer Rasterumgebung belassen würden.


1
Eine Möglichkeit, Ihre Vorsicht (um eine Datenkonvertierung zu vermeiden) zu wahren, besteht darin, das ursprüngliche Raster zu entfernen (möglicherweise in einem sehr groben Raster), zwei Raster mit Breiten- und Längenwerten zu erstellen, die das Ausmaß der Entprojektion abdecken, und diese wieder in das zu projizieren Umfang des ursprünglichen Rasters. Es werden keine Vektorklassen erstellt: Es handelt sich ausschließlich um eine Reihe von Rasteroperationen.
Whuber

4

Rufen Sie die Koordinaten der Zellzentren ab und erstellen Sie ein räumliches Objekt:

spts <- rasterToPoints(r, spatial = TRUE)

Verwandle die Punkte in dein gewünschtes Ziel:

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

Die Werte sind bereits als Spalten in diesem SpatialPointsDataFrame kopiert.

print(llpts)

Holen Sie sich zum Abschluss einen data.frame:

x <- as.data.frame(llpts)

Das SGAT-Paket enthält eine allgemeine Implementierung, siehe Funktion lonlatFromCellhier:

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


Ich habe es versucht, habe aber die folgende Fehlermeldung erhalten: > 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

Eigentlich müssen Sie die Attribute nicht übertragen, das werde ich entfernen.
Mdsumner

Entspricht dies nicht genau der Antwort / dem Beispiel, die / das ich bereitgestellt habe, mit Ausnahme der SGAT-Paketempfehlung? Die Koordinaten werden nicht an den data.frame im Datenbereich weitergegeben, sondern nur an die Werte aus dem Raster. Koordinaten werden in der Tat in dem Koordinatenschlitz gehalten und müssen dem Datenrahmen hinzugefügt werden.
Jeffrey Evans

Danke, ich habe den Schritt as.data.frame hinzugefügt. Ich halte es für schrecklich, die Koordinaten als Attribute hinzuzufügen - insbesondere durch Mungieren mit Schlitz - da sich die Koordinaten des Objekts ändern können. Wenn Sie einen Rohdatenrahmen möchten, erstellen Sie einfach einen. Es ist mir egal, wo die Informationen sind, vielleicht bearbeiten Sie einfach Ihre und wir können diese Antwort zappen.
mdsumner

Das OP wollte speziell Koordinaten und ich denke, dass es redundant ist, auf einem separaten data.frame zu speichern. Normalerweise mag ich es nicht, dem Datenschlitz hauptsächlich Koordinaten hinzuzufügen, weil es mit dem Koordinatenschlitz redundant ist. Davon abgesehen ist es kein "schrecklicher Rat", dem Datenschlitz Informationen hinzuzufügen. Was ist, wenn Sie zwei Koordinatensysteme haben möchten? Sie können lat / long zum Datenschlitz hinzufügen und das Objekt in einer völlig anderen Projektion haben. Wenn Sie nur eine Flat-Datei und nicht ein GIS-Format per se exportieren möchten, können Sie dem data.frame Koordinaten hinzufügen und als CSV speichern.
Jeffrey Evans

0

Es scheint, dass Sie dort projizierte Koordinaten haben (nicht geografische Breite / Länge, auch bekannt als GCS-Koordinaten). Es war Ihnen wahrscheinlich nicht klar, dass dies das Problem war. Siehe diesen Beitrag. Konvertierung des geografischen Koordinatensystems in R


Ich habe den von Ihnen angegebenen Beitrag nicht abgefangen, bevor ich geantwortet habe. Möglicherweise möchten Sie dies als Duplikat kennzeichnen. Obwohl das Hinzufügen der SpatialPointsDataFrame-Zwangs- und -Koordinatenzuweisung etwas anders macht. Ihr Anruf.
Jeffrey Evans

Ich dachte darüber nach, es als solches zu kennzeichnen, aber ich dachte, wenn eine andere Person nach einer ähnlichen Antwort sucht, ohne zu wissen, dass sie die Werte projizieren muss, könnte dies für sie zutage treten. Außerdem bietet Ihre Antwort einen anderen Weg, um dorthin zu gelangen (Upvoted).
jbchurchill

Ich habe versucht, mir die Quellen anzusehen, die Sie aufgelistet haben. Um Standard-Breiten- / Längengrade zu erhalten, habe ich ausgegeben lonlat_r <- projectRaster(r, crs="+init=epsg:4326"). Das Ausmaß des neuen Rasters ist -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)jedoch weit von dem entfernt, was ich von den USA erwarten würde (das sollte irgendwo zwischen 30 und 70 und -60 bis -160 liegen). Ich hätte etwas falsch verstehen sollen.
Janosdivenyi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.