Windows平台R语言投影字符串如何引用含空格的当前目录
R空间分析PROJ网格文件识别问题解决方案
问题复现与已知测试结论
空间分析工作流中调用自定义投影字符串时,程序无法定位nzgd2kgrid0005.gsb坐标转换网格文件,已完成测试的方案效果如下:
- 官方文档未明确nadgrids类网格文件的默认检索路径,将文件放在当前项目目录、
sf包安装路径下的proj文件夹均无法被识别 - 将文件复制到C盘根目录、投影字符串内写入C盘绝对路径可正常调用,但该方案可移植性极差,普通用户默认无C盘根目录写入权限
- 用
here()函数拼接项目内文件路径时,若路径包含空格(如OneDrive - DairyNZ Limited这类带空格的目录名),投影字符串调用会失败 - 通过Windows cmd的
dir /X命令获取带空格目录的8.3格式短名称(如OneDrive目录对应短名ONEDRI~1)替换原路径后可正常运行,但短名随设备分区、目录创建顺序变化,无法跨设备通用
可行解决方案
方案1:获取当前环境PROJ网格文件真实检索路径
PROJ库检索网格文件的路径由当前绑定的版本、运行环境决定,不要手动猜路径,直接在R中运行以下命令即可拿到所有有效检索目录:
library(sf) # 返回当前环境下PROJ会扫描的所有网格文件路径 sf_proj_search_paths()
将nzgd2kgrid0005.gsb文件放到上述命令返回的任意一个路径下,后续投影字符串直接写文件名(不需要加绝对路径)即可全局调用,不需要针对单个项目重复存放文件。
多数情况下手动存放至
sf安装目录下的proj文件夹不生效,是因为不同版本sf绑定的PROJ资源路径存在差异,以该函数返回的实际路径为准即可。如果返回的路径包含系统级目录,优先选择用户目录下的路径存放,避免权限问题。
方案2:R内自动生成兼容路径,适配带空格目录
不需要手动查询8.3短名,直接通过R内置函数将here()返回的路径转换为PROJ可识别的格式,跨设备通用,不需要额外安装依赖包:
library(here) # 路径转换函数,自动适配不同操作系统 get_valid_grid_path <- function(file_name) { raw_path <- here(file_name) if (.Platform$OS.type == "windows") { # Windows下自动转成无空格8.3短路径,规避空格识别问题 utils::shortPathName(normalizePath(raw_path, winslash = "/", mustWork = TRUE)) } else { # POSIX系统(macOS/Linux)原生支持带空格路径,直接返回标准化路径即可 normalizePath(raw_path, winslash = "/", mustWork = TRUE) } } # 用法示例 gsb_valid_path <- get_valid_grid_path("nzgd2kgrid0005.gsb") # 拼接投影字符串时直接传入gsb_valid_path即可 crs_def <- paste0("+proj=nzmg +datum=nzgd2000 +nadgrids=", gsb_valid_path, " +units=m")
使用时只要把nzgd2kgrid0005.gsb放在项目根目录随项目同步,不同设备打开项目都能自动生成适配本地环境的有效路径。
方案3:零配置最简实现
不需要手动管理网格文件、拼接投影字符串:
- 若使用的坐标系有对应EPSG代码,直接通过EPSG代码调用
sf::st_crs()即可,sf会自动下载、缓存对应网格文件到用户目录,全程不需要手动操作gsb文件 - 自定义投影时,通过
sf::st_crs()构建坐标参考系对象,直接传入网格文件的相对路径,sf会自动处理路径转义、空格兼容问题,不需要手动做路径格式转换。
内容的提问来源于stack exchange,提问作者Mark Neal
相关产品推荐
相关产品推荐

