Raster, CMSAF and solaR
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The Satellite Application Facility on Climate Monitoring (CMSAF) generates, archives and distributes widely recognised high-quality satellite-derived products and services relevant for climate monitoring in operational mode. The data is freely accesible here after a registration process.
I have ask them for several files with monthly averages of global solar radiation over the Iberian Peninsula (download). The raster package can easily read these files:
old <- getwd() ##change to your folder... setwd('/home/oscar/Datos/CMSAF') listFich <- dir(pattern='2008') listNC <- lapply(listFich, raster) stackSIS <- do.call(stack, listNC) stackSIS <- stackSIS*24 ##from irradiance (W/m2) to irradiation Wh/m2 setwd(old)
It is interesting to know that with the last version of raster
the Raster
objects include a z
slot, able to store information such as a time index. Its value is set with setZ
:
idx <- fBTd('prom', year=2008) SISmm <- setZ(stackSIS, idx) layerNames(SISmm) <- as.character(idx)
Besides, raster
has now an spplot
method for Raster objects:
spplot(SISmm, names.attr=layerNames(SISmm))
Let’s improve this plot:
xscale.raster <- function(...){ans <- xscale.components.default(...); ans$top=FALSE; ans} yscale.raster <- function(...){ans <- yscale.components.default(...); ans$right=FALSE; ans} myTheme=custom.theme.2(pch=19, cex=0.7, region=rev(brewer.pal(9, 'YlOrRd'))) myTheme$strip.background$col='transparent' myTheme$strip.shingle$col='transparent' myTheme$strip.border$col='transparent' p <- spplot(SISmm, names.attr=layerNames(SISmm), as.table=TRUE, par.settings=myTheme, between=list(x=0.5, y=0.2), scales=list(draw=TRUE), xscale.components=xscale.raster, yscale.components=yscale.raster)
And now let’s add the administrative borders. This information is available here. It is also accessible with raster::getData
although it does not work for me…
library(maptools) proj <- CRS('+proj=latlon +ellps=WGS84') old <- getwd() setwd('/home/oscar/Datos/ESP_adm')##Change to your folder mapaSHP <- readShapeLines('ESP_adm2.shp', proj4string=proj) setwd(old)
The layer
function from latticeExtra
and the sp.lines
function from sp
add easily this information to our previous plot:
p + layer(sp.lines(mapaSHP, lwd=0.8))
Now it is time for using solaR
and calculate the effective irradiance in an inclined plane. First we have to define a suitable function:
foo <- function(x, ...){ gef <- calcGef(lat=x[1], dataRad=list(G0dm=x[2:13])) result <- as.data.frameY(gef)[c('Gefd', 'Befd', 'Defd')]##the results are yearly values as.numeric(result) }
raster::calc
will apply this function to each cell of the stack
. Previously we need a latitude layer:
latLayer <- init(SISmm, v='y')
Finally we are ready for the combination of raster
and solaR
. The next piece of code spends a long time: the result, the RasterLayer
gefCMSAF
, is available here).
gefS <- calc(stack(latLayer, SISmm), foo, filename='/home/oscar/Datos/CMSAF/gefCMSAF',##change to your folder overwrite=TRUE) layerNames(gefS)=c('Gefd', 'Befd', 'Defd')##Three layers spplot(subset(gefS, 'Gefd'), par.settings=myTheme, scales=list(draw=TRUE)) + layer(sp.lines(mapaSHP))
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.