gdalwarp和projectRaster之间的区别


9

我正在尝试投影栅格。在R中有对此projectRaster()功能(在一个完全可复制的示例下面):

# example Raster
require(raster)
r <- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40)
r <- setValues(r, 1:ncell(r))
projection(r)
# project to
newproj <- "+init=epsg:4714"


# using raster package to reproject
pr1 <- projectRaster(r, crs = CRS(newproj), method = 'bilinear')

哪个工作正常。但是,它很慢。

为了提高速度,我还是gdalwarp改用了(使用SSD时,从磁盘/ R读写数据的成本不是很高)。

但是,我无法重现projectRaster()使用的结果gdalwarp

# using gdalwarp to reproject
tf <- tempfile(fileext = '.tif')
tf2 <- tempfile(fileext = '.tif')
writeRaster(r, tf)
system(command = paste(paste0("gdalwarp -t_srs \'", newproj, "\' -r bilinear -overwrite"), 
                       tf,
                       tf2))
pr2 <- raster(tf2)

看来可行,但是结果却不同:

# Info
system(command = paste("gdalinfo", 
                       tf))
system(command = paste("gdalinfo", 
                       tf2))

# plots
plot(r)
plot(pr1)
plot(pr2)

#extents
extent(r)
extent(pr1)
extent(pr2)

# PROJ4
proj4string(r)
proj4string(pr1)
proj4string(pr2)

# extract value
take <- SpatialPoints(matrix(c(-100, 50), byrow = T, ncol = 2), proj4string = CRS(newproj))
plot(take, add = TRUE)
extract(pr1, take)
extract(pr2, take)

我想念/做错了什么?

还有其他(更快的)替代方法projectRaster()吗?


没有人?我提供了一个完全可复制的示例(应在Linux或Mac上使用)...
EDi

你在期待什么?两种选择都使用相同的proj.4吗?

我希望这两种方法都能产生相同的重新投影栅格,相同的范围和相同的(-100,50)值。但是,他们显然不:(
EDi

1
这两个程序正在创建要变形的不同网格。即使双线性采样完全相同,要插值的点也位于不同的位置,并且您会有不同的答案。原点和像素大小不同。您可以在gdalwarp(-te,-tr等)中设置一些标志,以尝试重现R版本,然后比较像素值并查看它们之间的差异。

我多次发现,即使不使用GCP ,使用-order标志(“用于弯曲的多项式的阶数”)gdalwarp也会产生更准确的结果。
christoph

Answers:


10

好的和可重复的问题。我个人认为,差异的原因在于双线性重投影的实现。您显然可以研究这两种方法的源代码,但是我希望这是一个很大的矫kill过正。
与原始GDAL版本相比,R实现似乎引入了更大的“错误” /“更改”(在我的版本和测试中至少-projectRaster引入了大约+ -0.01的更改,而GDAL提供了大约+ -0.002的值)。

如果您使用最近邻居重投影来比较这两种方法,则它们将按预期进行匹配。


感谢您使用投影方法的提示!如果有时间,我会更深入地研究这些内容(但是,我比R更熟悉C)。
EDi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.