【问题标题】:Get distances between boundaries from an SpatialPolygon and raster pixels从空间多边形和光栅像素获取边界之间的距离
【发布时间】:2016-01-20 20:24:15
【问题描述】:

我正在尝试计算从栅格的几个像素到 R 中某些多边形的边界的距离,如图像所示。我有两个问题:

  1. 如何正确定义SpatialPolygon 对象的边界。我目前有两个选择,但我无法决定哪个是最好的。首先,我可以强制 SpatialPolygon as 一个 SpatialLines 对象,然后强制到 SpatialPoints。其次,我可以raster::rasterizeSpatialPolygon。我想每个选项都有其优点和缺点。

  2. 我只想从边界的一侧进行距离计算。在示例中,我只想要从哥伦比亚内部的像素到两国边界的距离。我尝试使用纬度参数“过滤”边界,但实际边界非常不规则,因此使用严格的截止值可能会导致错误。

以下代码可用于获取示例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)

提前致谢

【问题讨论】:

  • 你的图片没有显示出来。
  • 请提出一个好的 R 问题:创建一个自包含的可重现示例并显示一些代码
  • 我修改了问题并添加了一些代码 sn-ps 来获取 SpatialPolygon 数据和栅格。感谢您的推荐罗伯特。

标签: r geospatial distance raster euclidean-distance


【解决方案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 包中的函数。

【讨论】:

  • d &lt;- gDistance(polygon, p) 将计算从每个像素(现在的点)到边界或多边形质心的距离?好吧,我想要的是与红色边框的距离,而不是与蓝色边框的距离。多边形内的像素或多边形外的像素与蓝色边框之间的距离不是我感兴趣的。
  • 罗伯特,我添加了更多细节和可重现的代码,而无需下载任何东西。我这样做的前提是这篇文章可以帮助其他有类似问题的人,并使我的问题更容易理解。感谢您的建议。
  • 谢谢,这就是主意。
  • reos::gIntersect 给了我几个错误,因为多边形之间相交的复杂性(我认为)。我可以从一侧屏蔽光栅:col_raster &lt;- mask(raster, col) 并使用ven 计算到边界的距离吗?我也在考虑使用凸包来“简化”多边形,但这不是一个好的解决方案。