Sự cố với giá trị NA khi đọc tệp .DEM với gói R 'raster' trong Windows


10

Tôi đang cố đọc tệp raster ở định dạng .DEM trên windows bằng gói 'raster' trong R.

Tôi gặp vấn đề với các giá trị NA, khi tải dữ liệu vào R trong Windows 7, nhưng tôi không gặp vấn đề gì với máy Mac với OSX Lion. Trên cửa sổ, các giá trị NA dường như không được đọc chính xác. Câu hỏi là tại sao điều này xảy ra?

Tệp raster được sử dụng đã được tải xuống từ USGS với mã R sau:

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

Sau đó, tôi đọc raster vào R bằng cách sử dụng gói 'raster'. Trong OSX Lion và R64 phiên bản 2.13.1, các giá trị NA được nhận dạng:

> 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

Nhưng trên Windows 7 (64Bit, cùng phiên bản R), nó chuyển đổi các giá trị ô nên là NA thành số:

> 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

Tại sao không có giá trị NA trong raster khi tôi đọc nó trên Windows? Làm thế nào tôi có thể làm việc xung quanh nó? Tôi đoán là nó có liên quan đến cách lưu trữ số, rất nhiều giá trị NA được chuyển đổi thành 55540.

Thông tin từ Windows (sau khi tải raster):

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

Thông tin từ OSX (sau khi tải raster):

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

phiên bản raster 1.9-12 trên cả hai hệ thống
yellowcap

Bạn có thể bao gồm sessionInfo()trong bài viết của bạn?
Roman Luštrik

Tôi đã nhận được các giá trị khác nhau trên raster_1.8-12 (nhưng giống hệt với giá trị của bạn vào ngày 1.9-12) trên winXP.
Roman Luštrik

Nó có hoạt động tốt với raster_1.8-12 không, hay nó chỉ khác nhau?
yellowcap

Câu trả lời:


11

Một cách giải quyết khác là sử dụng dữ liệu thô, vì đây là định dạng tệp rất đơn giản.

Không phải cho tất cả mọi người, nhưng nó có thể được chiếu sáng để xem những gì đang xảy ra.

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

Tại thời điểm này, bạn có thể thử trực tiếp các tùy chọn khác nhau cho dấu nguyên và dấu cuối, và đọc theo cách này chúng ta sẽ đạt được những gì Robert làm với > 32767phép chuyển đổi sau khi đọc tệp.

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)

nhập mô tả hình ảnh ở đây

Cuối cùng, đặt phép chiếu khi nó được đọc bởi raster (và điều này sẽ cho tỷ lệ khung hình tương tự trong cốt truyện được nhìn thấy khi đọc theo cách đó).

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

EDIT: Rất tiếc, đã quên trừ từ đầu, hiện đã được sửa - vẫn còn một vấn đề nửa tế bào mà tôi chưa hiểu đến tận cùng.


Trong thực tế, bạn có thể kết hợp cả hai phương thức (câu trả lời này và câu trả lời của tôi / roberts): r <- raster('E020N90.DEM')và sau đó chạy values(r)<-readBin("E020N90.DEM", "integer", size = 2, signed = TRUE, n = nrows(r) * ncols(r), endian = "big")và sau đó values(r)[values(r)==-9999]<-NA
johanvdw

Có, nhưng đó là dị giáo
mdsumner

6

Có một số vấn đề với tệp này hoặc với GDAL. Tôi đang sử dụng 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
> 

Lưu ý rằng NoDataValue giống với giá trị Bmin (-9999), là số lẻ. Điều tồi tệ hơn là GDType là UInt16 - Số nguyên 2 byte không dấu - có nghĩa là bạn không thể có các giá trị thấp hơn 0. Đây có lẽ là một lỗi đã được sửa trong gdal 1.8.0

Vấn đề được minh họa khi bạn làm

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

Tôi nghĩ rằng cách nhanh nhất để khắc phục điều này là:

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
Khắc phục sự cố này tốt hơn của tôi vì các điểm dữ liệu trong biển caspi cũng được chuyển đổi (những điểm này cũng âm). Đẹp!
johanvdw

6

Vấn đề dường như được gây ra bởi một vấn đề nhận ra thực tế là dữ liệu ở định dạng số nguyên 2 byte đã ký. Nó được hiểu sai là định dạng số nguyên 2 byte không dấu. Do đó, giá trị nốt của bạn là -9999 trở thành: 2byte = 256 * 256 -9999 = 55537

Điều tôi thấy lạ là giá trị tối thiểu: -9999 và giá trị tối đa: 5483 giống nhau cho cả windows và mac. Dường như trong cả hai trường hợp, không có dữ liệu nào không được xác định chính xác khi xây dựng các tiêu đề, nhưng khi thực sự sử dụng nó cho các giá trị đã xảy ra lỗi.

cách giải quyết:

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

Để đào sâu hơn: Dường như raster gọi rgdal, đến lượt nó gọi chính gdal. Nhiều khả năng bạn có một phiên bản gdal khác trên hệ thống của bạn. Kiểm tra khi tải rgdal, vd:

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

Tôi vừa kiểm tra nhanh trên linux: gdal 1.8 tải tập tin tốt, nhưng gdal 1.6 không thành công. Vì vậy, nó dường như được gây ra bởi gdal.


Thời gian chạy GDAL đã tải: GDAL 1.7.2, phát hành 2010/04/23
Roman Luštrik

Trên windows, phiên bản GDAL của tôi cũng là phiên bản được trích dẫn ở trên (1.7.2.), Trên OSX tôi có 1.8.0. Nhưng tại sao tôi không thể đọc tệp DEM bằng 1.7.2.? Có bất kỳ công việc xung quanh?
yellowcap

Tôi đã nhận được các kết quả khác nhau trong các phiên bản khác nhau của raster (xem nhận xét của tôi ở trên) vì vậy tôi không hoàn toàn tin rằng đó là GDAL mỗi lần .
Roman Luštrik

Bạn có thể mô tả làm thế nào rgdalcó thể tìm thấy một gdalcài đặt cập nhật trên Win7? Tôi đã tải xuống và cài đặt các gdaltệp nhị phân gần đây nhất (cả 32 và 64). Chúng được cài đặt vào vị trí mặc định nhưng rgdalvẫn sử dụng 1.7.2, ngay cả sau khi cập nhật.
yellowcap

Cập nhật rgdal là không rõ ràng, và sẽ yêu cầu biên dịch lại rgdal. Thêm thông tin ở đây .
johanvdw

0

Mặc dù tôi không chắc chắn về yêu cầu của bạn, bạn có thể chuyển đổi. Tập tin DEM thành tập tin .GRID. Sau đó, bộ xử lý địa lý arcgis hoặc R sẽ tự động nhận ra .GRID với các giá trị N / A trong quá trình thao tác raster lưới.


Sử dụng một phần mềm khác để chuyển đổi tập tin đầu tiên là có thể nhưng không phải là những gì tôi dự định. Ý tưởng là chỉ sử dụng R để tải xuống, đọc và phân tích tệp.
yellowcap

về nguyên tắc bạn có thể chạy gdaltranslate thông qua R bằng cách sử dụng system2.
johanvdw
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.