Verwenden Sie R, um Daten aus WorldClim zu extrahieren? [geschlossen]

9

Ich habe einen Datensatz mit 1000 verschiedenen Breiten- und Längengraden. Ich möchte für jede dieser Koordinaten die durchschnittliche Jahrestemperatur und den Jahresniederschlag ermitteln. Diese Daten können problemlos von WorldClim abgerufen und mit DIVA-GIS verarbeitet werden.

Gibt es überhaupt eine Möglichkeit, dies auf R zu tun?

Ich möchte, dass meine endgültige Ausgabe ein Datenrahmen mit der jährlichen Temperatur und dem Niederschlag für jede Koordinate ist. Ich bin neu bei GIS in R, daher suche ich einen grundlegenden Codeblock zusammen mit den erforderlichen Bibliotheken für diese Ausgabe.

Asche
quelle

Antworten:

16

Sie können das rasterPaket verwenden, um WorldClim-Daten herunterzuladen und Informationen ?getdatazu Auflösung, Variablen und Koordinaten zu erhalten.

Zum Beispiel:

library(raster)
library(sp)

r <- getData("worldclim",var="bio",res=10)

Bio 1 und Bio12 sind mittlere Jahrestemperatur und jährliche Niederschlagsmenge:

r <- r[[c(1,12)]]
names(r) <- c("Temp","Prec")

Ich erstelle zufällige Punkte als Beispiel, in Ihrem Fall verwenden Sie Koordinaten, um ein SpatialPointObjekt zu erstellen .

points <- spsample(as(r@extent, 'SpatialPolygons'),n=100, type="random")    

Schließlich verwenden extract. Mit cbind.data.frameund erhalten coordinatesSie den Wunsch data.frame.

values <- extract(r,points)

df <- cbind.data.frame(coordinates(points),values)

Ich habe zufällige Punkte verwendet, also habe ich viele bekommen NA. Es ist zu erwarten.

head(df)
           x          y Temp Prec
1  112.95985  52.092650  -37  388
2  163.54612  85.281643   NA   NA
3   30.95257   5.932434  270  950
4   64.66979  40.912583  150  150
5 -169.40479 -58.889104   NA   NA
6   51.46045  54.813600   36  549

plot(r[[1]])
plot(points,add=T)

Geben Sie hier die Bildbeschreibung ein

Vergessen Sie nicht, dass WorldClim-Daten einen Skalierungsfaktor von 10 haben, also Temp = -37-3,7 ºC.


Mit Koordinaten Beispiel:

library(raster)
library(sp)

r <- getData("worldclim",var="bio",res=10)

r <- r[[c(1,12)]]
names(r) <- c("Temp","Prec")

lats <- c(9.093028 , 9.396111, 9.161417)
lons <- c(-11.7235, -11.72975, -11.709417) 

coords <- data.frame(x=lons,y=lats)

points <- SpatialPoints(coords, proj4string = r@crs)

values <- extract(r,points)

df <- cbind.data.frame(coordinates(points),values)

df
          x        y Temp Prec
1 -11.72350 9.093028  257 2752
2 -11.72975 9.396111  257 2377
3 -11.70942 9.161417  257 2752
aldo_tapia
quelle
Das war sehr hilfreich!
Ash
Ich habe pointsalso einen Datenrahmen aus Lats und Longs meines Datensatzes. Dann renne ich genau so, wie du es getan hast. Beim Ausführen wird valuesjedoch eine Fehlermeldung angezeigt : not compatible with requested type. Mir ist auch aufgefallen, dass Sie pointsnur die Ausdehnung der Stichprobe markieren, aber keinen Vektor mit lat-langen Koordinaten erzeugen
Ash
Ja, Dezimalstellen. Weil CRS von WorldClim WGS 84 lat / lon (EPSG 4326) ist. Sie können Koordinaten in ein anderes CRS importieren und mit konvertieren spTransform. Wenn Sie Koordinaten in DDMMSS haben, transformieren Sie diese in DD.MMM. Zweitens haben Sie über verschiedene Koordinaten geschrieben, also interpretiere ich es als Punkte. Sie können stattdessen Polygone mit demselben Schema verwenden. Wenn Sie eine Ebene mit diesen Informationen haben, shapefileladen Sie sie.
Aldo_Tapia
Ich verstehe deinen zweiten Punkt nicht. Vielleicht habe ich nicht klar erklärt. Ich habe den Fehler hier markiert: eval.in/733232
Ash
Ah, ok. spsampleerfordert ein räumliches Objekt, um Stichprobengrenzen festzulegen. Eingaben sind Gitter, Polygone oder Linien. Ich habe die WorlClim-Begrenzungsbox verwendet, um die Probenausdehnung festzulegen. Ich habe es getan, um in meiner Antwort ein reproduzierbares Beispiel zu geben. In Ihrem Fall müssen Sie nicht verwenden spsample, Sie haben bereits Koordinaten zum Abtasten.
Aldo_Tapia