Использование данных HDF в r

Я пытаюсь загрузить и построить данные модиса отсюда http://orca.science.oregonstate.edu/1080.by.2160.monthly.hdf.vgpm.s.chl.a.sst.php

Я регулярно использую файлы .nc с веб-сайта цвета океана, но я не могу работать с файлами hdf таким же образом. Можно ли сконвертировать hdf в растр?

gdalinfo("~vgpm.2008245.hdf")
gdal_translate(sds, dst_dataset = "~test.tiff")

sh: -c: строка 0: неожиданный конец файла при поиске соответствия ``'
sh: -c: строка 1: синтаксическая ошибка: неожиданный конец файла
NULL

rast <- raster("~test.tiff")

Ошибка в .local(.Object,...):

Ошибка в .rasterObjectFromFile(x, band = band, objecttype = "RasterLayer", :
Невозможно создать объект RasterLayer из этого файла. (Файл не существует)

Я попробовал совет здесь Чтение файлов hdf в R и преобразование их в растры geoTIFF

и получил эту ошибку: sh: -c: строка 0: неожиданный EOF при поиске соответствия ``' sh: -c: строка 1: синтаксическая ошибка: неожиданный конец файла

Я также пробовал здесь предложение Преобразование HDF в файл с географической привязкой (geotiff, shapefile) и ошибка: Ошибка в .rasterObjectFromFile(x, band = band, objecttype = "RasterLayer", : Невозможно создать объект RasterLayer из этого файла.

Я просто хочу извлечь данные и отобразить данные о производительности для заданного местоположения с течением времени на линейном графике вместе с другими данными, которые у меня есть...
спасибо.


person liv    schedule 13.05.2019    source источник


Ответы (1)


В Windows (и Linux, если установлены драйверы hdf) вам не нужно конвертировать эти файлы. Вы можете использовать их напрямую

library(raster)
x <- raster("vgpm.2008245.hdf")
x
#class      : RasterLayer 
#dimensions : 1080, 2160, 2332800  (nrow, ncol, ncell)
#resolution : 1, 1  (x, y)
#extent     : 0, 2160, 0, 1080  (xmin, xmax, ymin, ymax)
#crs        : NA 
#source     : vgpm.2008245.hdf 
#names      : vgpm.2008245 

Как вы указываете в комментариях, экстент неверен (и CRS не определен, и флаг NA также не установлен). Вы можете исправить это так.

extent(x) <- extent(-180, 180, -90, 90)
crs(x) <- "+proj=longlat +datum=WGS84"
NAvalue(x) <- -9999

x
#class      : RasterLayer 
#dimensions : 1080, 2160, 2332800  (nrow, ncol, ncell)
#resolution : 0.1666667, 0.1666667  (x, y)
#extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#crs        : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#source     : vgpm.2008245.hdf 
#names      : vgpm.2008245 

И если бы вы хотели tif, вы могли бы сделать

 r <- writeRaster(x, "vgpm.2008245.tif"

Это не работало на окнах в прошлом. И, по-видимому, он не работает на Mac из коробки --- зависит от того, как вы устанавливаете GDAL. Я думаю, вам нужно использовать доморощенный для установки gdal2, используя «--с полным»

person Robert Hijmans    schedule 14.05.2019
comment
спасибо @RobertHijmans. Я установил рабочий каталог, но библиотека (растр) x ‹- растр (vgpm.2008245.hdf) x, выдает ошибку Ошибка в .local (.Object, ...): Ошибка в .rasterObjectFromFile (x, band = band, objecttype = RasterLayer, : Невозможно создать объект RasterLayer из этого файла. Это потому, что я использую Mac? Я пробовал f ‹- ~/vgpm.2008245.hdf file.exists(f) он говорит true, значит, файл существует по крайней мере !, но я не могу запустить writeRaster(x, vgpm.2008245.tif) Ошибка в (функции (классы, fdef, mtable): невозможно найти унаследованный метод для функции 'writeRaster' для подписи 'символ, символ - person liv; 14.05.2019
comment
Это по-другому (более сложно) на Mac... - person Robert Hijmans; 14.05.2019
comment
Спасибо. Я загрузил Windows Parallel для Mac, загрузил r и запустил код, и это сработало. Я заметил, что проекция отличается (протяженность 0, 2160, 0, 1080). Я не был уверен, как извлечь данные для местоположения, поэтому я преобразовал экстент, как я делал раньше, и извлек одно местоположение 40S, 180W. К сожалению, результаты абсурдны... я неправильно трансформирую это? библиотека(растр) библиотека(rgdal) x ‹- кирпич(vgpm.2008245.hdf) x экстент(x) ‹- экстент(0, 360, -90, 90) x[x ‹ -9000] ‹- нет данных x ‹- поворот (x) x pnt = матрица (c (-180, -40), ncol = 2) извлечения pnt (x, pnt) - person liv; 14.05.2019
comment
Я отредактировал свой ответ, чтобы решить эти проблемы. - person Robert Hijmans; 15.05.2019