2015-09-24 129 views
4

我想讀取R中的二進制整數並將它們轉換爲柵格網格。 該文件具有以下承租人:讀取R中的二進制光柵文件

NCols= 4320 
NRows= 2160 
pixel-size: 1/12=0.833 degrees 
upper-left-lat: 90.0-1/24 
upper-left-lon: -180.0+1/24 
lower-right-lat: -90.0+1/24 
lower-right-lon: 180.0 
nodata= -5000 
scale-factor= 10000 
datatype: 16-bit signed integer 
byte-order: big endian 

這裏是我做的:

file <-"http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g" 
dat <- readBin(file,what="integer", size=4, signed = TRUE, n = NRows * NCols, endian = "big") 
r <- raster(nrow=2160, ncol=4320) 
r[] <- dat 

但這似乎並沒有是正確的,我很欣賞的任何建議。 。

+0

不確定你在這之後會發生什麼,你能說得更具描述性嗎? – Badger

+0

我認爲數據有子集。這裏是我從文件中發現的:'每個NDVI數據集是一個INT16文件,用ieee-big_endian 保存,範圍從-10000 - >(10000-> 10004) ,flagW文件添加到ndvi值如下: \t ndvi3g = round(ndvi * 10000)+ flagW-1; \t flagW範圍從1-> 7 以檢索原始的ndvi和flagW值 \t flagW = ndvi3g-floor(ndvi3g/10)* 10 + 1; ndvi = floor(ndvi3g/10)/ 1000' \t你知道如何檢索ndvi值嗎? –

+0

@DNM你對這些文件的精確文件格式有特別的興趣,並且想要了解這些細節?或者你只是想結束一個光柵,所以你可以顯示它? – WhiteViking

回答

2

您可以使用greenbrown R軟件包閱讀這些文件。

在R 2與

install.packages("greenbrown", repos="http://R-Forge.R-project.org") 

安裝它如果由於包需要由其作者重建,一種替代方法是首先直接從回購下載源的失敗,然後手動安裝,如在greenbrown installation instructions中解釋。在後一種情況下,您可能還需要手動安裝一些greenbrown首先取決於的包:install.packagesKendall,bfast,strucchange

安裝後,從URL中讀取光柵一樣簡單:

library(greenbrown) 
r <- ReadVI3g("http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g") 

通過greenbrown::ReadVI3g返回的對象是一個RasterLayer。我們可以

plot(r) 

這給

enter image description here

+0

它看起來像一個有趣的包!但正如您指出的那樣,軟件包無法安裝。 –

+0

@DNM我失敗了,但我用'svn'在本地克隆我的機器上的回購,然後按照我在回答中鏈接到的安裝說明手動安裝包。 (直截了當,只需要幾分鐘。) – WhiteViking

+0

感謝它現在的作品!我先在linux下創建它,然後將它複製到windows環境中。看起來他們爲這些數據集創建了一個函數,但我仍然很想知道如何手動讀取數據。謝謝你的幫助! –

4

我建greenbrown從源(基於文件上演GitHub),發現它花了相當長的處理一個單一顯示出來文件。

system.time(
    r1 <- ReadVI3g("http://nasanex.s3.amazonaws.com/AVHRR/GIMMS/3G/1980s/geo81aug15a.n07-VI3g") 
) 

# user system elapsed 
# 3.252 0.973 143.846 

因此,我建議有一個看GIMMS包,它是專爲這一特定類型的數據,此外,可從CRAN。請注意,與ReadVI3g不同,它尚未提供自動質量控制功能,但此功能計劃用於下一版本更新。同時,應使用來自光柵包的overlay來丟棄低質量值。

# install.packages("gimms") 
library(gimms) 

system.time({ 
    ## download file, see ?downloadGimms for further options 
    f <- updateInventory() 
    f <- downloadGimms(f[3], overwrite = TRUE) # download 3rd file in 'f', viz. geo81aug15a.n07-VI3g 

    ## rasterize ndvi and flags 
    ndvi <- rasterizeGimms(f) 
    flag <- rasterizeGimms(f, flag = TRUE) 

    ## perform quality control 
    r2 <- overlay(ndvi, flag, fun = function(x, y) { 
    x[y[] > 1] <- NA 
    return(x) 
    }) 
}) 

# user system elapsed 
# 4.538 3.894 26.781 

得到的兩個圖像顯然是相同

> unique(r1 - r2, na.rm = TRUE) 
[1] 0 

但你可以看到,GIMMS爲基礎的代碼執行速度更快。此外,它提供了並行功能(通過doParallel),以防萬一您想一次下載和處理多個文件。

+0

謝謝@fdetsch!這非常有趣! –