2016-09-22 62 views
0

對於每個遵循相同分類方案且具有16個類的相同區域,我有兩個專題柵格圖層r1r2。我需要找到單元格r1與單元格r2之間的最小距離,但具有相同的值。例如。在r1中的第n個單元具有值10並且座標爲x1,y1。在r2中,有2個單元格,值爲10,座標爲x1+2,y1+2x1-0.5,y1-0.5。因此,我需要的這個單元格的值是0.5,0.5。在R中找到兩個柵格圖層像素之間的最小距離

我試過distanceraster package,但它給所有細胞NA的距離,到非最近的細胞。我很困惑,我怎麼能包含第二個柵格圖層。

回答

0

因此,使用rasterToPoints爲獨特的專題類提取SpatialPoints對象。然後使用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,我的循環將無法工作。如果您的投影在度數,您可能需要geosphere包來獲得準確的結果。但在這種情況下,我認爲最好的方法是以米爲單位進行投影。

0

您可以使用knnclass包,以便與同一類別的r2最近細胞的r1查找索引的每個細胞:

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

使用柵格包是使用的存儲安全的方法layerize()函數將你的柵格值分成一堆二進制柵格(在你的情況下是16),然後使用distance()函數來計算r2層中的距離,用r1的相應層掩蓋它們。類似這樣的:

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) 
相關問題