Bagaimana cara mengekstrak nilai dari raster di lokasi titik di R?

13

Pertanyaan saya adalah tentang mengekstraksi nilai dari raster di lokasi titik. Dengan ekstrak fungsi ini sangat mudah, dan fungsinya memberi saya bingkai data dengan nilai-nilai semua variabel dalam titik. Saya ingin memiliki dalam dataframe koordinat setiap titik. Bagaimana saya bisa mewujudkannya? Apakah mungkin untuk mengatakan kepada R bahwa ketika mengekstraksi nilai-nilai dari raster juga menambahkan kolom titik lokasi.

Ini adalah prosedur saya:

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)

hasilnya kira-kira seperti ini:

> 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

Tapi saya ingin dua kolom lagi dengan data koordinat (tapi bisa juga kolom lain dari tabel lokasi csv saya).

Terima kasih banyak.

JMCosta
sumber
Maaf format hasil yang ditampilkan sebelumnya tidak benar.
JMCosta
Harus menjadi lima kolom (bio1, bio12 .... bio4)
JMCosta
Bukankah seharusnya nilainya sesuai dengan koordinat Anda presencias?
Roman Luštrik
Nilai-nilai variabel berasal dari poin prensensi. Tetapi saya juga menginginkan koordinat poin-poin dalam tabel. tetapi saya tidak tahu bagaimana melakukannya.
JMCosta
Bagaimana dengan sesuatu di sepanjang garis cbind(coordinates(presencias), variables_presencia)? Anda kemudian dapat mengonversi ke menggunakan SPDF coordinates(result) <- ~ X + Ydan Anda dapat menggunakan kebanyakan metode yang dirancang untuk objek spasial lagi.
Roman Luštrik

Jawaban:

20

Dengan asumsi presenciasdan variablesberbagi proyeksi yang sama, ini seharusnya menjadi tugas yang mudah. Saya sarankan Anda untuk menambahkan baris kode ini setelah read.table()pernyataan Anda untuk mengkonversi presenciasdataframe ke objek SpatialPointsDataFrame (cukup perbaiki nama kolom yang berisi koordinat x dan y jika berbeda dari contoh saya).

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

Untuk memberikan contoh yang dapat direproduksi, saya mencoba sedikit membuka cakupan jawaban saya. Pertama-tama, unduh dan unzip shapefile ESRI ini dengan lokasi yang kurang lebih penting di Jerman. Ini akan berfungsi sebagai data titik nanti. Anda juga akan membutuhkan paket dismo, rgdaldan rasteruntuk contoh singkat ini, jadi pastikan bahwa perpustakaan ini (dan semua dependensinya) diinstal pada hard drive lokal Anda.

Mari kita mulai dengan memuat paket yang diperlukan.

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

Selanjutnya, Anda harus membuat sampel RasterLayer. Dalam kasus kami, kami akan menggunakan gmap()fungsi dari dismopaket untuk mendapatkan peta fisik Jerman.

germany.mrc <- gmap("Germany")

Anda sekarang dapat mengimpor shapefile titik Anda melalui readOGRdari rgdalpaket R. Pastikan untuk menyesuaikan nama sumber data (dsn = ...). Keseluruhan hal-hal proyeksi sudah usang dalam kasus khusus Anda. Namun, itu harus dilakukan dalam contoh kami agar berhasil menamparkan data poin kami dengan German 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)))

Untuk mengurangi ukuran besar dari data titik kami, kami akan menggambar sampel acak dari sepuluh lokasi di Jerman. Ini sudah cukup untuk tujuan kita.

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

Sekarang setelah persiapan selesai, kita bisa mulai mengekstraksi nilai piksel tertentu yang ada di sepuluh titik sampel acak kami.

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

Untuk menggabungkan koordinat titik dengan nilai piksel yang diekstraksi, kita hanya perlu menyiapkan kerangka data yang berisi koordinat SpatialPointsDataFrame kami. Itu dia!

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
fdetsch
sumber
1

Tentunya Anda bisa melakukannya:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(menganggap data koordinat Anda ada dalam dua kolom yang disebut 'x' dan 'y')

Jack Harrison
sumber
Saya berpikir seperti itu, tetapi saya ragu: kerangka data yang dihasilkan dari ekstrak memiliki urutan yang sama dengan yang ada. (baris pertama dari dataframe adalah baris pertama dari tabel kehadiran)
JMCosta
Dan satu hal lagi, jika tidak ada data variabel untuk setiap titik (3 atau 4), jumlah baris tidak akan sama, dan urutannya tidak akan sama pasti.
JMCosta
@ JMCosta: Anda salah tentang itu. Nilai-nilai NA akan dikembalikan untuk poin-poin itu.
Robert Hijmans