我正在尝试计算从光栅的几个像素到R中某些多边形边界的距离,如图中所示。我有两个问题:
如何从SpatialPolygon
对象正确定义边界。我目前有两种选择,但我无法决定哪种选择最好。首先,我可以强制SpatialPolygon
as
一个SpatialLines
对象,然后强制转换为SpatialPoints。其次,我可以raster::rasterize
SpatialPolygon
。我想每个选项都有其优点和缺点。
我只想从边框的一边进行距离计算。在这个例子中,我只希望从哥伦比亚境内的像素到两国之间的边界到边界的距离。我尝试使用纬度参数“过滤”边框,但真实边框非常不规则,因此使用严格的截止值可能会导致错误。
以下代码可用于获取示例SpatialPolygonsDataFrame
:
#Get the world map and select two countries [Colombia and Venezuela]
library(maptools) #To get the polygon data
data(wrld_simpl)
colven <- c("Colombia", "Venezuela")
colven_map <- wrld_simpl[wrld_simpl$NAME %in% colven, ]
可以使用以下代码创建栅格数据:
library(raster)
raster <- raster(colven_map, nrow=100, ncol=100)
raster[] <- 1:length(raster)
raster_colven <- mask(raster, colven_map)
提前致谢
答案 0 :(得分:1)
#example data
library(maptools) #To get the polygon data
data(wrld_simpl)
colven <- wrld_simpl[wrld_simpl$NAME %in% c("Colombia", "Venezuela"), ]
library(raster)
raster <- raster(colven, nrow=100, ncol=100)
raster[] <- 1:length(raster)
raster <- mask(raster, colven)
我创建了一些感兴趣的随机单元格
set.seed(33)
cells <- sample(ncell(raster), 10)
xy <- xyFromCell(raster, cells)
sp <- SpatialPoints(xy, proj4string=crs(colven))
然后使用rgeos
library(rgeos)
# inside Colombia only
col <- colven[colven$NAME == "Colombia", ]
sp <- gIntersection(sp, col)
# get the border between Venezuela and Colombia
ven <- colven[colven$NAME == "Venezuela", ]
border <- gIntersection(col, ven)
# get the distance
# this fails for me, that seems to be a bug in rgeos for these data
gDistance(sp, border, byid=TRUE)
在这个例子中,坐标参考系统是角度(经度/纬度),而rgeos没有处理它(它只适用于平面坐标)。但是在这里你可以使用geosphere的一个函数:
library(geosphere)
dist2Line(xy, border)
如果您希望哥伦比亚的所有网格单元到边界的距离,您也可以这样做:
rborder <- rasterize(border, raster)
dborder <- distance(rborder)
dbcol <- mask(dborder, col)
如果您想要从哥伦比亚境内到委内瑞拉边境的距离,只要在哥伦比亚境内旅行,请参阅gdistance
套餐中的功能。