2015-09-24 6 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; \t ndvi = floor (ndvi3g/10)/1000' Вы знаете, как я могу получить значения ndvi? –

+0

@DNM У вас есть особый интерес к точному файловому формату этих файлов и вы хотите понять эти детали? Или вы просто хотите получить растровое изображение, чтобы отобразить его? – WhiteViking

ответ

2

Вы можете прочитать такие файлы с помощью пакета greenbrown R.

Установите его в R с

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

Если это не удается, потому что пакет должен быть восстановлен его авторами, альтернативой является первой загрузки источников непосредственно из репозитория, а затем установить их вручную, как объясняется в greenbrown installation instructions. В последнем случае вам также может потребоваться вручную установить пару пакетов, которые зависят от первого: install.packages по адресу Kendall, 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! Это очень интересно! –

Смежные вопросы