補間せずに不規則なポイントデータからRASTERを作成する方法


13

不規則な間隔のポイントデータベースからラスターイメージを作成しようとしていました。データは次のようになります

> head(s100_ras)
         x       y         z
1 267573.9 2633781 213.29545
2 262224.4 2633781  69.78261
3 263742.7 2633781  51.21951
4 259328.4 2633781 301.98413
5 264109.8 2633781 141.72414
6 255094.8 2633781  88.90244

作成したメッシュ内にこれらの「z」値が必要です

# Create a fine mesh grid
my_mesh=expand.grid(seq(min(s100_ras$Y),max(s100_ras$Y),l=100),
                    seq(min(s100_ras$X),max(s100_ras$X),l=100))

また、データポイントの外側にあるメッシュポイントのz値を「NA」として割り当てる必要があります。メッシュ上のポイントは次のようになります。https : //drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharing when plot

plot(my_mesh)
points(s100_ras$Y, s100_ras$X, pch="*", col='blue')

問題は、これに基づいて構築する方法がわからないということです。メッシュグリッドとデータポイントは同じスケールではないため、次の手順は機能しません!!

library(rgdal)
library(raster)
xyz<-cbind(my_mesh, s100_ras)
r <- rasterFromXYZ(xyz)
image(r)

データポイントを使用して(メッシュなしで)ラスターを作成しようとすると、データの間隔が不規則になるため、Rがエラーをスローします。

library(sp)
s100_ras <- data.frame(expand.grid(x = s100_ras$Y, y = s100_ras$X), 
                       z = as.vector(s100_ras$mean))
coordinates(s100_ras) <- ~x+y
proj4string(s100_ras) <- CRS("+proj=utm +zone=46 +datum=WGS84")
gridded(s100_ras) = TRUE

suggested tolerance minimum: 0.916421 
Error in points2grid(points, tolerance, round) : 
  dimension 1 : coordinate intervals are not constant

さらに、私は「ラスタパッケージ」の「ラスタライズ」機能(不規則なグリッド用)で遊んでみましたが、それを使用する方法を得ることができませんでした:(。オリジナリティのある補間を回避したいのですが、idwやクリギングの手法を使用せずに不規則な間隔のデータポイントのラスターを作成することは可能ですか?


不規則な間隔のグリッドの問題は、ポイントが近すぎたり遠すぎたりするとアルゴリズムが失敗することです。(最適でない)回避策:セル間の最小距離を取り、長方形のベクトルグリッドを作成してください。次に、ポイントの平均値をそのグリッドに結合し、ラスタライズします。
カーリュー

私は同じ問題を抱えていました-解決策はSpatialPixelsDataFrame、提案されたtolerance引数(あなたの場合は0.916421)で使用することでした。
トマス

回答:


18

不規則なポイントデータが通常のラスター上にあると仮定します。その場合、rasterizeは機能するはずです。?rasterizeの例がその方法を示しています。ここにあなたのデータに基づいたものがあります

s100 <- matrix(c(267573.9, 2633781, 213.29545, 262224.4, 2633781, 69.78261, 263742.7, 2633781, 51.21951, 259328.4, 2633781, 301.98413, 264109.8, 2633781, 141.72414, 255094.8, 2633781, 88.90244),  ncol=3,  byrow=TRUE)
colnames(s100) <- c('X', 'Y', 'Z')

library(raster)
# set up an 'empty' raster, here via an extent object derived from your data
e <- extent(s100[,1:2])
e <- e + 1000 # add this as all y's are the same

r <- raster(e, ncol=10, nrow=2)
# or r <- raster(xmn=, xmx=,  ...

# you need to provide a function 'fun' for when there are multiple points per cell
x <- rasterize(s100[, 1:2], r, s100[,3], fun=mean)
plot(x)

problem @ Robertの優れたソリューション
ToNoY

e <-e + 1000を追加する理由を明確にできますか?
mmann1123

@ mman1123これは、これらの奇妙なサンプルデータで動作させるためのものです。すべてのy座標は同じであるため、y方向の範囲はゼロです。そのため、範囲からラスタを作成できるようにするために、1000を追加します。
ロバートハイマンズ

これにpythonicソリューションはありますか?
-raaj

5

これは私にとってはうまくいきました-解決策は、提案された許容引数(あなたの場合は0.916421)でSpatialPixelsDataFrameを使用することでした:

points <- SpatialPoints(s100_ras[,c('x','y')], s100_ras[,c('z')])
pixels <- SpatialPixelsDataFrame(points, tolerance = 0.916421, points@data)
raster <- raster(pixels[,'z'])

ただし、許容値が高いため、ラスターは元のポイントにうまく適合しません。はるかに良くフィットする可能性があります。


1
コードの最初の行に閉じ括弧がありませんか?
アンティ

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