Разница между gdalwarp и projectRaster

9

Я пытаюсь спроектировать растр. В R есть projectRaster()функция to this (ниже полностью воспроизводимого примера):

# 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()?

EDi
источник
Никто? Я предоставил полностью воспроизводимый пример (должен работать с Linux или Mac) ...
EDi
Что вы ожидаете? Оба варианта используют один и тот же proj.4?
Я ожидаю, что оба метода дают один и тот же повторно спроектированный растр, одинаковый экстент и одинаковое значение в (-100, 50). Тем не менее, они, очевидно, не :(
EDi
1
Две программы создают разные сетки для деформации. Даже если билинейная выборка была точно такой же, интерполируемые точки находятся в разных местах, и у вас будут разные ответы. Происхождение и размеры пикселей разные. Вы можете установить некоторые флаги в gdalwarp (-te, -tr и т. Д.), Чтобы попытаться воспроизвести версию R, а затем сравнить значения пикселей и посмотреть, насколько они различны.
Я неоднократно обнаруживал, что использование -orderфлага («порядок многочлена, используемого для деформации») gdalwarpдаже без использования опорных точек дает более точные результаты.
Кристоф

Ответы:

10

Хороший и воспроизводимый вопрос. Лично я ожидаю, что причина различий заключается в реализации билинейной репроекции. Очевидно, что вы можете изучить исходный код для двух подходов, но я ожидаю, что это будет чрезмерным излишним.
Похоже, что реализация R вносит большие «ошибки» / «изменения», чем необработанная версия GDAL (по крайней мере, в моих версиях и тестах - projectRaster вносит изменения около + -0,01, в то время как GDAL дает значения около + -0,002).

Если вы сравниваете оба подхода, используя репроекцию ближайшего соседа, они соответствуют ожидаемым.

Миккель Лидхольм Расмуссен
источник
Спасибо за эту подсказку с методами проекции! Если я найду время, я углублюсь в это (однако, я больше знаком с R, чем с C).
EDi