微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpatRaster 的原点、分辨率和坐标在使用某些文件格式而非全部写入/读取后略修改

如何解决SpatRaster 的原点、分辨率和坐标在使用某些文件格式而非全部写入/读取后略修改

在写入然后读取具有某些文件格式(ESRI .hdr 标签格式、netCDF 和 ENVI,但不是 GeoTIFF 或 Erdas HFA)的 SpatRaster 时,栅格原点、分辨率和坐标会略有变化。这些参数的相等性测试足以返回 FALSE 值。这是一个例子,使用 GeoTiff 然后 flt。

Nrow=45; Ncol=108
r1 <- rast(nrow=Nrow,ncol=Ncol,vals=1:(Nrow*Ncol),ext=c(-180,180,-60,90))
origin(r1)
# [1] 0 0

writeraster(r1,"test.tif",overwrite=TRUE)

r2 <- rast("test.tif")
origin(r2)  
# origin is OK,same as r1
# [1] 0 0
 
res(r1)==res(r2)
# [1] TRUE TRUE

writeraster(r1,"test.flt",overwrite=TRUE)
r3 <- rast("test.flt")
origin(r3)  
# origin has been shifted
# [1] 1.705303e-13 5.684342e-14

res(r1)==res(r3)   
# the lag is large enough for r3 to be considered as a different raster from r1
# [1] FALSE FALSE

这里的三个问题:

。为什么会发生这种转变?

。有没有办法阻止它们?

。如果不是,阅读后纠正它们的最佳方法是什么?

谢谢。

解决方法

发生偏移是因为用于存储分数的小数位数不足,而存储范围或栅格的错误方法会加剧这种情况。 FLT 文件使用“原点/分辨率”方法进行地理配准

readLines("test.hdr")
 [1] "BYTEORDER      I"                 "LAYOUT         BIL"               "NROWS          45"               
 [4] "NCOLS          108"               "NBANDS         1"                 "NBITS          32"               
 [7] "BANDROWBYTES   432"               "TOTALROWBYTES  432"               "PIXELTYPE      FLOAT"            
[10] "ULXMAP         -178.333333333333" "ULYMAP         88.3333333333333"  "XDIM           3.33333333333333" 
[13] "YDIM           3.33333333333333"  "NODATA         1.#QNAN"    

如您所见,有ULXMAPULYMAP(单元格中心的左上角x和y坐标),但没有存储另一个角的坐标。所以必须计算。

在这种情况下,最小(左)x 坐标是

XDIM <- 3.33333333333333
xmin <- -178.333333333333 - 0.5 * XDIM
print(xmin,16)
# -179.9999999999997

最大(右)x 坐标是

NCOLS <- 108
xmax <- xmin + NCOLS * XDIM
print(xmax,16)
#180

yres = (xmax - xmin) / NCOLS
print(yres,17)
[1] 3.3333333333333304

它应该在哪里

print(360/NCOLS,17)
[1] 3.3333333333333335

一个非常小的差异,但可以通过存储最大 x 和 y 坐标而不是 x 和 y 分辨率来轻松避免精度损失。不幸的是,这并不是在这里完成的,甚至 GDAL 在内部也使用了这种(我认为有缺陷的)方法。

我认为您看到的文件类型之间的差异是由于存储的小数位数(双精度与单精度)所致。

如果这会导致问题(通常会忽略如此小的差异),您可以通过分配正确的范围来解决此问题

 ext(r3) <- c(-180,180,-90,90)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?