找到R中两个栅格图层像素之间的最小距离

时间:2016-09-22 14:25:21

标签: r distance r-raster

对于相同的区域,我有两个主题栅格图层r1r2,每个图层遵循相同的分类方案,并且有16个类。我需要找到r1的单元格与r2的单元格之间的最小距离,但具有相同的值。例如。 r1中的第n个单元格的值为10,坐标为x1,y1。在r2中,有2个单元格的值为10,坐标为x1+2,y1+2x1-0.5,y1-0.5。因此,我需要这个单元格的值是0.5,0.5。

我从distance尝试了raster package,但它为所有NA的单元格提供了距离最近的非NA的单元格的距离。我很困惑如何将第二个栅格图层包含在其中。

3 个答案:

答案 0 :(得分:1)

您可以使用class包中的r1,以便r2的每个单元格找到具有相同类别的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) 的最近单元格的索引:

import vte

def download(self, dPluzz, donnees=None):
    [...]
    print list_com2 
    self.child_pid = self.v.fork_command(None, list_com2)
    if self.child_pid == -1:
        self.child_pid = self.v.fork_command("/bin/bash", list_com2)
    print self.child_pid

答案 1 :(得分: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包来获得准确的结果。但在这种情况下,我认为最好的是使用以米为单位的投影。

答案 2 :(得分:0)

使用raster-package的内存安全方法是使用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)