如何将streamstats的delineateWatershed输出直接转为sf对象,跳过shapefile读写环节
内存内直转sf的实现方案
核心逻辑
streamstats包的delineateWatershed返回的原始ws对象,本身已经在内存中存储了完整的流域边界几何、元数据和坐标参考系信息。原有流程中writeShapefile的作用仅仅是把内存中已有的数据序列化为shapefile格式写到本地磁盘,这一步完全可以省略,直接在内存中把提取到的几何转换为标准sf对象即可。
可复现代码
# 正常调用流域提取函数,不需要提前设置工作目录(写盘流程已跳过) ws <- delineateWatershed(xlocation = -123.9637, ylocation = 40.06269, crs = 4326) # 从ws对象内嵌的边界字段直接读取几何,生成sf对象 ws_sf <- sf::st_read( dsn = ws$boundary, crs = 4326, quiet = TRUE # 关闭读取日志输出,避免控制台刷屏 ) # 可选:把ws对象存储的流域元数据补充到sf属性表,和原落盘shapefile的属性结构完全对齐 ws_sf <- ws_sf |> transform( drainage_area = ws$characteristics$drainage_area, outlet_x = ws$parameters$xlocation, outlet_y = ws$parameters$ylocation )
方案对比优势
- 零磁盘占用:没有shapefile四类配套文件的写入、读取流程,所有转换操作在内存完成
- 无冗余数据副本:原流程会先为每个单独流域写一份本地shapefile(第一份几何副本),后续合并多份边界时生成的总shapefile为第二份几何副本;新流程跳过单份shapefile的写入步骤,所有流域对象在内存中暂存后直接合并写盘,完全消除中间冗余副本
- 兼容性完全等价:生成的sf对象和原流程
st_read读入的对象结构、空间参考、属性字段完全一致,可以直接用于后续的st_union合并、空间连接、可视化等操作
注意事项
- 生成sf时传入的CRS参数必须和调用
delineateWatershed时指定的crs参数完全一致,避免空间参考不匹配导致的几何偏移 - 如果
delineateWatershed因为网络问题没有成功拉取到边界数据,转换步骤会和原落盘流程一样抛出对应报错,不存在额外的稳定性问题
内容的提问来源于stack exchange,提问作者Nathan Mack
相关产品推荐
相关产品推荐

