Maps of solar radiation
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The Atmospheric Science Data Center (ASDC) at NASA Langley Research Center offers several data sources. For example, it is possible to download a text file with the 22-year (July 1983 – June 2005) monthly and annual average of global horizontal irradiation.
nasafile <- 'http://eosweb.larc.nasa.gov/sse/global/text/global_radiation' nasa <- read.table(file=nasafile, skip=13, header=TRUE)
With this data, R and the solaR package we can calculate (for example) the global effective irradiation incident on several surfaces: a fixed PV generator, a two-axis tracker and a N-S horizontal tracker. First, let’s plot the original data using some spatial packages:
library(lattice) library(latticeExtra) library(solaR) library(sp) library(maps) library(mapdata) library(maptools) library(gstat) library(hexbin) proj <- CRS('+proj=latlon +ellps=WGS84') coords=nasa[,2:1] datos=nasa[,3:15] nasaSP <- SpatialPixelsDataFrame(points=coords, data=datos, proj4string=proj) world <- map("world", plot=FALSE) llCRS <- CRS("+proj=latlong +ellps=WGS84") world_sp <- map2SpatialLines(world, proj4string=llCRS) paleta=colorRampPalette(rev(brewer.pal('YlOrRd', n=9))) paleta2=colorRampPalette((brewer.pal('RdBu', n=11))) paleta3=heat.ob ##From hexbin mapa <- list('sp.lines', world_sp) spplot(nasaSP["Ann"], col.regions=paleta3, sp.layout=mapa)
Now we can calculate the global effective irradiation with solaR (NOTE: this loop spends some time to finish. The results are available here.)
N=nrow(nasa) gefNasa <- matrix(nrow=N, ncol=3) for (i in 1:N){ prom=list(G0dm=as.numeric(nasa[i,3:14]*1000)) lat=nasa[i,1] gefFixed <- calcGef(lat=lat, prom=prom) gef2x <- calcGef(lat=lat, modeRad='prev', prev=gefFixed, modeTrk='two') gefHoriz <- calcGef(lat=lat, modeRad='prev', prev=gefFixed, modeTrk='horiz') gefNasa[i, ] <- sapply(list(gefFixed, gef2x, gefHoriz), function(x)as.data.frameY(x)$Gefd) print(i) } gefNasaDF <- as.data.frame(gefNasa) names(gefNasaDF) <- c('Fixed', 'Two', 'Horiz')
Ok, we got it. Let’s build an Spatial object with it:
gefNasaSP <- SpatialPixelsDataFrame(points=coords, data=gefNasaDF, proj4string=proj)
And now we can plot the results. First, the two-axis tracker:
ncuts <- 7 colContour <- paleta3(ncuts)[2] spplot(gefNasaSP['Two'], sp.layout=mapa, col.regions=paleta3, colorkey=list(space='bottom'), contour=TRUE, cuts=ncuts, col=colContour, lwd=0.5, scales=list(draw=TRUE) )
then, the N-S horizontal tracker:
spplot(gefNasaSP['Horiz'], sp.layout=mapa, col.regions=paleta3, colorkey=list(space='bottom'), contour=TRUE, cuts=ncuts, col=colContour, lwd=0.5, scales=list(draw=TRUE) )
and now the fixed generator:
spplot(gefNasaSP['Fixed'], sp.layout=mapa, col.regions=paleta3, colorkey=list(space='bottom'), contour=TRUE, cuts=ncuts, col=colContour, lwd=0.5, scales=list(draw=TRUE) )
Finally, let’s plot the irradiation incident on a NS horizontal tracker versus the irradiation incident on a fixed surface for the latitudes between -60º and 60º. I use the violin and box plots as described here.
gefNasaSP$HorizFixed <- gefNasaSP$Horiz/gefNasaSP$Fixed bwplot(HorizFixed~cut(Lat, pretty(Lat, 40)), xlab='Latitude', ylab=expression(G[ef]^{horiz}/G[ef]^{fixed}), data=as.data.frame(gefNasaSP), horizontal=FALSE, panel = function(..., box.ratio) { panel.violin(..., col = "lightblue", varwidth = FALSE, box.ratio = box.ratio) panel.bwplot(..., col='black', cex=0.8, pch='|', fill='gray', box.ratio = .1) }, par.settings = list(box.rectangle=list(col='black'), plot.symbol = list(pch='.', cex = 0.1)), scales=list(x=list(rot=45, cex=0.6)), subset=(abs(Lat)<60))
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.