r - 计算距离栅格避开土地
问题描述
我正在寻找一种方法来计算距一个点的距离栅格,类似于这样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)
我想制作相同的栅格,但要“最短距离避开一个区域”(在这种情况下是土地)。我知道这个包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
# 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)
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.
因此,任何关于如何从这里获得类似于第一个但包含避开陆地的距离的栅格的想法将不胜感激!
解决方案
我想你可以用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)
地图显示它适用于太平洋,也适用于红海(因为 wrld_simpl 没有巴拿马运河和苏伊士运河)。
但是因为使用 gridDistance 路径必须通过栅格单元的中心,所以估计的距离比实际距离要长一些。
推荐阅读
- python-3.x - Psycopg2 - 如何进行大型查询 - 超过 100 万行
- python - 使用 Python 3.7 绘制分类数据时如何修复 typeError
- javascript - Cloud Storage for Firebase 限制(组合)多个文件上传的大小
- lotus-notes - 保存为文本字段的 Lotus Notes 数据转换为日期/时间
- python-3.x - 使用 lambdas 和标准 python 函数时得到不同的结果
- mvvm - 如何在层次网格 ZK 上处理 selectedItem
- java - 如何实例化泛型类型?
- python - 如何修改 Wordnet Lemmatizer 以限制特定单词?
- javascript - 如何在归一化输出中返回两个归一化值的总和
- java - 通过将值传递给jsp而不使用javascript自动填充来自servlet的值