web-dev-qa-db-ja.com

hdfファイルをRに読み込んでgeoTIFFラスターに変換する

MODIS 17データファイルをRに読み込み、それらを操作(トリミングなど)してからgeoTIFFとして保存しようとしています。データファイルは.hdf形式で提供されており、Rに読み込む簡単な方法はないようです。

他のトピックと比較して、そこには多くのアドバイスがなく、そのほとんどは数年前のものです。それのいくつかは、追加のプログラムを使用することもアドバイスしますが、私はRだけを使い続けたいです。

Rの.hdfファイルを処理するために、どのパッケージを使用しますか?

10
James

OK、それで私のMODIS hdfファイルはhdf5フォーマットではなくhdf4でした。これを発見することは驚くほど困難でした。MODISはWebサイトでそれについて言及していませんが、さまざまなブログやスタック交換投稿にいくつかのヒントがあります。結局のところ、確実に調べるために HDFView をダウンロードする必要がありました。

Rはhdf4ファイルを実行せず、ほとんどすべてのパッケージ(rgdalなど)はhdf5ファイルのみをサポートします。ドライバーのダウンロードとソースからのrgdalのコンパイルに関する投稿はいくつかありますが、すべてがかなり複雑に見え、MACまたはUnix向けで、Windowsを使用しています。

基本的に gdal_translateの[gdalUtilsパッケージから]は、Rでhdf4ファイルを使用したい人のための節約の恩恵です。これは、hdf4ファイルをRに読み込まずにgeoTIFFに変換します。これは、ファイルをまったく操作できないことを意味します。それらをトリミングすることで、計算時間を最小限に抑えるために(リバーブなどのMODISデータの場合)可能な最小のタイルを取得する価値があります。

コードの例を次に示します。

library(gdalUtils)

# Provides detailed data on hdf4 files but takes ages

gdalinfo("MOD17A3H.A2000001.h21v09.006.2015141183401.hdf")

# Tells me what subdatasets are within my hdf4 MODIS files and makes them into a list

sds <- get_subdatasets("MOD17A3H.A2000001.h21v09.006.2015141183401.hdf")
sds

[1] "HDF4_EOS:EOS_GRID:MOD17A3H.A2000001.h21v09.006.2015141183401.hdf:MOD_Grid_MOD17A3H:Npp_500m"   
[2] "HDF4_EOS:EOS_GRID:MOD17A3H.A2000001.h21v09.006.2015141183401.hdf:MOD_Grid_MOD17A3H:Npp_QC_500m"

# I'm only interested in the first subdataset and I can use gdal_translate to convert it to a .tif

gdal_translate(sds[1], dst_dataset = "NPP2000.tif")

# Load and plot the new .tif

rast <- raster("NPP2000.tif")
plot(rast)

# If you have lots of files then you can make a loop to do all this for you

files <- dir(pattern = ".hdf")
files

 [1] "MOD17A3H.A2000001.h21v09.006.2015141183401.hdf" "MOD17A3H.A2001001.h21v09.006.2015148124025.hdf"
 [3] "MOD17A3H.A2002001.h21v09.006.2015153182349.hdf" "MOD17A3H.A2003001.h21v09.006.2015166203852.hdf"
 [5] "MOD17A3H.A2004001.h21v09.006.2015099031743.hdf" "MOD17A3H.A2005001.h21v09.006.2015113012334.hdf"
 [7] "MOD17A3H.A2006001.h21v09.006.2015125163852.hdf" "MOD17A3H.A2007001.h21v09.006.2015169164508.hdf"
 [9] "MOD17A3H.A2008001.h21v09.006.2015186104744.hdf" "MOD17A3H.A2009001.h21v09.006.2015198113503.hdf"
[11] "MOD17A3H.A2010001.h21v09.006.2015216071137.hdf" "MOD17A3H.A2011001.h21v09.006.2015230092603.hdf"
[13] "MOD17A3H.A2012001.h21v09.006.2015254070417.hdf" "MOD17A3H.A2013001.h21v09.006.2015272075433.hdf"
[15] "MOD17A3H.A2014001.h21v09.006.2015295062210.hdf"

filename <- substr(files,11,14)
filename <- paste0("NPP", filename, ".tif")
filename

[1] "NPP2000.tif" "NPP2001.tif" "NPP2002.tif" "NPP2003.tif" "NPP2004.tif" "NPP2005.tif" "NPP2006.tif" "NPP2007.tif" "NPP2008.tif"
[10] "NPP2009.tif" "NPP2010.tif" "NPP2011.tif" "NPP2012.tif" "NPP2013.tif" "NPP2014.tif"

i <- 1

for (i in 1:15){
  sds <- get_subdatasets(files[i])
  gdal_translate(sds[1], dst_dataset = filename[i])
}

これで、たとえば、ラスターパッケージのrasterを使用して.tifファイルをRに読み込み、通常どおりに作業できます。結果のファイルをQGISを使用して手動で変換したいくつかのファイルと比較し、それらが一致しているので、コードが思ったとおりに機能していると確信しています。 LoïcDutrieuxと this に感謝します。

18
James

このスクリプトは非常に便利で、私はそれを使用して36ファイルのバッチを変換することができました。しかし、私の問題は、変換が正しくないように見えることです。 ArcGIS 'Make NetCDF Raster Layer tool'を使用してそれを行うと、異なる結果が得られます+単純な式を使用して、ケルビンから数値をCに変換できます:RasterValue * 0.02-273.15。 R変換の結果を使用すると、変換後に正しい結果が得られないため、ArcGIS変換が適切であると確信し、R変換はエラーを返します。

library(gdalUtils)
library(raster)

setwd("D:/Data/Climate/MODIS")

# Get a list of sds names
sds <- get_subdatasets('MOD11C3.A2009001.006.2016006051904.hdf')
# Isolate the name of the first sds
name <- sds[1]
filename <- 'Rasterinr.tif'

gdal_translate(sds[1], dst_dataset = filename)
# Load the Geotiff created into R
r <- raster(filename)

# Identify files to read:
rlist=list.files(getwd(), pattern="hdf$", full.names=FALSE)


# Substract last 5 digits from MODIS filename for use in a new .img filename
substrRight <- function(x, n){
        substr(x, nchar(x)-n+1, nchar(x))
}

filenames0 <- substrRight(rlist,9)
# Suffixes for MODIS files for identyfication:
filenamessuffix <- substr(filenames0,1,5)

listofnewnames <- c("2009.01.MODIS_","2009.02.MODIS_","2009.03.MODIS_","2009.04.MODIS_","2009.05.MODIS_",
                    "2009.06.MODIS_","2009.07.MODIS_","2009.08.MODIS_","2009.09.MODIS_","2009.10.MODIS_",
                    "2009.11.MODIS_","2009.12.MODIS_",
                    "2010.01.MODIS_","2010.02.MODIS_","2010.03.MODIS_","2010.04.MODIS_","2010.05.MODIS_",
                    "2010.06.MODIS_","2010.07.MODIS_","2010.08.MODIS_","2010.09.MODIS_","2010.10.MODIS_",
                    "2010.11.MODIS_","2010.12.MODIS_",
                    "2011.01.MODIS_","2011.02.MODIS_","2011.03.MODIS_","2011.04.MODIS_","2011.05.MODIS_",
                    "2011.06.MODIS_","2011.07.MODIS_","2011.08.MODIS_","2011.09.MODIS_","2011.10.MODIS_",
                    "2011.11.MODIS_","2011.12.MODIS_")

# Final new names for converted files:
newnames <- vector()
for (i in 1:length(listofnewnames)) {
        newnames[i] <- paste0(listofnewnames[i],filenamessuffix[i],".img")
}

# Loop converting files to raster from NetCDF
for (i in 1:length(rlist)) {
        sds <- get_subdatasets(rlist[i])
        gdal_translate(sds[1], dst_dataset = newnames[i])
}
2
MIH

以下は私のために働いた。これは短いプログラムで、入力フォルダ名を取り込むだけです。必要なサブデータを確認してください。サブデータ1に興味がありました。

library(raster)
library(gdalUtils)

inpath <- "E:/aster200102/ast_200102"

setwd(inpath)

filenames <- list.files(,pattern=".hdf$",full.names = FALSE)

for (filename in filenames)
{
     sds <- get_subdatasets(filename)
     gdal_translate(sds[1], dst_dataset=paste0(substr(filename, 1, nchar(filename)-4) ,".tif"))
}
0
Rajasweta Datta

NASAが提供するHEGツールキットを使用してhdfファイルをgeotiffに変換し、任意のパッケージ(「ラスター」など)を使用してファイルを読み取ります。古いhdfファイルと新しいhdfファイルの両方で同じことを行います。

ここにリンクがあります: https://newsroom.gsfc.nasa.gov/sdptoolkit/HEG/HEGHome.html

ここでサポートされているNASA製品をご覧ください: https://newsroom.gsfc.nasa.gov/sdptoolkit/HEG/HEGProductList.html

お役に立てれば。

0
Dhruva Kathuria