Різниця між 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-версію, а потім порівняти значення пікселів і побачити, наскільки вони відрізняються.

Я неодноразово виявляв, що використання -orderпрапора ("порядок поліноміна, що використовується для деформації") gdalwarpнавіть без використання GCP давав більш точні результати.
Крістоф

Відповіді:


10

Приємне і відтворюване питання. Особисто я б очікував, що причина різниці полягає у здійсненні білінеарної репроекції. Ви, очевидно, можете переглянути вихідний код для двох підходів, але я б очікував, що це буде надмірна надмірна кількість.
Виявляється, реалізація R вводить більші "помилки" / "зміни", ніж необроблена версія GDAL (як мінімум, у моїх версіях та тестах - projectRaster вносить зміни приблизно до -0,01, тоді як GDAL дає значення приблизно + -0,002).

Якщо ви порівнюєте обидва підходи, використовуючи перепроектування найближчого сусіда, то вони відповідають очікуваному.


Дякуємо за цю підказку методами проекції! Якщо я знайду час, я погляну глибше на ці (Однак, я більше знайомий з R, а потім з C).
EDi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.