将SpatVector转换为SpatRaster坐标系后对象异常,如何解决?
问题
我正遵循最佳实践将SpatVector投影转换为SpatRaster的坐标系,但转换后的对象无法正常工作。以下是基于R 4.4.2版本制作的可复现数据集:
# Libraries: library(terra) # Make a raster file from scratch, with projection EPSG:4326: t <- terra::rast(crs = "EPSG:4326", xmin = -124.7722, xmax = -67.0648, ymin = 25.0631, ymax = 49.396, nrows = 585, ncols = 1386) # Make a SpatVector from scratch, with EPSG:4269: e <- ext(-87.24353, -77.06105, 32.76981, 39.46601) p <- as.polygons(e, crs = "EPSG:4269") # Making a new vector object by reprojecting the spatvector with the projection of the spatraster: sca_proj <- terra::project(p, terra::crs(t))
执行代码后出现如下警告:
Warning messages: 1: In class(object) <- "environment" : Setting class(x) to "environment" sets attribute to NULL; result will no longer be an S4 object 2: PROJ: Cannot open https://cdn.proj.org/us_noaa_alhpgn.tif: schannel: CertGetCertificateChain trust error CERT_TRUST_IS_UNTRUSTED_ROOT (GDAL error 1) 3: PROJ: Cannot open https://cdn.proj.org/us_noaa_inhpgn.tif: schannel: CertGetCertificateChain trust error CERT_TRUST_IS_UNTRUSTED_ROOT (GDAL error 1) 4: PROJ: Cannot open https://cdn.proj.org/us_noaa_MD.tif: schannel: CertGetCertificateChain trust error CERT_TRUST_IS_UNTRUSTED_ROOT (GDAL error 1)
绘图时发现该对象已不是结构正常的多边形:
plot(sca_proj) Error in x@ptr$linesNA() : negative length vectors are not allowed
解决方案
问题根源在于PROJ地理转换网格文件加载失败,以及初始矢量对象的结构异常,以下是具体修复方法:
1. 解决PROJ网格文件访问问题
警告中的PROJ错误是因为无法远程加载高精度 datum 转换所需的网格文件(EPSG:4269到EPSG:4326的转换依赖这类文件)。可以通过两种方式处理:
- 禁用远程网格下载:设置环境变量让PROJ使用内置低精度转换,避免网络证书问题:
Sys.setenv(PROJ_NETWORK = "OFF") - 手动添加本地网格文件:找到R中PROJ的
projdata目录(可通过terra::gdal()查看GDAL/PROJ安装路径),下载对应的网格文件(如us_noaa_alhpgn.tif)放入该目录。
2. 修复矢量对象结构
直接用as.polygons(ext())生成的矢量在投影时可能出现结构异常,换用更稳定的方式创建初始多边形:
# 方式1:直接定义多边形WKT p <- vect("POLYGON ((-87.24353 32.76981, -77.06105 32.76981, -77.06105 39.46601, -87.24353 39.46601, -87.24353 32.76981))", crs = "EPSG:4269") # 方式2:重新构建ext生成的多边形结构 e <- ext(-87.24353, -77.06105, 32.76981, 39.46601) p <- vect(as.polygons(e), crs = "EPSG:4269")
再执行投影操作:
sca_proj <- terra::project(p, terra::crs(t))
3. 验证修复效果
运行plot(sca_proj)应该能正常显示多边形,也可以用summary(sca_proj)检查矢量对象的结构是否合规。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

