library(magrittr)
library(rgdal)
## Loading required package: sp
## rgdal: version: 1.3-4, (SVN revision 766)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 2.2.2, released 2017/09/15
## Path to GDAL shared files: /usr/share/gdal/2.2
## GDAL binary built with GEOS: TRUE
## Loaded PROJ.4 runtime: Rel. 4.9.2, 08 September 2015, [PJ_VERSION: 492]
## Path to PROJ.4 shared files: (autodetected)
## Linking to sp version: 1.3-1
library(raster)
##
## Attaching package: 'raster'
## The following object is masked from 'package:magrittr':
##
## extract
library(gdalUtils)
library(fst)
setwd("/home/michael/Dropbox/BGU/Itai_Kloog/p_55_processing_MODIS_LST_from_HDF_to_table/")
# Start
start = Sys.time()
# HDF file name
filename = "MOD11A1.A2016183.h18v04.006.2016241045804.hdf"
# Get subdataset paths & variable names
s = get_subdatasets(filename)
vars = gsub(".*:", "", s)
# Read from HDF to multi-band raster
r = stack()
for(i in s) {
tmp = i %>% readGDAL %>% raster
r = stack(r, tmp)
}
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:LST_Day_1km has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:QC_Day has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Day_view_time has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Day_view_angl has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:LST_Night_1km has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:QC_Night has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Night_view_time has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Night_view_angl has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Emis_31 has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Emis_32 has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Clear_day_cov has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
## HDF4_EOS:EOS_GRID:MOD11A1.A2016183.h18v04.006.2016241045804.hdf:MODIS_Grid_Daily_1km_LST:Clear_night_cov has GDAL driver HDF4Image
## and has 1200 rows and 1200 columns
names(r) = vars
# Examine raster
plot(r)

# To points
pnt = rasterToPoints(r, spatial = TRUE)
pnt = spTransform(pnt, "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
# To table
dat = as.data.frame(pnt)
# Rename 'x-y' to 'lon-lat'
dat$lon = dat$x; dat$lat = dat$y
dat$x = NULL; dat$y = NULL
# Add metadata
dat$date =
filename %>%
strsplit("\\.") %>%
sapply("[", 2) %>%
gsub("A", "", .) %>%
as.Date(format = "%Y%j")
# Subset variables to keep
to_keep = c(
"date",
"lon",
"lat",
"LST_Day_1km",
"QC_Day",
"Day_view_time",
# "Day_view_angl",
"LST_Night_1km",
"QC_Night",
"Night_view_time",
# "Night_view_angl",
"Emis_31",
"Emis_32"#,
# "Clear_day_cov",
# "Clear_night_cov",
)
dat = dat[, to_keep]
# Examine result
head(dat)
## date lon lat LST_Day_1km QC_Day Day_view_time
## 1 2016-07-01 0.006481621 49.99583 NA 3 NA
## 2 2016-07-01 0.019444863 49.99583 NA 3 NA
## 3 2016-07-01 0.032408104 49.99583 NA 3 NA
## 4 2016-07-01 0.045371346 49.99583 NA 3 NA
## 5 2016-07-01 0.058334588 49.99583 NA 3 NA
## 6 2016-07-01 0.071297830 49.99583 NA 3 NA
## LST_Night_1km QC_Night Night_view_time Emis_31 Emis_32
## 1 NA 3 NA NA NA
## 2 NA 3 NA NA NA
## 3 NA 3 NA NA NA
## 4 NA 3 NA NA NA
## 5 NA 3 NA NA NA
## 6 NA 3 NA NA NA
# Write table
write.fst(dat, gsub(".hdf", ".fst", filename, fixed = TRUE))
# End
end = Sys.time()
# Overall timing
end - start
## Time difference of 7.342018 secs