使用rmapshaper调用系统mapshaper裁剪sf图层过慢且转GeoJSON报错
问题排查与解决方案
一、sf图层裁剪耗时异常问题
执行代码:
ms_clip(MySfLayer, MySfClippingLayer, sys=TRUE, sys_mem=30)
已启用系统mapshaper(sys=TRUE)并分配30GB内存,mapshaper 0.6.102已正确安装并配置到PATH,R及rmapshaper均为最新版本,但R中处理耗时数小时,直接在Windows系统中使用mapshaper执行相同操作却速度极快。怀疑rmapshaper未调用系统mapshaper,或sf相关预处理步骤耗时过长。
排查与解决步骤
- 验证系统mapshaper调用状态
运行rmapshaper::check_sys_mapshaper(),确认返回TRUE。若返回FALSE,说明环境变量PATH未生效,可重启R会话,或手动指定mapshaper路径:options(rmapshaper.mapshaper_path = "C:/你的mapshaper安装路径/mapshaper.exe") - 绕开自动转换的耗时步骤
手动将sf图层导出到短路径的GeoJSON文件,再传入ms_clip,跳过R内部的sf到GeoJSON转换:# 创建临时目录(确保路径短) dir.create("C:/temp_ms", showWarnings = FALSE) # 导出图层 sf::st_write(MySfLayer, "C:/temp_ms/target.geojson", delete_dsn = TRUE) sf::st_write(MySfClippingLayer, "C:/temp_ms/clip.geojson", delete_dsn = TRUE) # 执行裁剪 result <- ms_clip("C:/temp_ms/target.geojson", "C:/temp_ms/clip.geojson", sys=TRUE, sys_mem=30)
二、GeoJSON格式裁剪时的文件名过长报错
执行代码:
MySfLayer <- ms_clip(MyGeoJLayer, MyGeoJClippingLayer, sys=TRUE, sys_mem=30)
报错信息:
Allocating 30 GB of heap memory [o] Wrote C:\Users\JLDUPO~1\AppData\Local\Temp\RtmpScM8M9\filec6066891abc.geojson Error in unlink(c(target_layer, overlay_layer)) : file name conversion problem -- name too long?
解决方法
问题源于Windows默认的文件路径长度限制(260字符),R生成的临时文件路径超出限制。可通过以下方式解决:
- 修改R的临时目录到短路径
Sys.setenv(TMP = "C:/temp") Sys.setenv(TEMP = "C:/temp") # 重新执行裁剪 MySfLayer <- ms_clip(MyGeoJLayer, MyGeoJClippingLayer, sys=TRUE, sys_mem=30) - 手动保存GeoJSON到短路径文件
参考第一部分的手动导出方法,直接传入短路径的文件路径到ms_clip,避免使用R自动生成的长临时文件名。
内容的提问来源于stack exchange,提问作者Jean-Luc Dupouey
相关产品推荐
相关产品推荐

