Windows에서 R 'raster'패키지를 사용하여 .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 (64Bit, 동일한 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()게시물에 게시물 을 포함시킬 수 있습니까 ?
Roman Luštrik

winXP에서 raster_1.8-12 (그러나 1.9-12의 것과 동일)에서 다른 값을 얻었습니다.
Roman Luštrik

raster_1.8-12에서 제대로 작동 했습니까, 아니면 다른가요?
yellowcap

답변:


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"

편집 : 으악, 정상에서 빼는 것을 잊어 버렸으며 이제 수정되었습니다. 여전히 바닥에 도달하지 않은 반 셀 문제가 있습니다.


사실 당신은 두 가지 방법 (이 대답하고 내 / 로버츠 응답)를 결합 할 수 있습니다 : 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에 문제가 있습니다. 나는 윈도우 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 바이트 정수-값이 0보다 낮을 수 없다는 것입니다. 이것은 아마도 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이됩니다.

이상한 점은 최소 값 : -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

방금 리눅스에서 빠른 검사를했습니다 .gdal 1.8은 파일을 올바르게로드하지만 gdal 1.6은 실패합니다. 그래서 그것은 gdal에 의한 것 같습니다.


로드 GDAL 런타임 : GDAL 1.7.2, 2010년 4월 23일 발표
로마 Luštrik에게

Windows에서 내 GDAL 버전은 위에서 인용 한 버전 (1.7.2.)이며 OSX에는 1.8.0이 있습니다. 그러나 1.7.2를 사용하여 DEM 파일을 읽을 수없는 이유는 무엇입니까? 해결 방법이 있습니까?
yellowcap

다른 버전의 래스터에서 다른 결과를 얻었으므로 (위의 의견 참조) GDAL 그 자체 라고 완전히 확신하지는 못합니다 .
Roman Luštrik

Win7 rgdal에서 업데이트 된 gdal설치를 찾는 방법을 설명 할 수 있습니까? 최신 gdal바이너리 (32 및 64)를 다운로드하여 설치했습니다 . 기본 위치에 설치되었지만 rgdal업데이트 후에도 1.7.2를 사용합니다.
yellowcap

rgdal을 업데이트하는 것은 분명하지 않으며 rgdal을 다시 컴파일해야합니다. 자세한 내용은 여기를 참조하십시오 .
johanvdw

0

귀하의 요구 사항에 대해 잘 모르겠지만을 (를) 변환 할 수 있습니다. DEM 파일을 .GRID 파일로. 그러면 arcgis 지오 프로세서 또는 R은 그리드 래스터 조작 중에 N / A 값으로 .GRID를 자동으로 인식합니다.


다른 소프트웨어를 사용하여 파일을 먼저 변환하는 것은 가능하지만 의도 한 것은 아닙니다. 아이디어는 파일을 다운로드, 읽기 및 분석하기 위해 R 만 사용하는 것이 었습니다.
yellowcap

원칙적으로을 사용하여 R을 통해 gdaltranslate을 실행할 수 있습니다 system2.
johanvdw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.