R'deki noktaların bulunduğu yerde rasterlerden değerler nasıl çıkarılır?


13

Benim sorum, noktaların bulunduğu yerdeki rasterlerden değer çıkarmak. İşlev özü ile bu çok kolaydır ve işlev noktalardaki tüm değişkenlerin değerlerini içeren bir veri çerçevesi verir. Bu veri çerçevesinde her noktanın koordinatlarına sahip olmak istiyorum. Bunu nasıl yapabilirim? R'ye değerleri rasterden çıkarırken konum noktasının sütunlarını da eklediğini söylemek mümkün mü?

Bu benim prosedürüm:

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)

sonuçlar şuna benzer:

> 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

Ama koordinat verileri ile iki sütun daha istiyorum (ama benim csv ayıklama konum tablosundan diğerleri sütunlar olabilir).

Çok teşekkürler.


Üzgünüz, daha önce gösterilen sonuçların biçimi doğru değil.
JMCosta

Beş sütun olmalıdır (bio1, bio12 .... bio4)
JMCosta

Değerler sizin koordinatlarınızla uyuşmuyor presenciasmu?
Roman Luštrik

Değişkenlerin değerleri prensens noktalarından alınmıştır. Ama tablodaki noktaların koordinatlarını da istiyorum. ama nasıl yapılacağını bilmiyorum.
JMCosta

Peki ya çizgiler boyunca cbind(coordinates(presencias), variables_presencia)? Daha sonra kullanarak SPDF'ye dönüştürebilir coordinates(result) <- ~ X + Yve uzamsal nesneler için tasarlanmış yöntemlerin çoğunu tekrar kullanabilirsiniz.
Roman Luštrik

Yanıtlar:


20

Bunu varsayarsak presenciasve variablesaynı projeksiyonu paylaşırsak, bu kolay bir iş olmalıdır. Veri kodunu bir SpatialPointsDataFrame nesnesine read.table()dönüştürmek için presenciasifadenizden sonra bu kod satırlarını eklemenizi öneririm (örnekten farklıysa x ve y koordinatlarını içeren sütunların adlarını daraltın).

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

Tekrarlanabilir bir örnek sunmak için cevabımın kapsamını biraz daha açmaya çalışıyorum. Her şeyden önce, bu ESRI şekil dosyasını indirin ve Almanya'daki az çok önemli konumlarla açın. Bunlar daha sonra nokta verisi olarak kullanılacaktır. Ayrıca paketler gerekir dismo, rgdalve rasterbu kısa örneğin, bu nedenle bu kütüphaneler (ve tüm bunların bağımlılıkları) yerel sabit diske yüklenecek olduğundan emin olun.

Gerekli paketleri yüklemeye başlayalım.

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

Ardından, bir örnek RasterLayer oluşturmalısınız. Bizim durumumuzda, Almanya'dan fiziksel bir harita elde etmek gmap()için dismopaketten fonksiyondan faydalanacağız .

germany.mrc <- gmap("Germany")

Artık nokta şekil dosyanızı readOGRR rgdalpaketinden alabilirsiniz. Veri kaynağı adını ayarladığınızdan emin olun (dsn = ...). Sizin durumunuzda tüm projeksiyon işleri geçersiz. Ancak, örnek verilerimizde Almanya RasterLayer ile puan verilerimizi başarılı bir şekilde kaplamak için bu örnekte yapılmalıdır.

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

Puan verilerimizin büyük boyutunu azaltmak için, Almanya'da on konumdan rastgele bir örnek alacağız. Bu bizim amacımız için yeterli olmalı.

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

Hazırlık işleri bittiğine göre, rastgele örneklenen 10 noktamızın içerdiği belirli piksellerin değerlerini çıkarmaya başlayabiliriz.

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

Nokta koordinatlarını çıkarılan piksel değerleri ile birleştirmek için, sadece SpatialPointsDataFrame'imizin koordinatlarını içeren bir veri çerçevesi ayarlamamız gerekir. Bu kadar!

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

Elbette şunları yapabilirsiniz:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(koordinat verilerinizin 'x' ve 'y' adlı iki sütunda olduğunu varsayarsak)


Ben bu şekilde düşündüm, ama bu şüphe vardı: özü sonucu veri çerçevesi varlığını aynı sırada. (veri çerçevesinin ilk satırı varlık tablosunun ilk
satırıdır

Ve başka bir şey, herhangi bir nokta (3 veya 4) için değişken veri yoksa, satır sayısı aynı olmayacak ve sipariş kesin olarak aynı olmayacaktır.
JMCosta

@ JMCosta: bu konuda yanlışsın. Bu noktalar için NA değerleri döndürülecektir.
Robert Hijmans
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.