วิธีการดึงค่าจากแรสเตอร์ที่ตำแหน่งของจุดใน R?


13

คำถามของฉันเกี่ยวกับการแยกค่าจาก rasters ที่ตำแหน่งของจุด ด้วยฟังก์ชั่นการแยกมันง่ายมากและฟังก์ชั่นให้ฉันดาต้าเฟรมที่มีค่าของตัวแปรทั้งหมดในจุด ฉันต้องการที่จะมีใน dataframe พิกัดของแต่ละจุด ฉันจะทำให้เกิดขึ้นได้อย่างไร เป็นไปได้ไหมที่จะบอกกับ R ว่าเมื่อทำการแยกค่าจากแรสเตอร์จะเพิ่มคอลัมน์ของตำแหน่งที่ตั้ง

นี่คือขั้นตอนของฉัน:

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)

ผลลัพธ์เป็นดังนี้:

> 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

แต่ฉันต้องการคอลัมน์อีกสองคอลัมน์ที่มีข้อมูลพิกัด (แต่อาจเป็นคอลัมน์อื่นจาก csv ของฉันที่แยกตารางตำแหน่ง)

ขอบคุณมาก.


ขออภัยรูปแบบของผลลัพธ์ที่แสดงก่อนหน้านี้ไม่ถูกต้อง
JMCosta

ต้องเป็นห้าคอลัมน์ (bio1, bio12 .... bio4)
JMCosta

ค่าควรไม่สอดคล้องกับพิกัดของคุณpresenciasหรือไม่
Roman Luštrik

ค่าของตัวแปรนั้นมาจากจุดเริ่มต้น แต่ฉันต้องการ coordintates ของจุดในตารางด้วย แต่ฉันไม่รู้วิธีการทำ
JMCosta

สิ่งที่เกี่ยวกับบางสิ่งบางอย่างตามแนวของcbind(coordinates(presencias), variables_presencia)? จากนั้นคุณสามารถแปลงเป็น SPDF โดยใช้coordinates(result) <- ~ X + Yและคุณสามารถใช้วิธีการมากมายที่ออกแบบมาสำหรับวัตถุอวกาศอีกครั้ง
Roman Luštrik

คำตอบ:


20

สมมติว่าpresenciasและvariablesแชร์โปรเจคแบบเดียวกันนี่น่าจะเป็นเรื่องง่าย ฉันขอแนะนำให้คุณเพิ่มบรรทัดของรหัสเหล่านี้หลังread.table()คำสั่งของคุณเพื่อแปลงpresenciasdataframe เป็นวัตถุ SpatialPointsDataFrame (เพียงปรับแต่งชื่อของคอลัมน์ที่มีพิกัด x และ y หากพวกเขาแตกต่างจากตัวอย่างของฉัน)

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

เพื่อให้เป็นตัวอย่างที่ทำซ้ำได้ฉันพยายามเปิดขอบเขตคำตอบของฉันให้มากขึ้น ก่อนอื่นดาวน์โหลดและคลายซิปไฟล์รูปร่าง ESRI นี้ด้วยตำแหน่งที่สำคัญมากขึ้นหรือน้อยลงในเยอรมนี สิ่งเหล่านี้จะทำหน้าที่เป็นข้อมูลจุดในภายหลัง นอกจากนี้คุณยังจะต้องแพคเกจdismo, rgdalและrasterตัวอย่างสั้น ๆ นี้เพื่อให้แน่ใจว่าห้องสมุดเหล่านี้ (และการอ้างอิงของพวกเขาทั้งหมด) ที่ติดตั้งบนฮาร์ดไดรฟ์ในประเทศของคุณ

เริ่มจากการโหลดแพ็คเกจที่ต้องการ

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

ถัดไปคุณควรสร้างตัวอย่าง RasterLayer ในกรณีของเราเราจะใช้ประโยชน์จากgmap()ฟังก์ชั่นจากdismoแพคเกจเพื่อให้ได้แผนที่ทางกายภาพของเยอรมนี

germany.mrc <- gmap("Germany")

ตอนนี้คุณสามารถนำเข้าไฟล์รูปร่างจุดผ่านreadOGRจากrgdalแพ็คเกจของ R ตรวจสอบให้แน่ใจว่าได้ปรับชื่อแหล่งข้อมูล (dsn = ... ) สิ่งที่ฉายทั้งหมดล้าสมัยในกรณีของคุณโดยเฉพาะ อย่างไรก็ตามจะต้องทำในตัวอย่างของเราเพื่อที่จะซ้อนทับข้อมูลจุดของเรากับ Germany RasterLayer

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

เพื่อลดข้อมูลจุดขนาดใหญ่ของเราเราจะสุ่มตัวอย่างสถานที่สิบแห่งในเยอรมนี สิ่งนี้น่าจะเพียงพอสำหรับวัตถุประสงค์ของเรา

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

ตอนนี้การเตรียมการเสร็จสิ้นแล้วเราสามารถเริ่มดึงค่าของพิกเซลเหล่านั้นโดยเฉพาะจุดสิบตัวอย่างที่เราสุ่มเก็บอยู่ภายใน

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

ในการผสานพิกัดจุดเข้ากับค่าพิกเซลที่แยกเราเพียงแค่ต้องตั้งค่าดาต้าเฟรมที่มีพิกัดของ SpatialPointsDataFrame ของเรา แค่นั้นแหละ!

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

1

แน่นอนคุณสามารถทำได้:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(สมมติว่าข้อมูลพิกัดของคุณอยู่ในสองคอลัมน์เรียกว่า 'x' และ 'y')


ฉันคิดอย่างนั้น แต่ฉันมีข้อสงสัยเหล่านี้: dataframe ที่เกิดจากสารสกัดมีลำดับเดียวกันกับที่ปรากฏ (แถวแรกของ dataframe เป็นแถวแรกของตารางการแสดงตน)
JMCosta

และอีกอย่างถ้าไม่มีข้อมูลตัวแปรสำหรับจุดใด ๆ (3 หรือ 4) จำนวนแถวจะไม่เท่ากันและลำดับจะไม่เหมือนกันอย่างแน่นอน
JMCosta

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