WindowsでR 'ラスター'パッケージを使用して.DEMファイルを読み取るときのNA値の問題


10

Rの「ラスター」パッケージを使用して、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')

次に、「ラスター」パッケージを使用してラスターを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 2011

回答:


11

これは非常に単純なファイル形式であるため、1つの回避策は生データを取得することです。

誰もが使えるわけではありませんが、何が起こっているのかを知るのはとても明るいことです。

## 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 2011年

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

6

この問題は、データが符号付き2バイト整数形式であることを認識する問題が原因で発生するようです。符号なし2バイト整数形式として誤って解釈されます。したがって、-9999のnodata値は次のようになります:2bytes = 256 * 256 -9999 = 55537

私が奇妙だと思うのは、最小値:-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
4

Windowsでは、私のGDALバージョンは上記(1.7.2。)で引用したバージョンでもあり、OSXでは1.8.0です。しかし、なぜ1.7.2を使用してDEMファイルを読み取れないのですか?回避策はありますか?
yellowcap 2011

異なるバージョンのラスターで異なる結果が得られたため(上記の私のコメントを参照)、GDAL 自体が完全に確信しているわけではありません。
RomanLuštrik11年

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 2011

原則として、を使用してRを介してgdaltranslateを実行できますsystem2
johanvdw 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.