从SpatialPolygon和栅格像素获取边界之间的距离

时间:2016-01-20 20:24:16

标签: r geospatial distance raster euclidean-distance

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

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

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

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

    Example

    提前致谢

1 个答案:

答案 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套餐中的功能。