ปัญหาเกี่ยวกับค่า NA เมื่ออ่านไฟล์. DEM พร้อมแพ็คเกจ R 'raster' ใน Windows


10

ฉันพยายามอ่านไฟล์แรสเตอร์ในรูปแบบ. DEM บน windows โดยใช้แพ็คเกจ 'raster' ใน R

ฉันพบปัญหากับค่า NA เมื่อโหลดข้อมูลลงใน R ใน Windows 7 แต่ฉันไม่มีปัญหาใน Mac ที่มี OSX Lion บน windows ค่า NA ดูเหมือนจะอ่านไม่ถูกต้อง คำถามคือทำไมสิ่งนี้เกิดขึ้น?

ไฟล์แรสเตอร์ที่ใช้ถูกดาวน์โหลดจาก USGS ด้วยรหัส R ต่อไปนี้:

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

จากนั้นฉันก็อ่านแรสเตอร์เป็น R โดยใช้แพ็คเกจ 'raster' ใน 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

ทำไมไม่มีค่า NA ในแรสเตอร์เมื่อฉันอ่านบน Windows ฉันจะหลีกเลี่ยงมันได้อย่างไร ฉันเดาว่ามันเกี่ยวข้องกับวิธีจัดเก็บตัวเลขค่า 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()ในโพสต์ของคุณ?
Roman Luštrik

ฉันได้รับค่าที่แตกต่างกันใน raster_1.8-12 (แต่เหมือนกับของคุณใน 1.9-12) บน winXP
Roman Luštrik

มันทำงานได้ดีกับ raster_1.8-12 หรือว่ามันแตกต่างกันใช่มั้ย
yellowcap

คำตอบ:


11

วิธีแก้ปัญหาเพียงอย่างเดียวคือการไปหาข้อมูลดิบเนื่องจากเป็นรูปแบบไฟล์ที่ง่ายมาก

ไม่ใช่สำหรับทุกคน แต่สามารถส่องสว่างเพื่อดูว่าเกิดอะไรขึ้น

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

ณ จุดนี้คุณสามารถลองใช้ตัวเลือกที่แตกต่างกันสำหรับเครื่องหมายจำนวนเต็มและ endianness โดยตรงและอ่านวิธีนี้เราบรรลุสิ่งที่ Robert ทำกับการ> 32767แปลงหลังจากอ่านไฟล์

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"

แก้ไข: อ๊ะลืมลืมลบจากด้านบนตอนนี้แก้ไข - ยังมีปัญหาครึ่งเซลล์ฉันยังไม่ได้ไปที่ด้านล่างของเช่นกัน


ในความเป็นจริงคุณสามารถรวมทั้งสองวิธี (คำตอบนี้และคำตอบของฉัน / 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 - Integers 2-byte ที่ไม่ได้ลงชื่อซึ่งหมายความว่าคุณไม่สามารถมีค่าต่ำกว่าศูนย์ได้ นี่อาจเป็นข้อผิดพลาดที่ได้รับการแก้ไขใน 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

6

ปัญหาดูเหมือนว่าจะเกิดจากปัญหาการรับรู้ข้อมูลที่อยู่ในรูปแบบจำนวนเต็ม 2 ไบต์ลงนาม มันตีความผิดเป็นรูปแบบจำนวนเต็ม 2 ไบต์ที่ไม่ได้ลงชื่อ ดังนั้นค่า nodata ของคุณคือ -9999: 2bytes = 256 * 256 -9999 = 55537

สิ่งที่ฉันพบคือค่า min: -9999 และค่าสูงสุด: 5483 เหมือนกันทั้งกับ windows และ mac ดูเหมือนว่าในทั้งสองกรณีไม่มีข้อมูลที่ไม่ถูกต้องระบุเมื่อสร้างส่วนหัว แต่เมื่อใช้จริงสำหรับค่าที่เกิดข้อผิดพลาด

วิธีแก้ปัญหา:

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

ใน windows รุ่น GDAL ของฉันเป็นรุ่นที่ยกมาข้างต้น (1.7.2.) บน OSX ฉันมี 1.8.0 แต่ทำไมฉันไม่สามารถอ่านไฟล์ DEM ด้วย 1.7.2 ได้? มีงานแก้ไขหรือไม่?
yellowcap

ผมได้รับผลลัพธ์ที่แตกต่างในรุ่นที่แตกต่างกันของราสเตอร์ (ดูความคิดเห็นของฉันบน) ดังนั้นฉันไม่เชื่อว่าทั้งหมดมัน GDAL ต่อ se
Roman Luštrik

คุณช่วยอธิบายถึงวิธีrgdalค้นหาการgdalติดตั้งที่ได้รับการอัพเดทบน Win7 ได้ไหม? ฉันดาวน์โหลดและติดตั้งgdalไบนารีล่าสุด(ทั้ง 32 และ 64) สิ่งเหล่านี้ถูกติดตั้งในตำแหน่งเริ่มต้น แต่rgdalยังคงใช้ 1.7.2 แม้หลังจากการอัพเดต
yellowcap

การอัปเดต rgdal ไม่ชัดเจนและจะต้องรวบรวมใหม่ของ rgdal ข้อมูลเพิ่มเติมที่นี่
johanvdw

0

แม้ว่าฉันไม่แน่ใจเกี่ยวกับความต้องการของคุณคุณสามารถแปลง ไฟล์ DEM เป็นไฟล์. GRID จากนั้นตัวประมวลผลเชิงพื้นที่ arcgis หรือ R จะรับรู้. GRID ที่มีค่า N / A โดยอัตโนมัติระหว่างการจัดการตะแกรงแรสเตอร์


การใช้ซอฟต์แวร์อื่นเพื่อแปลงไฟล์ก่อนเป็นไปได้ แต่ไม่ใช่สิ่งที่ฉันตั้งใจไว้ แนวคิดนี้ใช้ R สำหรับการดาวน์โหลดการอ่านและการวิเคราะห์ไฟล์เท่านั้น
yellowcap

ในหลักการที่คุณสามารถเรียก gdaltranslate ผ่าน R system2โดยใช้
johanvdw
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.