栅格阈值分割提取水域多边形并裁剪原栅格技术求助
栅格数据水陆分割与裁剪实现方案
以下基于你已加载的terra库完成需求,terra对大型栅格数据的处理效率更高,建议优先使用而非raster包:
完整实现代码
library(terra) library(mapview) # 读取栅格数据(你已完成的步骤) xx <- rast("MyRaster.asc") # 直接用mapview查看terra栅格,无需转成raster对象 mapview(xx) # 1. 阈值分割:生成水域掩码(值<1为水域,标记为1,其他为NA) water_mask <- xx < 1 # 查看掩码结果 plot(water_mask, main = "水域掩码") mapview(water_mask) # 2. 将水域掩码转换为多边形要素 water_poly <- as.polygons(water_mask, dissolve = TRUE) # 移除属性表中不需要的字段(可选,精简数据) water_poly <- subset(water_poly, select = "lyr.1") # 查看多边形 plot(water_poly, main = "水域多边形") mapview(water_poly) # 3. 使用水域多边形裁剪原栅格,仅保留水域部分 water_raster <- mask(xx, water_poly) # 查看裁剪后的水域栅格 plot(water_raster, main = "裁剪后的水域栅格") mapview(water_raster) # 可选:保存结果 writeRaster(water_raster, "WaterOnlyRaster.tif", overwrite = TRUE) writeVector(water_poly, "WaterPolygons.shp", overwrite = TRUE)
关键步骤说明
- 阈值分割:直接通过逻辑运算
xx < 1生成水域掩码,比classify函数更简洁,适合二分类场景; - 转多边形:
as.polygons的dissolve = TRUE参数会将相邻的水域像素合并为单个多边形,减少要素数量,提升后续处理效率; - 栅格裁剪:
mask函数会保留原栅格中多边形覆盖区域的像素值,其余区域设为NA,完美匹配"仅保留水域部分"的需求。
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

