Wie werden Werte aus Rastern an der Position von Punkten in R extrahiert?

13

Meine Frage bezieht sich auf das Extrahieren von Werten aus Rastern an der Position von Punkten. Mit der Funktion extrahieren ist dies sehr einfach, und die Funktion gibt mir einen Datenrahmen mit den Werten aller Variablen in den Punkten. Ich möchte in diesem Datenrahmen die Koordinaten jedes Punktes haben. Wie kann ich das erreichen? Kann man R sagen, dass beim Extrahieren der Werte aus dem Raster auch die Spalten des Positionspunkts hinzugefügt werden.

Dies ist meine Vorgehensweise:

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)

Die Ergebnisse sind ungefähr so:

> 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

Ich möchte aber noch zwei Spalten mit den Koordinatendaten (es können aber auch andere Spalten aus meiner CSV-Tabelle zum Extrahieren von Positionen sein).

Vielen Dank.

JMCosta
quelle
Leider ist das Format der zuvor angezeigten Ergebnisse nicht korrekt.
JMCosta
Muss fünf Spalten sein (bio1, bio12 .... bio4)
JMCosta
Sollten die Werte nicht Ihren Koordinaten entsprechen presencias?
Roman Luštrik
Die Werte der Variablen stammen aus den Präsenzpunkten. Aber ich möchte auch die Koordinaten der Punkte in der Tabelle. Aber ich weiß nicht, wie ich es machen soll.
JMCosta
Was ist mit etwas in der Art von cbind(coordinates(presencias), variables_presencia)? Sie können dann mithilfe von in SPDF konvertieren coordinates(result) <- ~ X + Yund wieder die Vielzahl von Methoden verwenden, die für räumliche Objekte entwickelt wurden.
Roman Luštrik

Antworten:

20

Vorausgesetzt, dies presenciasund variablesdieselbe Projektion sollte eine leichte Aufgabe sein. Ich empfehle Ihnen, diese Codezeilen nach Ihrer read.table()Anweisung presenciaseinzufügen , um DataFrame in ein SpatialPointsDataFrame-Objekt zu konvertieren (verfeinern Sie einfach die Namen der Spalten mit den x- und y-Koordinaten, wenn sie von meinem Beispiel abweichen).

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

Um ein reproduzierbares Beispiel zu liefern, versuche ich, den Umfang meiner Antwort ein wenig weiter zu erschließen. Laden Sie zunächst dieses ESRI-Shapefile mit mehr oder weniger wichtigen Speicherorten in Deutschland herunter und entpacken Sie es . Diese dienen später als Punktdaten. Sie werden auch Pakete benötigen dismo, rgdalund rasterfür diese kurze Beispiel, so stellen Sie sicher , dass diese Bibliotheken (und alle ihre Abhängigkeiten) auf der lokalen Festplatte installiert sind.

Beginnen wir mit dem Laden der erforderlichen Pakete.

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

Als Nächstes sollten Sie eine RasterLayer-Beispieldatei generieren. In unserem Fall werden wir die gmap()Funktion aus dem dismoPaket nutzen, um eine physische Deutschlandkarte zu erhalten.

germany.mrc <- gmap("Germany")

Sie können jetzt Ihr Punkt-Shapefile über readOGRaus dem rgdalPaket von R importieren . Stellen Sie sicher, dass Sie den Namen der Datenquelle anpassen (dsn = ...). Das gesamte Projektionsmaterial ist in Ihrem speziellen Fall veraltet. Dies muss jedoch in unserem Beispiel geschehen, um unsere Punktedaten erfolgreich mit dem Germany RasterLayer zu überlagern.

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

Um die Größe unserer Punktedaten zu reduzieren, werden zehn Standorte in Deutschland zufällig ausgewählt. Dies sollte für unsere Zwecke ausreichen.

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

Jetzt, da die Vorbereitungen abgeschlossen sind, können wir gerade damit beginnen, die Werte dieser bestimmten Pixel zu extrahieren, in denen unsere zehn zufällig ausgewählten Punkte liegen.

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

Um die Punktkoordinaten mit den extrahierten Pixelwerten zusammenzuführen, müssen Sie lediglich einen Datenrahmen einrichten, der die Koordinaten unseres SpatialPointsDataFrame enthält. Das ist 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
quelle
1

Sicher können Sie einfach Folgendes tun:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(Vorausgesetzt, Ihre Koordinatendaten befinden sich in zwei Spalten mit den Namen "x" und "y".)

Jack Harrison
quelle
Ich dachte auf diese Weise, aber ich hatte diese Zweifel: Der aus dem Extrakt resultierende Datenrahmen hat dieselbe Reihenfolge wie das Vorhandensein. (Die erste Zeile des Datenrahmens ist die erste Zeile der Anwesenheitstabelle.)
JMCosta,
Und eine andere Sache, wenn es keine variablen Daten für Punkte (3 oder 4) gäbe, würde die Anzahl der Zeilen nicht gleich sein und die Reihenfolge wird mit Sicherheit nicht gleich sein.
JMCosta
@JMCosta: Da liegst du falsch. Für diese Punkte würden NA-Werte zurückgegeben.
Robert Hijmans