如何在R语言dismo包中设置海洋物种分布映射的范围——解决仅陆地生成采样点的问题
解决海洋入侵牡蛎物种分布映射的采样范围问题
我帮你梳理下解决这两个核心问题的具体步骤,都是基于你当前用的dismo和raster包来实现的:
1. 让随机采样点只落在海洋区域
你当前的采样点落在陆地上,核心原因是mask参数默认指向了包含陆地的栅格,我们需要先手动构建海洋专属的掩码:
第一步:生成研究区域的海洋栅格掩码
# 加载所需包(如果没加载的话) library(dismo) library(raster) library(maptools) # 定义你的研究范围(和绘图参数保持一致) study_extent <- extent(0, 30, 50, 70) # 创建和原mask分辨率一致的空白栅格 base_raster <- raster(study_extent, res = res(mask)) # 将陆地矢量数据栅格化,陆地标记为1,海洋为NA land_raster <- rasterize(wrld_simpl, base_raster, field = 1) # 反选得到海洋掩码:海洋区域保留值,陆地设为NA marine_mask <- mask(base_raster, land_raster, inverse = TRUE)第二步:用海洋掩码生成随机采样点
把randomPoints的mask换成上面的marine_mask,这样采样点就只会落在海洋区域了:background <- randomPoints(mask = marine_mask, n = nrow(obs.data), ext = study_extent, extf = 1.25)
2. 采样排除当前地理范围的区域(即研究区以外的所有区域)
如果需要在当前绘制区域之外生成采样点,我们可以先创建排除研究区的全局掩码,还可以结合海洋限制:
第一步:构建排除研究区的海洋掩码
# 创建和原mask分辨率一致的全球栅格 global_raster <- raster(res = res(mask)) # 将研究范围转为多边形,用于后续掩码操作 study_poly <- as(study_extent, "SpatialPolygons") crs(study_poly) <- crs(global_raster) # 先生成全球海洋掩码 global_land <- rasterize(wrld_simpl, global_raster, field = 1) global_marine <- mask(global_raster, global_land, inverse = TRUE) # 排除研究区域,得到研究区外的海洋掩码 exclude_study_marine_mask <- mask(global_marine, study_poly, inverse = TRUE)第二步:生成研究区外的随机采样点
background_exclude <- randomPoints(mask = exclude_study_marine_mask, n = nrow(obs.data))
验证绘图示例
你可以用下面的代码验证采样结果:
# 验证海洋采样点 plot(wrld_simpl, xlim = c(0, 30), ylim = c(50, 70), axes = TRUE, col = "grey95", main = "Presence and Marine Pseudo-absence Points") points(background, col = "grey30", pch = 1, cex = 0.75) # 验证研究区外的采样点(扩大绘图范围) plot(wrld_simpl, xlim = c(-10, 40), ylim = c(40, 80), axes = TRUE, col = "grey95", main = "Pseudo-absence Points (Excluding Study Area)") points(background_exclude, col = "blue", pch = 1, cex = 0.75)
内容的提问来源于stack exchange,提问作者amerray
相关产品推荐
相关产品推荐

