我正在尝试投影栅格。在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
我希望这两种方法都能产生相同的重新投影栅格,相同的范围和相同的(-100,50)值。但是,他们显然不:(
—
EDi
这两个程序正在创建要变形的不同网格。即使双线性采样完全相同,要插值的点也位于不同的位置,并且您会有不同的答案。原点和像素大小不同。您可以在gdalwarp(-te,-tr等)中设置一些标志,以尝试重现R版本,然后比较像素值并查看它们之间的差异。
我多次发现,即使不使用GCP ,使用
—
christoph
-order
标志(“用于弯曲的多项式的阶数”)gdalwarp
也会产生更准确的结果。