You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:22:18