Rのポイントの位置にあるラスターから値を抽出する方法は?


13

私の質問は、ポイントの位置にあるラスターから値を抽出することです。関数抽出を使用すると、これは非常に簡単です。関数は、ポイント内のすべての変数の値を持つデータフレームを提供します。そのデータフレームに各ポイントの座標が必要です。どうすればそれを実現できますか?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

ただし、座標データを含む列がさらに2つ必要です(ただし、場所テーブルを抽出するcsvの他の列も可能です)。

ありがとうございます。


前に示した結果の形式が正しくありません。
JMCosta

5列にする必要があります(bio1、bio12 .... bio4)
JMCosta

値はあなたの座標に対応してはいけませんpresenciasか?
ロマンルシュトリック

変数の値は存在ポイントからのものです。しかし、テーブル内のポイントの調整も必要です。しかし、私は方法を知らない。
JMCosta

の線に沿って何かcbind(coordinates(presencias), variables_presencia)?その後、を使用してSPDFに変換しcoordinates(result) <- ~ X + Y、空間オブジェクト用に設計された多数のメソッドを再び使用できます。
ロマンルシュトリック

回答:


20

それを想定し、同じ予測presenciasvariables共有する場合、これは簡単な作業です。データフレームをSpatialPointsDataFrameオブジェクトread.table()に変換するために、ステートメントの後にこれらのコード行を追加することをお勧めしますpresencias(例と異なる場合は、x座標とy座標を含む列の名前を調整します)。

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

再現可能な例を提供するために、回答の範囲をもう少し広げようとします。まず、このESRIシェープファイルをダウンロードして、ドイツの重要度の高い場所に解凍します。これらは、後でポイントデータとして機能します。また、パッケージが必要になりますdismorgdalそしてrasterこの短い例えばので、これらのライブラリ(とそのすべての依存関係が)ローカルハードドライブにインストールされていることを確認してください。

必要なパッケージのロードから始めましょう。

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

次に、サンプルのRasterLayerを生成する必要があります。この例では、ドイツの物理的な地図を取得するためにgmap()dismoパッケージの関数を使用します。

germany.mrc <- gmap("Germany")

これでreadOGR、Rのrgdalパッケージからポイントシェープファイルをインポートできます。データソース名を調整してください(dsn = ...)。あなたの特定のケースでは、プロジェクションの全体は時代遅れです。ただし、ポイントデータをドイツの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)))

ポイントデータの膨大なサイズを削減するために、ドイツの10の場所のランダムサンプルを描画します。これは私たちの目的には十分です。

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

これで準備が完了したので、ランダムにサンプリングされた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」という2つの列にあると仮定します)


私はそのように考えましたが、私はこれらの疑いがありました:抽出から生じるデータフレームは、その存在と同じ順序を持っています。(データフレームの最初の行はプレゼンステーブルの最初の行です)
JMCosta

また、ポイント(3または4)の変数データが​​ない場合、行の数は同じではなく、順序は確かに同じではありません。
JMCosta

@JMCosta:あなたはそれについて間違っています。それらのポイントに対してNA値が返されます。
ロバートハイマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.