假设我有一个DatabPRI格栅和一个具有两个不同cr的简单特征(sf)对象(点).我需要转换格栅的crs以匹配sf个数据的crs(反之亦然,但我更希望摆脱Databis sin系统).各种try 都没有让我找到解决方案,即,在同一CRS中具有该格栅和sf以进行进一步可视化、处理等.请帮助我如何做到这一点?以下是我try 过的几个 Select :

library(terra)
library(sf)

lai <- terra::rast("lai.tif")
terra::crs(lai) #check crs of lai

plots <- readRDS("plots.rds")
sf::st_crs(plots) #check crs of sf

#Trial 1
plots_tr <- sf::as_Spatial(plots) #transform the sf and get the crs
lai_pr1 <- terra::project(lai, "+proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs") #project the raster using the crs of the transformed sf
terra::plot(lai_pr1) #plot raster
plot(plots_tr, add=T, pch=19, col="black", cex=0.1) #overlay points

#Trial 2
lai_pr2 <- lai
terra::crs(lai_pr2) <- "+proj=utm +zone=31 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs" # replace lai crs
terra::plot(lai_pr2) #plot raster
plot(plots_tr, add=T, pch=19, col="black", cex=0.1) #overlay points

#Trial 3
lai_pr3 <- terra::project(lai, "epsg:25831") #project the raster using the EPSG code of the sf data (i.e., ETRS89 / UTM zone 31N)
terra::plot(lai_pr3) #plot raster
plot(plots_tr, add=T, pch=19, col="black", cex=0.1) #overlay points

链接到数据以运行此示例:

莱 -https://github.com/frandadamo/frandadamo/blob/main/lai.tif<

地块-https://github.com/frandadamo/frandadamo/blob/main/plots.rds

也许问题是sf的crs是WKT,而格栅的crs不是?此外,使用sf而不使用sf::as_Spatial()也不会改变结果.我还try 用st_transform()更改sf的crs.我读了上面已经发布的许多问题,但无法得到解决方案.Maybe spTransform()

希望这不会太傻.非常感谢.

推荐答案

修复了Databis文件的坐标参考系后,使用sf::st_transform()terra::project()非常简单,具体取决于您想要保留的crs.对于分析,我会继续重新投影载体数据并保持网格原样,但如果您愿意,可以随时删除DAB投影(只是不要忘记重新采样).而且,绝对没有必要使用{sp}.

library(terra)
#> terra 1.7.71
library(sf)
#> Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE

lai <- terra::rast("lai.tif")
plots <- readRDS("plots.rds")

# fix MODIS crs
modis_crs <- "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +R=6371007.181 +units=m +no_defs"
terra::crs(lai) <- modis_crs

# option 1: reproject vector data 
plots_reproj <- sf::st_transform(plots, modis_crs)

terra::plot(lai, main = "MODIS Sinusoidal")
plot(plots_reproj, add = TRUE, pch = 19, col="black", cex = 0.1)


# option 2: reproject raster data
lai_reproj <- terra::project(lai, "epsg:25831")

terra::plot(lai_reproj, main = "EPSG:25831")
plot(plots, add = TRUE, pch = 19, col="black", cex = 0.1)

创建于2024年4月27日,共有reprex v2.1.0

R相关问答推荐

R kableExtra在插入水平线时添加额外的空白行

返回句子中最长的偶数长单词

有没有方法将paste 0功能与列表结合起来?

使用lapply的重新定位功能

在R中查找每个组不同时间段的总天数

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

用黄土法确定区间

二维样条,严格以一个参数递增

提取具有连续零值的行,如果它们前面有R中的有效值

在R中无法读入具有Readxl和lApply的数据集

根据日期从参考帧中创建不同的帧

从多个线性回归模型中提取系数

Ggplot2中geom_tile的动态zoom

基于Key->Value数据帧的基因子集相关性提取

将多个列合并为一个列的有效方法是什么?

自定义交互作用图的标签

随机 Select 的非NA列的行均数

使用同一行中的前一个值填充R矩阵中的缺失值

roxygen2正在处理太多的文件

如何用不同长度的向量填充列表?