如何在R中快速筛选0.25分辨率全球点矢量的陆地区域点?
更快提取陆地区域点的实用方法
针对0.25度全球规则点的陆地筛选,terra::extract效率偏低的问题,试试这几个更高效的方案:
1. 用terra::intersect直接替代extract
如果你只需要保留落在陆地上的点,intersect是更直接的选择——它直接计算点和面的空间交集,返回落在陆地区域内的点要素,比extract的属性提取逻辑更轻量化,速度快很多。
# 假设你的点矢量是points,世界面要素是world land_points <- terra::intersect(points, world)
如果不需要保留面要素的属性,后续可以用terra::select(land_points, names(points))只保留点的原始字段。
2. 先简化世界面要素
rnaturalearth的世界面包含大量细碎岛屿,会大幅增加空间计算的复杂度。先简化面要素的顶点数,完全不影响0.25度分辨率的点匹配,却能显著提速:
# 用0.1度的容差简化(可根据需求调整,容差越大简化程度越高) world_simplified <- terra::simplifyGeom(world, tolerance = 0.1) land_points <- terra::intersect(points, world_simplified)
3. 栅格掩码筛选(规则格点最优解)
因为你的点是规则的0.25度栅格点,用栅格掩码的方式效率最高,避免了矢量交集的复杂计算:
# 创建和点同范围、同分辨率的空栅格 r <- terra::rast(points, res = 0.25) # 将世界面转为陆地掩码栅格(陆地标记为1,海洋为NA) land_mask <- terra::rasterize(world, r, field = 1) # 筛选出掩码中不为NA的点(即陆地点) land_points <- points[!is.na(terra::extract(land_mask, points)[, 1]), ]
4. 确认使用经纬度投影
确保点和面都使用WGS84(EPSG:4326)经纬度投影,这是全球数据最适合的投影,避免非经纬度投影带来的变形和计算损耗:
points <- terra::project(points, "EPSG:4326") world <- terra::project(world, "EPSG:4326")
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

