ใช้ R เพื่อดึงข้อมูลจาก WorldClim? [ปิด]


9

ฉันมีชุดข้อมูลที่มีค่าละติจูด - ลองจิจูดยาว 1,000 ค่า ฉันต้องการแยกอุณหภูมิเฉลี่ยรายปีและปริมาณน้ำฝนประจำปีสำหรับแต่ละพิกัดเหล่านี้ ข้อมูลเหล่านี้สามารถรับได้จากWorldClimและประมวลผลโดยใช้ DIVA-GIS

อย่างไรก็ตามมีการทำเช่นนี้ใน R?

ฉันต้องการให้ผลลัพธ์สุดท้ายของฉันเป็น dataframe ที่มีอุณหภูมิรายปีและปริมาณน้ำฝนสำหรับแต่ละพิกัด ฉันใหม่ที่ GIS ใน R ดังนั้นฉันจึงค้นหาโค้ดพื้นฐานพร้อมกับไลบรารีที่จำเป็นสำหรับผลลัพธ์นี้

คำตอบ:


17

คุณสามารถใช้rasterแพ็คเกจเพื่อดาวน์โหลดข้อมูล WorldClim ดูความ?getdataรู้เกี่ยวกับความละเอียดตัวแปรและพิกัด

ตัวอย่างเช่น

library(raster)
library(sp)

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

Bio 1 และ Bio12หมายถึงอุณหภูมิประจำปีและการตกตะกอนเป็นประจำ:

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

ฉันสร้างจุดสุ่มเป็นตัวอย่างในกรณีของคุณใช้พิกัดเพื่อสร้างSpatialPointวัตถุ

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

extractในที่สุดการใช้งาน ด้วยcbind.data.frameและcoordinatesคุณจะได้รับ data.frame ปรารถนา

values <- extract(r,points)

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

NAผมใช้จุดสุ่มดังนั้นฉันได้เป็นจำนวนมาก มันเป็นที่คาดหวัง

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)

ป้อนคำอธิบายรูปภาพที่นี่

อย่าลืมว่าข้อมูล WorldClim มีค่าสเกล 10 ซึ่งTemp = -37ก็คือ -3.7 ºC


ด้วยตัวอย่างพิกัด:

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

นั่นเป็นประโยชน์จริงๆ!
Ash

ดังนั้นฉันมีpointsซึ่งเป็น dataframe ของ lats และ longs ชุดข้อมูลของฉัน จากนั้นฉันก็วิ่งไปตามที่คุณต้องการ อย่างไรก็ตามเมื่อฉันเรียกใช้valuesฉันได้รับข้อผิดพลาด: not compatible with requested type. ฉันยังสังเกตเห็นว่าคุณpointsเพิ่งทำเครื่องหมายขอบเขตของตัวอย่าง แต่ไม่ได้สร้างเวกเตอร์ที่มีพิกัดละติจูด - ลองจิจูด
Ash

ใช่องศาทศนิยม เนื่องจาก CRS ของ WorldClim คือ WGS 84 lat / lon (EPSG 4326) คุณสามารถนำเข้าพิกัดใน CRS spTransformที่แตกต่างกันและการแปลงด้วย หากคุณมีพิกัดใน DDMMSS ให้แปลงเป็น DD.MMM ประการที่สองคุณเขียนเกี่ยวกับพิกัดต่าง ๆ ดังนั้นฉันจึงตีความว่าเป็นจุดคุณสามารถใช้รูปหลายเหลี่ยมแทนด้วยสคีเดียวกัน หากคุณมีเลเยอร์ที่มีข้อมูลนี้ใช้shapefileในการโหลด
aldo_tapia

ฉันไม่ได้รับจุดที่สองของคุณ บางทีฉันไม่ได้อธิบายอย่างชัดเจน ฉันได้ทำเครื่องหมายข้อผิดพลาดที่นี่: eval.in/733232
Ash

อาโอเค. spsampleต้องใช้วัตถุอวกาศเพื่อกำหนดขอบเขตตัวอย่าง อินพุตเป็นกริดรูปหลายเหลี่ยมหรือเส้น สิ่งที่ฉันทำคือการใช้กล่องขอบเขต WorlClim เพื่อกำหนดขอบเขตตัวอย่าง ฉันทำมันเพื่อเป็นตัวอย่างที่ทำซ้ำได้ในคำตอบของฉัน ในกรณีของคุณคุณไม่จำเป็นต้องใช้spsampleคุณได้ประสานงานกับตัวอย่างแล้ว
aldo_tapia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.