#r #precision #raster #terra
#r #точность #растр #terra
Вопрос:
Значения растра изменяются при записи во внешние файлы, я полагаю, из-за классической проблемы внутреннего представления чисел:
library(terra)
r <- rast(ncol=2, nrow=2, vals=c(5.3, 7.1, 3, 1.2))
sprintf("%.8f",values(r))
# [1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"
t <- writeRaster(r, "test.tif", overwrite=TRUE)
sprintf("%.8f",values(t))
#[1] "5.30000019" "7.09999990" "3.00000000" "1.20000005"
Это может быть весьма проблематично. Каков «наилучший» адекватный обходной путь? Я протестировал округление и запись в целочисленных форматах, и это сработало:
r <- rast(ncol=2, nrow=2, vals=c(5.3, 7.1, 3, 1.2))
sprintf("%.8f",values(r))
#[1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"
r=10*r
t <- writeRaster(r, "test.tif", overwrite=TRUE,wopt=list(datatype="INT4S"))
t=t/10
sprintf("%.8f",values(t))
#[1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"
Есть ли лучший обходной путь? В частности, существует ли в terra какой-либо атрибут «точность», который может быть связан с каждым растром, что позволяет пользователю проще и эффективнее решать эти проблемы?
Ответ №1:
Вы можете использовать значения с плавающей запятой двойной точности (FLT8S)
library(terra)
r <- rast(ncol=2, nrow=2, vals=c(5.3, 7.1, 3, 1.2))
t <- writeRaster(r, "test.tif", overwrite=TRUE, wopt=list(datatype="FLT8S"))
sprintf("%.8f",values(t))
#[1] "5.30000000" "7.10000000" "3.00000000" "1.20000000"
Есть ли в terra какой-либо атрибут «точность», который может быть связан
с каждым растром
Нет, это не так. Если бы он был, для этого потребовались бы правила распространения? Может быть, проще просто установить его при записи? Одно предостережение заключается в том, что часть записи может остаться незамеченной для временных файлов. Чтобы установить значение по умолчанию FLT8S
, вы можете использовать terraOptions(datatype="FLT8S")
(в версии разработки 1.0-2).
Комментарии:
1. Спасибо, я понимаю.