Gdalwarp ve project arasındaki fark


9

Bir Raster yansıtmaya çalışıyorum. R'de bunun projectRaster()işlevi vardır (tamamen tekrarlanabilir bir örneğin altında):

# 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')

Hangi iyi çalışıyor. Ancak oldukça yavaş.

Hızı arttırmak için gdalwarpbunun yerine kullanmayı düşünüyorum (bir SSD ile disk / R'den / R'ye okuma ve yazma maliyeti çok yüksek değil).

Ancak, projectRaster()kullanarak sonuçları çoğaltmak mümkün değil 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)

Çalışıyor gibi görünüyor, ancak sonuçlar farklı:

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

Neyi özlüyorum / yanlış yapıyorum?

Başka (daha hızlı) alternatifler var mı projectRaster()?


Hiç kimse? Tamamen tekrarlanabilir bir örnek
sağladım

Ne bekliyorsun? Her iki seçenek de aynı projeyi kullanıyor mu?

Her iki yöntemin de aynı yeniden yansıtılmış raster, aynı ölçüde ve aynı değeri (-100, 50) olarak vermesini bekliyorum. Ancak, görünüşe göre yapmazlar :(
EDi

1
İki program, çarpıtma için farklı ızgaralar oluşturuyor. Bilineer örnekleme tam olarak aynı olsa bile, enterpolasyon yapılan noktalar farklı yerlerdedir ve farklı cevaplarınız olacaktır. Kökeni ve piksel boyutları farklıdır. R sürümünü yeniden oluşturmayı denemek ve daha sonra piksel değerlerini karşılaştırmak ve ne kadar farklı olduklarını görmek için gdalwarp'de (-te, -tr, vb.) Bazı bayraklar ayarlayabilirsiniz.

Birçok durumda, GSO kullanmadan bile -orderbayrağı ("çarpıtma için kullanılan polinom sırası") gdalwarpkullanmanın daha doğru sonuçlar verdiğini buldum .
christoph

Yanıtlar:


10

Güzel ve tekrarlanabilir bir soru. Şahsen, farkın sebebinin çiftear yeniden yapılanma uygulamalarında olmasını beklerdim. Açıkçası iki yaklaşım için kaynak koduna bakabilirsiniz, ancak bunun büyük bir abartı olmasını beklerdim.
R uygulamasının ham GDAL sürümünden daha büyük "hatalar" / "değişiklikler" getirdiği anlaşılıyor (en azından sürümlerim ve testlerimde en az - projeRaster GD-+ -0.002 civarında değer verirken + -0.01 civarında değişiklikler getiriyor).

Her iki yaklaşımı da en yakın komşu projeksiyonunu kullanarak karşılaştırırsanız, beklendiği gibi eşleşirler.


Projeksiyon yöntemleriyle bu ipucu için teşekkürler! Zaman bulursam bunlara daha yakından bakacağım (Ancak, R'ye daha sonra C'ye daha aşinayım).
EDi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.