对于相同的区域,我有两个主题栅格图层r1
和r2
,每个图层遵循相同的分类方案,并且有16个类。我需要找到r1
的单元格与r2
的单元格之间的最小距离,但具有相同的值。例如。 r1
中的第n个单元格的值为10,坐标为x1,y1
。在r2
中,有2个单元格的值为10,坐标为x1+2,y1+2
和x1-0.5,y1-0.5
。因此,我需要这个单元格的值是0.5,0.5。
我从distance
尝试了raster package
,但它为所有NA的单元格提供了距离最近的非NA的单元格的距离。我很困惑如何将第二个栅格图层包含在其中。
答案 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)