Я пытаюсь найти быструю функцию для измерения расстояния между несколькими патчами в растре одновременно с использованием R. В частности, я хочу измерить расстояние до ближайшего патча во всех направлениях (не только к ближайшему). Поскольку определение ближайшего в каждом направлении может занять много времени, расстояние до каждого патча также может решить проблему.Измерение расстояний между каждым патчем с использованием R
Сначала я использовал gDistance, но результаты не были интуитивными (см. Пример ниже). В частности, трудно связать проводимость с фактическим расстоянием между квадратами в растре.
Затем я попробовал с растровыми пакетами, итерациями каждого патча, измеряя расстояние оттуда до каждого пикселя из патча (используя расстояние между функциями), а затем ищем минимальное расстояние до каждого другого патча. Он работает, но это занимает много времени. Это также крайне неэффективно, потому что я измеряю каждое расстояние дважды, и потому что я измеряю ненужные расстояния (если единственный способ перейти от патча A к патчу C пересекает патч B, мне не нужно расстояние между патчем A и С). Ниже приведен код, я использую ...
Спасибо за любые советы ...
Карлос Альберто
код gdistance
library(gdistance)
library(raster)
# setting the patches
mF <- raster(nrows=10, ncols=20)
mF[] <- 0; mF[4:8,3] <- 2; mF[9,14:18] <- 3; mF[3,9:12] <- 1
# and the cost function
mg <- mF <= 0
# and the transition matrix
tr1 <- transition(1/mg, transitionFunction=mean, directions=16)
tr1C <- geoCorrection(tr1, type="c")
# getting coordinates of sampling points
dF1 <- as.data.frame(mF,xy=T, na.rm=T)
dF2 <- dF1[!duplicated(dF1[,3]),]
dF3 <- as.matrix(dF2[,1:2])
rownames(dF3) <- dF2[,3]
# and measuring the cost distance
cbind(dF3, as.matrix(costDistance(tr1C,dF3)))
дать это:
x y 0 1 2 3
0 -171 81 0 2192567 2079216.3 2705664.0
1 -27 45 2192567 0 2727389.7 3353837.4
2 -135 27 2079216 2727390 0.0 626447.7
3 63 -63 2705664 3353837 626447.7 0.0
Основные проблемы: 1. Что означает значение? как связать их с км? 2. Почему расстояние до класса 0 увеличивается с широтой? если площадь пикселей уменьшается ближе к полюсам, то также должно уменьшаться расстояние до каждого участка.
растр код
region <- (mF > 0) + 0 # the landscape map.
# this is just to reduce the creation/destruction of the variables
patch <- region
biome <- region
biomes <- unique(region)
areas <- area(region)
map.distances <-function (i) {
dA <- data.frame(biome = integer(0),
patch = integer(0),
area = numeric(0))
dD <- data.frame(biome = integer(0),
from = integer(0),
to = integer(0),
dist = numeric(0))
biome[] <- NA_integer_
# creating the patches
biome[region == i] <- i
biomeC <- clump(biome, directions=8)
dA <- rbind(dA, cbind(biome = i,
zonal(areas, biomeC, 'sum')))
patches <- as.integer(unique(biomeC))
# in each patch...
for (j in patches[-1]) {
patch[] <- NA_integer_
patch[biomeC == j] <- 1L
# get the distances from the patch
dists <- distance(patch)
d <- zonal(dists, biomeC, "min")
f <- j > d[,1]
# and combine the info
dD <- rbind(dD, data.frame(from = j,
to = d[f,1],
dist = d[f,2], biome = i))
}
return(list(edges=dD, vertices=dA))
}
# applying to the same map as before gives:
mpd <- map.distances(i=1)
rownames(mpd$edges) <- NULL
mpd$edges
from to dist biome
1 2 1 9210860 1
2 3 1 12438366 1
3 3 2 5671413 1
видеть, что расстояния не линейно коррелируют.
Вы должны изменить вводный текст, чтобы понять, что ваша цель состоит в том, чтобы найти для каждого патча, расстояние до _closest_ патч (если правильно). – jbaums
на самом деле нет ... Я пытаюсь найти расстояние до ближайшего патча в любом направлении вокруг него или для каждого патча вообще (если предыдущий вариант неэффективен). Но не только к ближайшему. Но я уточню, если наверняка ... спасибо –