Sự khác biệt giữa gdalwarp và projectRaster


9

Tôi đang cố gắng để chiếu Raster. Trong R có projectRaster()chức năng này (bên dưới một ví dụ có thể tái tạo hoàn toàn):

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

Mà hoạt động tốt. Tuy nhiên nó khá chậm.

Để tăng tốc độ, mặc dù tôi phải sử dụng gdalwarpthay thế (với SSD, chi phí đọc và ghi từ / sang đĩa / R không cao lắm).

Tuy nhiên, tôi không thể sao chép kết quả của projectRaster()việc sử dụng 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)

Nó dường như hoạt động, tuy nhiên kết quả là khác nhau:

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

Tôi đang thiếu / làm gì sai?

Có những lựa chọn thay thế (nhanh hơn) khác projectRaster()?


Không một ai? Tôi đã cung cấp một ví dụ có thể tái tạo hoàn toàn (nên hoạt động với Linux hoặc Mac) ...
EDi

Bạn đang mong đợi điều gì? Cả hai tùy chọn sử dụng cùng một proj.4?

Tôi hy vọng rằng cả hai phương pháp đều mang lại raster dự kiến ​​giống nhau, cùng mức độ và cùng giá trị tại (-100, 50). Tuy nhiên, họ dường như không :(
EDi 20/07/2015

1
Hai chương trình đang tạo ra các lưới khác nhau để cong lên. Ngay cả khi việc lấy mẫu song tuyến giống hệt nhau, các điểm đang được nội suy ở các vị trí khác nhau và bạn sẽ có câu trả lời khác nhau. Nguồn gốc và kích thước pixel là khác nhau. Bạn có thể đặt một số cờ trong gdalwarp (-te, -tr, v.v.) để thử và tái tạo phiên bản R, sau đó so sánh các giá trị pixel và xem chúng khác nhau như thế nào.

Tôi đã tìm thấy nhiều lần sử dụng -ordercờ ("thứ tự đa thức được sử dụng để làm cong vênh") gdalwarpngay cả khi không sử dụng GCP tạo ra kết quả chính xác hơn.
christoph

Câu trả lời:


10

Câu hỏi hay và tái sản xuất. Cá nhân, tôi hy vọng rằng lý do cho sự khác biệt là trong việc thực hiện các phản ứng song tuyến. Rõ ràng bạn có thể xem xét mã nguồn cho hai cách tiếp cận, nhưng tôi hy vọng rằng đó sẽ là một sự quá mức cần thiết.
Có vẻ như việc triển khai R đưa ra "lỗi" / "thay đổi" lớn hơn so với phiên bản GDAL thô (ít nhất trong các phiên bản và thử nghiệm của tôi - projectRaster giới thiệu các thay đổi xung quanh + -0,01 trong khi GDAL đưa ra các giá trị khoảng + -0,002).

Nếu bạn so sánh cả hai cách tiếp cận bằng cách sử dụng từ chối hàng xóm gần nhất, chúng sẽ khớp như mong đợi.


Cảm ơn gợi ý này với các phương pháp chiếu! Nếu tôi tìm thấy thời gian tôi sẽ xem xét sâu hơn về những điều đó (Tuy nhiên, tôi quen thuộc hơn với R rồi với C).
EDi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.