ความแตกต่างระหว่าง 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

คุณคาดหวังอะไร ตัวเลือกทั้งสองใช้โปรแกรมเดียวกันหรือไม่

ฉันคาดหวังว่าทั้งสองวิธีจะให้ภาพที่มีการฉายซ้ำแบบแรสเตอร์เดียวกันระดับเดียวกันและค่าเดียวกันที่ (-100, 50) อย่างไรก็ตามดูเหมือนว่าพวกเขาจะไม่ :(
EDi

1
สองโปรแกรมกำลังสร้างกริดที่แตกต่างกันเพื่อแปรปรวน แม้ว่าการสุ่มตัวอย่างไบนิอาร์จะเหมือนกันทุกประการ แต่คะแนนที่ได้รับการแก้ไขอยู่ในสถานที่ต่างกันและคุณมีคำตอบที่แตกต่างกัน ต้นกำเนิดและขนาดพิกเซลต่างกัน คุณสามารถตั้งค่าสถานะบางอย่างใน gdalwarp (-te, -tr, ฯลฯ ) เพื่อลองและสร้างซ้ำรุ่น R แล้วเปรียบเทียบค่าพิกเซลและดูความแตกต่างของพวกเขา

ฉันพบหลายครั้งที่ใช้-orderแฟล็ก("คำสั่งของพหุนามใช้สำหรับแปรปรวน") gdalwarpแม้จะไม่ใช้ GCPs ก็ให้ผลลัพธ์ที่แม่นยำยิ่งขึ้น
christoph

คำตอบ:


10

คำถามที่ดีและทำซ้ำได้ โดยส่วนตัวแล้วฉันคาดหวังว่าเหตุผลของความแตกต่างคือในการนำไปใช้ของการคัดค้านแบบสองทาง เห็นได้ชัดว่าคุณสามารถดูซอร์สโค้ดสำหรับทั้งสองวิธี แต่ฉันคาดหวังว่ามันจะเกินความเป็นจริงอย่างมาก
ปรากฏว่าการใช้งาน R แนะนำ "ข้อผิดพลาด" / "การเปลี่ยนแปลง" ที่ใหญ่กว่ารุ่น GDAL แบบดิบ (อย่างน้อยในรุ่นและการทดสอบของฉัน - projectRaster แนะนำการเปลี่ยนแปลงประมาณ + -0.01 ในขณะที่ GDAL ให้ค่าประมาณ + -0.002)

หากคุณเปรียบเทียบทั้งสองวิธีโดยใช้การคัดแยกเพื่อนบ้านที่ใกล้ที่สุดซึ่งตรงกับที่คาดไว้


ขอบคุณสำหรับคำแนะนำนี้ด้วยวิธีการฉาย! ถ้าฉันหาเวลาฉันจะมองลึกเข้าไปในสิ่งเหล่านั้น (อย่างไรก็ตามฉันคุ้นเคยกับ R แล้วด้วย C)
EDi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.