R:是否可以仅从栅格图层的非NA区域采样随机点?

时间:2018-07-11 19:34:00

标签: r random polygon intersection raster

我一直在尝试使用spsample从栅格图层(例如,来自https://sites.ualberta.ca/~ahamann/data/climatewna.html的Lambert Conformal Conic投影的24个气候变量图层中的任意一个)中自定义数量的点采样},在范围由多边形I定义的区域内,该多边形是通过围绕一组点形成圆并聚合其边界而生成的,但无法弄清楚如何仅对定义的该区域内的栅格部分进行采样。下图显示了我正在使用的栅格图层和多边形:enter image description here

我知道可以在该区域内进行采样,然后使用栅格图层作为遮罩从采样点中删除该图层的NA区域内的那些,但是这样做可以减少背景数量剩余的点数少于spsample函数中用户指定的点数。这是我为完成此操作而编写的代码:

circles <- circles(coordinate_dat_train, 150000)
circle_polygon <- polygons(circles)
proj4string(circle_polygon) <- CRS("+proj=lcc +lat_1=49 +lat_2=77 +lat_0=0 +lon_0=-95 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0")

sample_mask <- raster("C:/...path.../cv_NORM_6190_AHM.tif")
r_sample <- spsample(circle_polygon, 1000, type='random')
r_sample_cells <- as.data.frame(extract(sample_mask, r_sample, cellnumbers = TRUE))
r_sample_cells <- as.data.frame(r_sample_cells[!is.na(r_sample_cells$cv_NORM_6190_AHM),])
r_sample_cells <- r_sample_cells[,-2]
r_sample_coords <- xyFromCell(sample_mask, r_sample_cells, spatial = TRUE)

我也尝试使用rasterToPolygon函数将栅格转换为多边形,找到该多边形与原始栅格的交集,并仅在该交集内进行采样,但要使用我正在使用的栅格图层由于太大,完成此过程所需的时间不可行。

是否有其他方法可以完成此操作,并且在计算时间方面相当快?预先感谢!

1 个答案:

答案 0 :(得分:0)

从以多边形为边界的栅格中选择这样的一组点的一种方法是,首先用多边形对栅格进行遮罩,然后通过从被遮罩的栅格中仅选择那些包含非NA值的像元来生成新的栅格。在这种情况下,可以这样做:

sample_mask <- raster("C:/...path.../cv_NORM_6190_AHM.tif")
# This command masks the raster so that its extent equals that of the circle polygon.
mask <- mask(sample_raster, circle_polygon)
# This command creates a new raster layer consisting of non-NA values from the masked layer.
non_na_raster <- !is.na(mask)

然后,使用sampleRandom函数(该函数不会从一个像元中选择一个以上的点,除非要选择的点数超过了所讨论的栅格图层中的像元数),明确地希望从蒙版栅格的地面区域中选择的点数,如下所示:

# This command counts the number of cells within the non-NA raster layer, giving an accurate measure of the
# terrestrial area from which background points are drawn, so that sampling density may be determined.
cellStats(non_na_raster, 'sum') 
r_sample <- as.data.frame(sampleRandom(x=non_na_raster, size = 1000, na.rm = TRUE, ext = circle_polygon, xy = TRUE))

可以使用其他一些随机点选择功能,例如spsample,但是sampleRandomraster程序包特有的功能,并且避免了对同一程序包的多次采样栅格像元,这就是我在这种情况下使用它的原因。