2016-09-22 12 views
0

두 개의 동일한 래스터 레이어 r1r2은 각각 동일한 분류 체계를 따르며 16 개의 클래스가 있습니다. 나는 r1 세포와 r2 세포 사이의 최소 거리를 찾아야하지만 같은 값을 가지고 있습니다. 예 : r1의 n 번째 셀 값은 10이고 좌표는 x1,y1입니다. r2에는 값 10 인 2 개의 셀이 있고 좌표는 x1+2,y1+2x1-0.5,y1-0.5입니다. 따라서이 셀에 필요한 값은 0.5,0.5입니다.두 래스터 레이어 픽셀 간의 최소 거리 구하기 R

raster package에서 distance을 시도했지만 NA가 아닌 모든 셀에 대해 NA가 아닌 가장 가까운 셀까지 거리를 제공합니다. 나는 이것이 어떻게 두 번째 래스터 레이어를 포함 할 수 있는지에 관해 혼란 스럽다.

답변

0

따라서 고유 주제 클래스에 대한 SpatialPoints 객체를 추출하려면 rasterToPoints를 사용하십시오. 그런 다음 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이 아니라면 루프가 작동하지 않습니다. 투영이 학위를받은 경우 정확한 결과를 얻으려면 지형 패키지가 필요할 것입니다. 하지만이 경우 최고는 미터로 투영법을 사용하는 것입니다.

0

동일한 범주에 r2의 가장 가까운 셀의 r1 찾기 인덱스의 각 셀 있도록 class 패키지 knn를 사용할 수 있습니다

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)