Windows'ta R 'raster' paketi ile .DEM dosyasını okurken NA değerleriyle ilgili sorunlar


10

R'deki 'raster' paketini kullanarak pencerelerde .DEM biçiminde bir raster dosyasını okumaya çalışıyorum.

Verileri Windows 7'de R'ye yüklerken NA değerleriyle ilgili sorunlar alıyorum, ancak OSX Lion'lu bir Mac'te sorunum yok. Pencerelerde NA değerleri doğru okunmamış gibi görünüyor. Soru, bunun neden gerçekleştiği?

Kullanılan raster dosyası USGS'den aşağıdaki R kodu ile indirildi:

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

Sonra raster 'raster' paketini kullanarak R'ye okudum. OSX Lion ve R64 sürüm 2.13.1'de NA değerleri tanınır:

> 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

Ancak Windows 7'de (64Bit, aynı R sürümü) NA'lar olması gereken hücre değerlerini sayılara dönüştürür:

> 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'ta okuduğumda neden taramada NA değerleri yok? Etrafında nasıl çalışabilirim? Benim tahminim, sayıların saklanma şekliyle ilgisi var, bir çok NA değeri 55540'a dönüştürülüyor.

Windows'dan bilgi (raster yüklendikten sonra):

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'ten bilgi (raster yüklendikten sonra):

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

Her iki sistemde raster sürümü 1.9-12
yellowcap

Gönderinizi sessionInfo()postanıza ekleyebilir misiniz?
Roman Luštrik

WinXP'de raster_1.8-12'de (ancak 1.9-12'de kendinizle aynı) farklı değerler aldım.
Roman Luštrik

Raster_1.8-12 ile iyi çalıştı mı, yoksa sadece farklı mıydı?
yellowcap

Yanıtlar:


11

Bu sorunun çözümü basit bir dosya biçimidir, çünkü bu çok basit bir dosya biçimidir.

Herkes için değil, neler olduğunu görmek aydınlatıcı olabilir.

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

Bu noktada, tamsayı işareti ve endianness için farklı seçenekleri doğrudan deneyebilirsiniz ve bu şekilde okuma, Robert'in > 32767dosya okunduktan sonra dönüşümle ne yaptığını elde ederiz .

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)

resim açıklamasını buraya girin

Son olarak, izdüşümü raster tarafından okunacak şekilde ayarlayın (ve bu şekilde okunduğunda görülen grafikte aynı en boy oranını verecektir).

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

EDIT: Whoops, yukarıdan çıkartmayı unutmuştu, şimdi düzeltildi - hala dibe da giremediğim yarım hücre sorunu var.


Aslında her iki yöntemi de birleştirebilirsiniz (bu cevap ve benim / roberts cevapları): r <- raster('E020N90.DEM')ve sonra çalıştırın values(r)<-readBin("E020N90.DEM", "integer", size = 2, signed = TRUE, n = nrows(r) * ncols(r), endian = "big")ve sonra values(r)[values(r)==-9999]<-NA
johanvdw

Ha evet ama bu sapkın
mdsumner

6

Bu dosya veya GDAL ile ilgili bazı sorunlar var. Windows 7 kullanıyorum

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

ve

> 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 değerinin tek olan Bmin değeriyle (-9999) aynı olduğunu unutmayın. Daha da kötüsü GDType'ın UInt16 - İmzasız 2 baytlık Tam Sayılar olmasıdır - yani sıfırdan daha düşük değerlere sahip olamazsınız. Bu muhtemelen gdal 1.8.0'da düzeltilen bir hatadır

Sorun,

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

Ben bunu düzeltmek için oruçlu yolu olduğunu düşünüyorum:

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
Hazar denizindeki veri noktaları da dönüştürüldüğünden bu düzeltme benimkinden daha iyidir (bu noktalar da olumsuzdur). Güzel!
johanvdw

6

Sorunun nedeni, verilerin imzalı 2 bayt tam sayı biçiminde olduğunu fark eden bir sorundan kaynaklanıyor gibi görünüyor. Yanlış işaretsiz 2 bayt tam sayı biçimi olarak yorumlanır. Bu nedenle, -9999 nodata değeriniz olur: 2bayt = 256 * 256 -9999 = 55537

Garip bulduğum şey min değeri: -9999 ve maksimum değer: 5483 hem windows hem de mac için aynı. Her iki durumda da, üstbilgileri oluştururken hiçbir veri doğru bir şekilde tanımlanmadı, ancak gerçekte değerler için kullanıldığında bir hata oluştu.

geçici çözüm:

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

Daha derine inmek için: Raster, rgdal'ı çağırır, bu da gdal'ı çağırır. Büyük olasılıkla sisteminizde gdal'ın farklı bir sürümü var. Rgdal yüklerken kontrol edin örn .:

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

Ben sadece linux üzerinde hızlı bir kontrol yaptım: gdal 1.8 dosya iyi yükler, ama gdal 1.6 başarısız. Yani gdaldan kaynaklanıyor gibi görünüyor.


Loaded GDAL runtime: GDAL 1.7.2, yayınlandı 2010/04/23
Roman Luštrik

Pencerelerde GDAL versiyonum da yukarıda belirtilen versiyon (1.7.2.), OSX I'de 1.8.0 var. Ama neden 1.7.2 kullanarak DEM dosyasını okuyamıyorum? Herhangi bir çözüm var mı?
yellowcap

Rasterin farklı sürümlerinde farklı sonuçlar aldım (yukarıdaki yorumlarıma bakın), bu yüzden GDAL'ın kendi başına olduğuna tamamen ikna olmadım .
Roman Luštrik

Win7'de rgdalgüncellenmiş bir gdalkurulumu nasıl bulabileceğinizi açıklayabilir misiniz ? En son gdalikili dosyaları (32 ve 64) indirip yükledim . Bunlar varsayılan konuma kuruldu, ancak rgdalgüncellemeden sonra bile 1.7.2 kullanıyor.
yellowcap

Rgdal'ın güncellenmesi açık değildir ve rgdal'ın yeniden derlenmesini gerektirecektir. Daha fazla bilgi burada .
johanvdw

0

Gereksiniminizden emin olmasam da dönüştürebilirsiniz. DEM dosyaları .GRID dosyalarına. Ardından, arcgis coğrafi işlemcisi veya R, ızgara raster manipülasyonu sırasında N / A değerlerine sahip .GRID'leri otomatik olarak tanıyacaktır.


Önce dosyayı dönüştürmek için başka bir yazılım kullanmak mümkündür ama istediğim gibi değil. Fikir R'yi sadece dosyayı indirmek, okumak ve analiz etmek için kullanmaktı.
yellowcap

prensip olarak gdaltranslate'i R kullanarak çalıştırabilirsiniz system2.
johanvdw
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.