ラスターの値をポイントに抽出すると、複数の があり、関数の引数をNA
使用するのではなくbuffer
、重複するポイントに最も近い非ピクセルを抽出したいと思います。fun
extract
NA
NA
私は基本的な抽出機能を使用しています:
data.extr<-extract(loc.thr, data[,11:10])
これはラスターベースのソリューションで、最初に NA ピクセルを最も近い非 NA ピクセル値で埋めます。ただし、これはピクセル内のポイントの位置を考慮していないことに注意してください。代わりに、ピクセル中心間の距離を計算して、最も近い非 NA ピクセルを決定します。
最初に、各 NA ラスター ピクセルについて、最も近い非 NA ピクセルまでの距離と方向を計算します。次のステップは、この非 NA セルの座標を計算し (投影された CRS を想定)、その値を抽出して、この値を NA の位置に保存することです。
開始データ: koekenbakker からの回答と同じ値を持つ投影されたラスター:
set.seed(2)
# set projected CRS
r <- raster(ncol=10,nrow=10, xmn=0, xmx=10, ymn=0,ymx=10, crs='+proj=utm +zone=1')
r[] <- 1:10
r[sample(1:ncell(r), size = 25)] <- NA
# create sample points
xy = data.frame(x=runif(10,1,10), y=runif(10,1,10))
# use normal extract function to show that NAs are extracted for some points
extracted <- raster::extract(x = r, y = xy)
すべての NA ピクセルから最も近い非 NA ピクセルまでの距離と方向を計算します。
dist <- distance(r)
# you can also set a maximum distance: dist[dist > maxdist] <- NA
direct <- direction(r, from=FALSE)
NA ピクセルの座標を取得する
# NA raster
rna <- is.na(r) # returns NA raster
# store coordinates in new raster: https://stackoverflow.com/a/35592230/3752258
na.x <- init(rna, 'x')
na.y <- init(rna, 'y')
# calculate coordinates of the nearest Non-NA pixel
# assume that we have a orthogonal, projected CRS, so we can use (Pythagorean) calculations
co.x <- na.x + dist * sin(direct)
co.y <- na.y + dist * cos(direct)
# matrix with point coordinates of nearest non-NA pixel
co <- cbind(co.x[], co.y[])
座標「co」で最も近い非 NA セルの値を抽出します
# extract values of nearest non-NA cell with coordinates co
NAVals <- raster::extract(r, co, method='simple')
r.NAVals <- rna # initiate new raster
r.NAVals[] <- NAVals # store values in raster
元のラスターを新しい値で埋める
# cover nearest non-NA value at NA locations of original raster
r.filled <- cover(x=r, y= r.NAVals)
sampled <- raster::extract(x = r.filled, y = xy)
# compare old and new values
print(data.frame(xy, extracted, sampled))
# x y extracted sampled
# 1 5.398959 6.644767 6 6
# 2 2.343222 8.599861 NA 3
# 3 4.213563 3.563835 5 5
# 4 9.663796 7.005031 10 10
# 5 2.191348 2.354228 NA 3
# 6 1.093731 9.835551 2 2
# 7 2.481780 3.673097 3 3
# 8 8.291729 2.035757 9 9
# 9 8.819749 2.468808 9 9
# 10 5.628536 9.496376 6 6
ポイント 5 は Koekenbakker の回答とは別の値を取ることに注意してください。これは、この方法ではピクセル内のポイントの位置が考慮されていないためです (前述のとおり)。これが重要な場合、このソリューションは適切ではない可能性があります。それ以外の場合、たとえばラスター セルがポイント精度に比べて小さい場合、このラスター ベースの方法で良好な結果が得られるはずです。
ラスター スタックの場合は、上記の @koekenbakker のソリューションを使用し、それを関数に変換します。ラスター スタックの@layers
スロットはラスターのリストなので、それを重ねてそこから移動します。
#new layer
r2 <- raster(ncol=10,nrow=10, xmn=0, xmx=10, ymn=0,ymx=10)
r2[] <- 1:10
r2[sample(1:ncell(r2), size = 25)] <- NA
#make the stack
r_stack <- stack(r, r2)
#a function for sampling
sample_raster_NA <- function(r, xy){
apply(X = xy, MARGIN = 1,
FUN = function(xy) r@data@values[which.min(replace(distanceFromPoints(r, xy), is.na(r), NA))])
}
#lapply to get answers
lapply(r_stack@layers, function(a_layer) sample_raster_NA(a_layer, xy))
または派手にする(速度の向上?)
purrr::map(r_stack@layers, sample_raster_NA, xy=xy)
これは、dplyrを使用して全体をさらに高速化できるかどうか疑問に思います...