2016-09-22 96 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) 
相关问题