Рассчитать расстояние растр, избегая земли - PullRequest
2 голосов
/ 23 апреля 2019

Я ищу способ вычислить растр расстояний от точки, аналогичный тому, что делает raster::distance, но избегая земли.Таким же образом я могу создать растр расстояний до точки (без каких-либо ограничений), например, так:

library(sp)
library(raster)


# create cooridnates sp points
col_coord <- data.frame(x      = c(-13.8309),
                        y      = c(28.9942))
coordinates(col_coord) <- ~x+y
col_coord@proj4string <- CRS(projections$WGS84)

#create base raster
baseRaster <- raster(xmn = -80, xmx =55, ymn = -70, ymx = 70, crs = CRS("+proj=longlat +ellps=WGS84"), resolution = 1)

#rasterize spatial point
colraster <- rasterize(col_coord, baseRaster)

#calculate distance
coldist <- raster::distance(colraster, doEdge = T)

#plot
plot(coldist) 

И получить это изображение: enter image description here

Я хотел бы создать такой же растр, но с "кратчайшим расстоянием, избегая области" (в данном случае приземлиться).Мне известно о пакете gdistance, и я попытался последовать совету в этом сообщении, но это настолько, насколько я понял: (Trans - это переходный слой, потому что он требуетдолгое время для расчета доступно здесь .

library(gdistance)
# load transition layer (change directory if needed). This is in another CRS so we transform everything
load("data/Transition_layer.RData")

col_coord <- spTransform(col_coord, Trans@crs)
A <- accCost(Trans, col_coord)
plot(A) #this shows high cost in contintents which is good

enter image description here

# create a raster for water
mapWGS <- rgeos::gBuffer(rworldmap::getMap(resolution = "high"), width = 0)
water <- rasterize(mapWGS, baseRaster, mask = F, field = 1)
table(is.na(water[]))

water[water == 1] <- 0
water[is.na(water)] <- 1
water[water == 0] <- NA
plot(water)

enter image description here

water <- projectRaster(water, crs = Trans@crs)

# change resolution of A to match that of water
A <- resample(A, water)
A2 <- mask(A, water, inverse = F)

plot(A2) # this doesn't make that much sense. 

enter image description here

Таким образом, любые идеи о том, как добраться от этого до растра, подобного первому, но содержащего расстояния, избегающие земли, были бы оченьценится!

1 Ответ

2 голосов
/ 24 апреля 2019

Я думаю, вы можете использовать raster::gridDistance с аргументом omit

library(raster)
xy <- data.frame(x=-13.8309, y=28.9942)
r <- raster(xmn=-120, xmx=55, ymn=-70, ymx=70, res=.25)

library(maptools)
data(wrld_simpl)

r <- rasterize(wrld_simpl, r, field= -1)
rr <- rasterize(xy, r, update=TRUE)

x <- gridDistance(rr, 1, omit=-1)
plot(x / 1000000)
points(xy)

distance through water

Карты показывают, что это работает для Тихого океана, а также для Красного моря (поскольку wrld_simpl не имеет Панамского и Суэцкого каналов).

Но поскольку с gridDistance путь должен проходить через центры растровых ячеек, предполагаемое расстояние немного больше, чемфактическое расстояние.

...