Używasz R do wyodrębnienia danych z WorldClim? [Zamknięte]

9

Mam zestaw danych zawierający 1000 różnych szerokości i długości geograficznych. Chcę wyliczyć średnią roczną temperaturę i roczne opady dla każdej z tych współrzędnych. Dane te można łatwo uzyskać z WorldClim i przetwarzać za pomocą DIVA-GIS.

Czy można to zrobić na R?

Chcę, aby mój końcowy wynik był ramką danych z roczną temperaturą i opadami dla każdej współrzędnej. Jestem nowy w GIS w R, więc szukam podstawowego fragmentu kodu wraz z wymaganymi bibliotekami dla tego wyjścia.

Popiół
źródło

Odpowiedzi:

17

Możesz użyć rasterpakietu do pobrania danych WorldClim, dowiedzieć ?getdatasię o rozdzielczości, zmiennych i współrzędnych.

Jako przykład:

library(raster)
library(sp)

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

Bio 1 i Bio12 to średnia roczna temperatura i roczne opady:

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

Jako przykład tworzę losowe punkty, w twoim przypadku użyj współrzędnych, aby utworzyć SpatialPointobiekt.

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

Wreszcie użyj extract. Z cbind.data.framea coordinatesdostaniesz data.frame pragnienie.

values <- extract(r,points)

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

Użyłem losowych punktów, więc mam ich dużo NA. Należy się tego spodziewać.

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)

wprowadź opis zdjęcia tutaj

Nie zapominaj, że dane WorldClim mają współczynnik skali 10, a więc Temp = -37-3,7 ºC.


Przykładem współrzędnych:

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
źródło
To było naprawdę pomocne!
Ash
Mam więc, pointsktóra jest ramką danych łat i długości mojego zestawu danych. Potem biegnę dokładnie tak jak ty. Jednak gdy uruchamiam valuespojawia się błąd: not compatible with requested type. Zauważyłem również, że pointspo prostu zaznaczasz zasięg próbki, ale nie tworzysz wektora o współrzędnych długości
Ash
Tak, stopnie dziesiętne. Ponieważ CRS z WorldClim to WGS 84 lat / lon (EPSG 4326). Możesz zaimportować współrzędne w innym CRS i przekonwertować je spTransform. Jeśli masz współrzędne w DDMMSS, przekształć je w DD.MMM. Po drugie, pisałeś o różnych współrzędnych, więc interpretuję to jako punkty, zamiast tego możesz używać wielokątów z tym samym schematem. Jeśli masz warstwę z tymi informacjami, użyj, shapefileaby ją załadować.
aldo_tapia
Nie rozumiem twojego drugiego punktu. Być może nie wyjaśniłem jasno. Oznacziłem
Ash
Ach, okej spsamplewymaga obiektu przestrzennego do ustawienia granic próbki. Dane wejściowe to siatki, wielokąty lub linie. To, co zrobiłem, to użyć ramki granicznej WorlClim do ustawienia zakresu próbki. Zrobiłem to, aby dać powtarzalny przykład w mojej odpowiedzi. W twoim przypadku nie musisz używać spsample, masz już współrzędne do próbkowania.
aldo_tapia