2016-09-22 7 views
0

同じ分類スキームに従う2つのテーマラスタレイヤr1r2があり、それぞれ16のクラスを持っています。私はr1のセルとr2のセルの間の最小距離を見つける必要がありますが、同じ値です。例えば。 r1のn番目のセルの値は10で、座標はx1,y1です。 r2には値10のセルが2つあり、座標はx1+2,y1+2x1-0.5,y1-0.5です。したがって、このセルに必要な値は0.5,0.5になります。2つのラスタレイヤピクセル間の最短距離の検索R

raster packageから試しましたが、それはNAでないすべてのセルについて、NAでない最も近いセルに距離を与えます。私はこの中に第2のラスタ層をどのように含めることができるのか混乱しています。

答えて

0

したがって、固有のテーマクラスのSpatialPointsオブジェクトを抽出するには、rasterToPointsを使用します。次に、sp :: spDists関数を使用して、ポイント間の距離を求めます。

library(raster) 


r1 <- raster(nrow=10,ncol=10) 
r2 <- raster(nrow=10,ncol=10) 

set.seed(1) 
r1[] <- ceiling(runif(100,0,10)) 
r2[] <- ceiling(runif(100,0,10)) 

dist.class <- NULL 
for(i in unique(values(r1))){ 
p1 <- rasterToPoints(r1, fun=function(xx) xx==i, spatial=T) 
p2 <- rasterToPoints(r2, fun=function(xx) xx==i, spatial=T) 
dist.class[i] <- min(spDists(p1,p2)) 
} 
cbind(class = unique(values(r1)),dist.class) 

ループが効率的でない可能性があります。それが問題ならば、それを関数にラップしてラップしてください。また、あなたのクラスには注意してください。1:10でない場合、私のループは動作しません。あなたの投影が度にある場合、正確な結果を得るためには、おそらく地圏パッケージが必要です。しかし、その場合のベストはメートルで投影を使うことだと思います。

0

あなたは同じカテゴリでr2の最も近いセルのr1検索インデックスの各セルのためになるようにclassパッケージからknnを使用することができます。

library(class) 
library(raster) 
#example of two rasters 
r1 <- raster(ncol = 600, nrow = 300) 
r2 <- raster(ncol = 600, nrow = 300) 
#fill each with categories that rabge from 1 to 16 
r1[] <- sample(1:16, ncell(r1), T) 
r2[] <- sample(1:16, ncell(r2), T) 
# coordinates of cells extracted 
xy = xyFromCell(r1, 1:ncell(r1)) 
#multiply values of raster with a relatively large number so cells thet belong 
#to each category have smaller distance with reagrd to other categories. 
v1 = values(r1) * 1000000 
v2 = values(r2) * 1000000 
# the function returns indices of nearest cells 
out = knn(cbind(v2, xy) ,cbind(v1, xy) ,1:ncell(r1), k=1) 
0

用いることであろうラスタパッケージを使用してメモリの安全なアプローチラスタ値をバイナリラスタのスタック(あなたの場合は16)に分割し、距離()関数を使用してr2のレイヤー内の距離を計算し、r1の各レイヤーでマスキングするlayerize()関数。このようなもの:

layers1 <- layerize(r1, falseNA=TRUE) 
layers2 <- layerize(r2, falseNA=TRUE) 

# now you can loop over the layers (use foreach loop if you want 
# to speed things up using parallel processing) 

dist.stack <- layers1 

for (i in 1:nlayers(r1)) { 
    dist.i <- distance(layers2[[i]]) 
    dist.mask.i <- mask(dist, layers1[[i]]) 
    dist.stack[[i]] <- dist.mask.i 
} 

# if you want pairwise distances for all classes in one layer, simply 
# combine them using sum() 

dist.combine <- sum(dist.stack, na.rm=TRUE) 
関連する問題