Я упростил ваш скрипт - убрал распараллеливание, чтобы его было легче оптимизировать. Я удалил цикл и оператор if и сделал некоторые другие изменения; это может немного помочь, но, возможно, не очень.
library(gdistance)
r <- raster(nrow=15,ncol = 15, xmn=1, xmx=1500, ymn=1, ymx=1500, vals=0, crs = "+proj=somerc +lat_0=46.952405555556 +lon_0=7.439583333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m"
)
r[c(5,10,9,15,13,5),c(4,8,9,7,7,15)] <- 1
tr <- transition(r, transitionFunction = function(x){1}, directions = 16)
tr <- geoCorrection(tr, scl=FALSE)
cells <- Which(r > 0, cells=TRUE)
xy <- xyFromCell(r, cells)
constant <- sqrt(0.97428 * 30 + 1.46) - 0.996249
d <- rep(NA, length(cells))
for(i in 1:length(cells)) {
dst <- accCost(tr, xy[i,])[cells]
dst <- dst[dst <= 1000] # 2000 is too high for this example
d[i] <- mean(sqrt(2 * dst + 1) - 1)
}
result <- raster(r)
result[cells] <- d + constant
plot(result)
text(result)
Другой, вероятно, медленнее , подход может выглядеть примерно так:
library(raster)
r <- raster(nrow=15,ncol = 15, xmn=1, xmx=1500, ymn=1, ymx=1500, crs = "+proj=somerc +lat_0=46.952405555556 +lon_0=7.439583333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m"
)
r[c(5,10,9,15,13,5),c(4,8,9,7,7,15)] <- 1
d <- distance(r)
cells <- Which(r > 0, cells=TRUE)
b <- buffer(SpatialPoints(xyFromCell(r, cells)), 1000, dissolve=FALSE)
e <- extract(d, b, fun=sum)
result2 <- raster(r)
result2[cells] <- e
plot(result2)
text(result2)
Результаты не совпадают, потому что я суммирую расстояния (согласно вашему описанию), тогда как вы делаете constant + mean(sqrt(2 * dst + 1) - 1)