Menggunakan R untuk mengekstrak data dari WorldClim? [Tutup]


9

Saya memiliki satu set data dengan 1000 lintang-bujur yang berbeda. Saya ingin mengekstraksi suhu tahunan rata-rata dan curah hujan tahunan untuk masing-masing koordinat ini. Data ini dapat dengan mudah diperoleh dari WorldClim dan diproses menggunakan DIVA-GIS.

Apakah ada cara untuk melakukan ini pada R?

Saya ingin hasil akhir saya menjadi kerangka data dengan suhu dan curah hujan tahunan untuk setiap koordinat. Saya baru di GIS di R, jadi saya mencari potongan kode dasar bersama dengan perpustakaan yang diperlukan untuk output ini.

Jawaban:


17

Anda dapat menggunakan rasterpaket untuk mengunduh data WorldClim, melihat ?getdatauntuk mengetahui tentang resolusi, variabel, dan koordinat.

Sebagai contoh:

library(raster)
library(sp)

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

Bio 1 dan Bio12 adalah suhu rata-rata tahunan dan curah hujan tahunan:

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

Saya membuat titik acak sebagai contoh, dalam kasus Anda gunakan koordinat untuk membuat SpatialPointobjek.

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

Akhirnya, gunakan extract. Dengan cbind.data.framedan coordinatesAnda akan mendapatkan data.frame keinginan.

values <- extract(r,points)

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

Saya menggunakan poin acak, jadi saya mendapat banyak NA. Itu yang diharapkan.

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)

masukkan deskripsi gambar di sini

Jangan lupa bahwa data WorldClim memiliki faktor skala 10, jadi Temp = -37-3.7 ºC.


Dengan koordinat contoh:

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

Itu sangat membantu!
Ash

Jadi, saya punya pointsyang merupakan kerangka data lats dan long dari set data saya. Lalu saya menjalankan persis seperti yang Anda lakukan. Namun, ketika saya menjalankan valuessaya mendapatkan error: not compatible with requested type. Saya juga memperhatikan bahwa Anda pointshanya menandai sejauh mana sampel, tetapi tidak menghasilkan vektor dengan koordinat lat-panjang
Ash

Ya, derajat desimal. Karena CRS dari WorldClim adalah WGS 84 lat / lon (EPSG 4326). Anda dapat mengimpor koordinat dalam CRS yang berbeda dan mengonversinya dengan spTransform. Jika Anda memiliki koordinat dalam DDMMSS, ubah itu menjadi DD.MMM. Kedua, Anda menulis tentang koordinat yang berbeda, jadi saya menafsirkannya sebagai poin, Anda dapat menggunakan poligon dengan skema yang sama. Jika Anda memiliki lapisan dengan informasi ini, gunakan shapefileuntuk memuatnya.
aldo_tapia

Saya tidak mendapatkan poin kedua Anda. Mungkin, saya tidak menjelaskan dengan jelas. Saya telah menandai kesalahan di sini: eval.in/733232
Ash

Ah, baiklah. spsamplemembutuhkan objek spasial untuk menetapkan batas sampel. Input adalah kisi, poligon, atau garis. Apa yang saya lakukan adalah menggunakan kotak batas WorlClim untuk mengatur luas sampel. Saya melakukannya untuk membuat contoh yang dapat direproduksi dalam jawaban saya. Dalam kasus Anda, Anda tidak perlu menggunakan spsample, Anda sudah koordinat ke sampel.
aldo_tapia
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.