在Windows中使用R'raster'包读取.DEM文件时NA值出现问题


10

我正在尝试使用R中的'raster'包在Windows上读取.DEM格式的光栅文件。

在Windows 7中将数据加载到R中时,NA值出现问题,但在装有OSX Lion的Mac上却没有问题。在Windows上,似乎无法正确读取NA值。问题是为什么会这样?

使用以下R代码从USGS下载了使用的光栅文件:

download.file('http://edcftp.cr.usgs.gov/pub/data/gtopo30/global/e020n90.tar.gz', 'e020n90.tar.gz')
untar('e020n90.tar.gz')

然后,我使用“ raster”包将栅格读入R。在OSX Lion和R64版本2.13.1中,可以识别NA值:

> onMac <- raster('E020N90.DEM')
> onMac
class       : RasterLayer 
dimensions  : 6000, 4800, 28800000  (nrow, ncol, ncell)
resolution  : 0.008333333, 0.008333333  (x, y)
extent      : 20, 60, 40, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs 
values      : /Users/Tam/Desktop/E020N90.DEM 
min value   : -9999 
max value   : 5483 

> summary(values(onMac))
Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
-137       85      148      213      213     5483 13046160

但是在Windows 7(64位,相同的R版本)上,它将将应为NA的单元格值转换为数字:

> onWindows <- raster('E020N90.DEM')
> onWindows
class       : RasterLayer 
dimensions  : 6000, 4800, 28800000  (nrow, ncol, ncell)
resolution  : 0.008333333, 0.008333333  (x, y)
extent      : 20, 60, 40, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0 
values      : E:/WorldDegreeDays/gsoddata/gtopo/E020N90.DEM 
min value   : -9999 
max value   : 5483 

> summary(values(onWindows))
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1     150     946   27190   55540   65540

在Windows上阅读时,为什么栅格中没有NA值?我该如何解决?我的猜测是它与数字的存储方式有关,许多NA值都转换为55540。

Windows中的信息(加载栅格后):

SessionInfo()
R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rgdal_0.7-1   raster_1.9-12 sp_0.9-88    

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-30

来自OSX的信息(加载栅格后):

R version 2.13.1 (2011-07-08)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] rgdal_0.6-33  raster_1.9-12 sp_0.9-88    

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33

在两个系统上的光栅版本1.9-12
yellowcap

您可以sessionInfo()在自己的帖子中加入吗?
RomanLuštrik2011年

在winXP上,我在raster_1.8-12上获得了不同的值(但在1.9-12上与您的值相同)。
RomanLuštrik2011年

在raster_1.8-12上工作是否很好,还是只是有所不同?
Yellowcap

Answers:


11

一种解决方法是仅使用原始数据,因为这是一种非常简单的文件格式。

并非适合所有人,但查看正在发生的事情可能很有启发。

## all these details are in the .HDR file
NROWS   <-      6000
NCOLS   <-      4800

在这一点上,您可以直接尝试使用整数符号和字节序的不同选项,以这种方式> 32767读取文件后,我们将实现Robert对转换所做的操作。

x1 <- readBin("E020N90.DEM", "integer", size = 2, signed = TRUE, n = NROWS * NCOLS, endian = "big")

range(x1)
[1] -9999  5483

x1[x1 < -9998] <- NA

## now for the simple georeferencing, also in the HDR file

ULXMAP   <-     20.00416666666667
ULYMAP   <-     89.99583333333334
XDIM     <-     0.00833333333333
YDIM     <-     0.00833333333333

## now generate x/y coordinates, and the data matrix (flip on Y)
x <- list(x = seq(ULXMAP, by = XDIM, length = NCOLS),
       y = seq(ULYMAP - NROWS * YDIM, by = YDIM, length = NROWS),
      z = matrix(x1, nrow = NCOLS)[ , NROWS:1])

library(sp)

x <- image2Grid(x)

library(raster)
r <- raster(x)

plot(r)

在此处输入图片说明

最后,设置投影被光栅读取时的投影(这将使绘图中的纵横比与以这种方式读取时所看到的相同)。

projection(r) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"

编辑:哎呀,忘记了从顶部减去,现在已修复-还有一个半格的问题,我也没有深入到底部。


实际上,您可以将两种方法结合使用(此答案和my / roberts答案):r <- raster('E020N90.DEM')然后运行values(r)<-readBin("E020N90.DEM", "integer", size = 2, signed = TRUE, n = nrows(r) * ncols(r), endian = "big"),然后 运行values(r)[values(r)==-9999]<-NA
johanvdw

哈,是的,但那是异端
mdsumner

6

该文件或GDAL存在一些问题。我正在使用Windows 7

R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)

> getGDALVersionInfo()
[1] "GDAL 1.7.2, released 2010/04/23"


> GDALinfo('E020N90.DEM')
rows        6000 
columns     4800 
bands       1 
origin.x        20 
origin.y        40 
res.x       0.008333333 
res.y       0.008333333 
ysign       -1 
oblique.x   0 
oblique.y   0 
driver      EHdr 
projection  +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs 
file        E020N90.DEM 
apparent band summary:
 GDType  Bmin Bmax   Bmean    Bsd hasNoDataValue NoDataValue
1 UInt16 -9999 5483 -4412.9 5088.6           TRUE       -9999
> 

请注意,NoDataValue与Bmin值(-9999)相同,这是奇数。更糟糕的是GDType是UInt16-无符号2字节整数-这意味着您不能拥有小于零的值。这可能是Gdal 1.8.0中修复的错误

当您这样做时,说明了该问题

r <- 'E020N90.DEM'
plot(r)

我认为解决这个问题的斋戒方法是:

r <- raster('E020N90.DEM')
fun <- function(x){ x[x > 32767] <- x[x > 32767] - 65536; x[x == -9999] <- NA; x}
r[] <- fun(values(r))

plot(r)
r <- writeRaster(r, 'E020N90.TIF')

1
此方法比我的方法要好,因为里海中的数据点也被转换了(这些点也是负的)。真好!
johanvdw 2011年

6

该问题似乎是由识别数据为带符号2字节整数格式的事实引起的。它被错误地解释为无符号2字节整数格式。因此,您的nodata值-9999变为:2bytes = 256 * 256 -9999 = 55537

我发现奇怪的是,对于Windows和Mac,最小值:-9999和最大值:5483相同。似乎在两种情况下,在构建标头时都无法正确识别数据,但是在将其实际用于值时会发生错误。

解决方法:

values(onWindows)[values(onWindows)>128*256]<-values(onWindows)[values(onWindows)>128*256]-256*256
values(onWindows)[values(onWindows)==-9999]<-NA

深入探讨:似乎栅格称为rgdal,而栅格又称为gdal本身。您的系统上很可能有不同版本的gdal。在加载rgdal时检查,例如:

Loaded GDAL runtime: GDAL 1.8.0, released 2011/01/12

我只是在Linux上进行了快速检查:gdal 1.8可以很好地加载文件,但是gdal 1.6失败。因此,它似乎确实是由gdal引起的。


加载的GDAL运行时:GDAL 1.7.2,发布于2010/04/23
RomanLuštrik2011年

在Windows上,我的GDAL版本也是上面引用的版本(1.7.2。),在OSX上,我确实具有1.8.0。但是,为什么我不能使用1.7.2。读取DEM文件?有什么解决方法吗?
Yellowcap

在不同版本的栅格中,我得到了不同的结果(请参见上面的评论),因此我并不完全相信这是GDAL 本身
RomanLuštrik2011年

您能描述一下如何在Win7上rgdal找到更新的gdal安装吗?我下载并安装了最新的gdal二进制文件(32和64)。这些已安装到默认位置,但rgdal即使更新后仍使用1.7.2。
Yellowcap

更新rgdal并不明显,需要重新编译rgdal。更多信息在这里
johanvdw 2011年

0

尽管我不确定您的要求,但是可以转换。将DEM文件转换为.GRID文件。然后,arcgis地理处理器或R将在网格栅格处理期间自动识别具有N / A值的.GRID。


可以先使用其他软件来转换文件,但不是我想要的。想法是仅使用R来下载,读取和分析文件。
Yellowcap

原则上,您可以使用来通过R运行gdaltranslate system2
johanvdw 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.