Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中查找两个光栅层像素之间的最小距离_R_Distance_R Raster - Fatal编程技术网

在R中查找两个光栅层像素之间的最小距离

在R中查找两个光栅层像素之间的最小距离,r,distance,r-raster,R,Distance,R Raster,对于同一区域,我有两个主题光栅图层r1和r2,每个图层遵循相同的分类方案,共有16个类别。我需要找到r1单元格和r2单元格之间的最小距离,但值相同。例如,r1中的第n个单元格的值为10,坐标为x1,y1。在r2中,有两个单元格的值为10,坐标为x1+2,y1+2和x1-0.5,y1-0.5。因此,这个单元格需要的值是0.5,0.5 我尝试了distancefromraster package,但它给出了所有NA单元格到最近的非NA单元格的距离。我不知道如何将第二个光栅层包含在其中。因此,使用光栅

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


我尝试了
distance
from
raster package
,但它给出了所有NA单元格到最近的非NA单元格的距离。我不知道如何将第二个光栅层包含在其中。

因此,使用光栅点提取唯一专题类的空间点对象。然后使用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)
库(光栅)

r1您可以使用
class
包中的
knn
,以便为
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)
库(类)
图书馆(光栅)
#两个光栅的示例

r1使用光栅软件包的内存安全方法是使用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)
layers1