如何在R中利用AOI Shapefile裁剪河流Shapefile?区分裁剪与掩蔽
问题解决:用AOI裁剪河流数据(附crop与mask的区别)
先搞懂crop和mask的区别
- st_crop():拿AOI的矩形外接框切数据,不管AOI是啥形状,只留框里的部分,速度快,适合先缩小数据范围省算力。
- st_mask():严格按照AOI的实际形状切,只留落在AOI多边形内部的河流部分,边界贴合AOI,适合需要精确范围的场景。
你之前代码的问题
- 处理AOI时用了
tidy(),这会把空间对象转成ggplot用的普通数据框,丢了空间属性,后面根本没法用来裁切。 st_transform()是转坐标系的,参数得是目标CRS,不是AOI对象,你之前用错了。- 用
st_crop()时,AOI已经不是空间对象了,自然没法识别裁切范围。
正确操作代码
1. 正确读取AOI(必须保留空间属性)
推荐直接用sf包读取,全程用sf对象更省心:
library(sf) # 先定义坐标系,EPSG码根据你的实际情况调整,NAD83 UTM10一般是26910 crs.NAD83.UTM.Z10 <- st_crs("EPSG:26910") # 读取AOI并转成目标坐标系 shp.AOI <- st_read(dsn = "InputData/GIS/AOI", layer = "AOI") %>% st_transform(crs.NAD83.UTM.Z10)
2. 读取河流数据并统一坐标系
sf.streams <- st_read(file.path("InputData", "GIS", "Streams","Preprocessed","Rivers.shp"), stringsAsFactors = FALSE) %>% st_transform(crs.NAD83.UTM.Z10) # 必须和AOI坐标系一致,不然裁切会出错
3. 二选一:裁切河流数据
快速裁切(用矩形框,省算力首选)
streams_cropped <- st_crop(sf.streams, shp.AOI)
精确裁切(贴合AOI形状)
streams_masked <- st_mask(sf.streams, shp.AOI)
验证结果(可选)
用ggplot快速看裁切后的效果:
library(ggplot2) ggplot() + geom_sf(data = shp.AOI, fill = "lightblue", alpha = 0.3) + geom_sf(data = streams_masked, color = "darkblue")
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

