Rのポリゴンシェープファイルを使用してラスターからラスターを抽出する


13

私はRが初めてで、ラスターパッケージを使用しています。既存のラスターファイルからポリゴンを抽出する際に問題があります。私が使用する場合

extract(raster, poly_shape)

ラスター上の関数は、常にデータを含むリストを作成します。本当に欲しいのは、ArcGISで再びロードできる別のラスタファイルを抽出することです。もう少し読んだ後、クロップ機能が本当に必要だと思います。しかし、この機能を使用しようとすると

crop(raster, poly_shape)

私はこのエラーを受け取ります:

Error in .local(x, y, ...) : extents do not overlap
In addition: Warning message:
In intersect(extent(x), extent(y)) : Objects do not overlap

ファイルrasterとpoly_shapeは、両方の関数で同じです。ここで何が間違っているのか教えてもらえますか?トリミング機能がリストではなく別のラスターを作成するのは正しいですか?

編集:extent()関数は私のために動作しません。それでも同じエラーが発生します。しかし、2つのデータセットは重複していると確信しています!とともに

extract(raster, poly_shape)

適切なデータを取得します。ただのリストとしてであり、私が望んでいるようなラスターとしてではありません。前にArcGISにデータセットを読み込んだところ、非常にうまく収まるため、投影を確認しませんでした。今私は試した

projection(raster) # "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
projection(poly_shape) # "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"

投影が収まらないことがわかります。抽出機能は、正しい方法でファイルを自動的に変換できるようです。私は次のことをしたのでそれを知っています:

  • ArcGISでもRで抽出したポリゴンの正確な部分を切り取ります
  • 抽出されたRポリゴン(リスト)のすべての値の合計を計算しました
  • ArcGISで切り取ったすべてのラスターセルの合計を計算しました

2つはまったく同じ結果なので、結論は、抽出関数が正しく機能したということです。今、私は私が推測する2つのオプションがあります:

  1. 抽出したリストからラスターを再度取得する方法が必要です
  2. 2つのデータセット(ラスター+ poly_shape)は同じ投影法を使用する必要があり、トリミング機能が機能するはずです

ここで何をすることを提案しますか?


4バンドrgbiラスターの場合はどうなりますか?バンドはこれまでに失われています
ドリス

GIS SEへようこそ!新規ユーザーとして、必ず短いツアーに参加してください。次に、回答を編集して、追加情報と参照を提供することを検討してください。良い答えを書くにはどうすればいいですか?を参照してください詳細については。
アンディ

新しい質問がある場合は、「質問する」ボタンをクリックして質問してください。コンテキストの提供に役立つ場合は、この質問へのリンクを含めてください。- レビューから
エリック

回答:


19

抽出関数は、本来どおりに動作しています。トリミング機能でポリゴンの範囲を強制的に使用し、オブジェクトをマスクして、ポリゴン領域を表す正確なラスターを返すことができます。エラーが引き続き発生する場合は、実際にはデータが重複していないことを意味します。

Rは「オンザフライ」の投影を実行しないので、投影を確認してください。「extent()」関数を使用して、エクステントが重複しているかどうかを確認できます。

以下は、ポリゴン範囲を使用してトリミングし、「ラスタライズされた」ポリゴンを使用して結果のラスタ​​をマスクする例です。

# Add required packages
require(raster)
require(rgeos)
require(sp)

# Create some data using meuse 
data(meuse)
  coordinates(meuse) <- ~x+y
    proj4string(meuse) <- CRS("+init=epsg:28992")
data(meuse.grid)
  coordinates(meuse.grid) = ~x+y
    proj4string(meuse.grid) <- CRS("+init=epsg:28992")
      gridded(meuse.grid) = TRUE    
        r <- raster(meuse.grid) 
          r[] <- runif(ncell(r))

# Create a polygon
f <- gBuffer(meuse[10,], byid=FALSE, id=NULL, width=250, 
                         joinStyle="ROUND", quadsegs=10)   

# Plot full raster and polygon                       
plot(r)
  plot(f,add=T)

# Crop using extent, rasterize polygon and finally, create poly-raster
#          **** This is the code that you are after ****  
cr <- crop(r, extent(f), snap="out")                    
  fr <- rasterize(f, cr)   
    lr <- mask(x=cr, mask=fr)

# Plot results
plot(lr)
  plot(f,add=T)

4
extract()オンザフライ再投影を実行ますが、crop ()実行しません。いくつかの混乱のためのものかもしれないアカウント
mdsumner

@Jefferey crop()およびmask()は、ポリゴンの長方形の範囲に従ってラスタをクリップするだけで、ポリゴンの境界内からはクリップしません。特定のポリゴンの境界内でラスターをクリップできるコマンドはありますか?
csheth

1
@Chintan Sheth、ポリゴン内のサブセットをマスクするには、ポリゴン内の値を表すラスターが必要です。これが、サブセットポリゴンをラスタライズしてからマスクする理由です。トリミングの手順は、ラスタの範囲をサブセットポリゴンと同じにすることで、これをスキップすると、範囲の不一致エラーが発生します。
ジェフリーエヴァンス

spTransformspパッケージから(他の空間Rパッケージと共に自動的にロードされる場合があります)、両方のファイルが同じ投影にあるように再投影できます。good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170、ハァッ?あなたが何を得ているのか分かりません。この質問は、ラスターパッケージが機能中に「オンザフライ投影」を追加したときに発生しました。これらの関数は、投影が一致しなかったときに以前にエラーをスローしていましたが、この投稿は2014年からのものです。
ジェフリーエヴァンス

8

実際に検索したのはmask()関数です。

mask(raster, poly_shape)

エラーなしで動作し、検索したものを返します。


2
同じ投影空間に収まるようにデータを再投影します。オンザフライの投影が自動であるArcGISでも、異なる投影で分析を行うことは非常に悪い習慣です。異なる投影法のデータでは、データは共通の範囲を共有しません。これは、受信しているエラーです。
ジェフリーエヴァンス14

projectExtent()を使用して、ラスターをトリミングする範囲のみを取得します。
mdsumner 14

サイトのQ&A形式に合わせて、これを編集/更新として質問の本文に配置する必要があります(さらに、「返信」にある回答にコメントを追加して、他にも確認する必要があることを伝えます)。
マットウィルキー14

@mattwilkie書式が合わないのは残念ですが、ここにコメントとして投稿するにはテキストが長すぎます。@JeffreyEvans私は次のことを試しました:projection(raster) = projection(poly_shape)および他の方法で回避しましたprojection(poly_shape) = projection(raster)が、どちらの方法でも同じエラーが発生しました:Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap。extract()関数を使用して、どの投影がオンザフライで使用されているかを確認する方法はありますか?
ラース14

1
実際に検索したのはmask()関数でした。mask(raster, poly_shape)エラーなしで動作し、検索したものを返します。
ラース14

-1

エクステントは正常に機能します...エクステントのXmin、Xmax、Ymin、およびYmaxは、ラスターのXおよびYとは異なると思います。つまり、反対に設定されています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.