[R-sig-Geo] how to use levelplot() with a geographic projection
Oscar Perpiñán Lamigueiro
oscar.perpinan at gmail.com
Sat Sep 7 09:31:34 CEST 2013
Hello,
Scott, here I propose a different way to build and fill the RasterStack
object:
## make the stack object
myrast <- raster(xmn=xmn, xmx=xmx, ymn=ymn, ymx=ymx, ncols=num.lon, nrows=num.lat)
myrast[] <- NA
raster.stack <- stack(lapply(1:4, function(i)myrast))
## use cellFromXY() to select the target cells in the raster
select.cell.numbers <- cellFromXY(raster.stack, select.coords)
## give the selected cells some values
vals <- sapply(1:4, function(i)seq(i, i+1, length=num.sel.cells))
raster.stack[select.cell.numbers] <- vals
Best,
Oscar
Waichler, Scott R writes:
> For the archive, here is a complete example of using rasterVis to do the following:
>
> -- use levelplot() to draw multiple panels with maps being geographically correct
> -- create raster objects and supply values for some of the cells, selected from
> a matrix of longitude, latitude coordinates
> -- overlay polygons (state boundaries) for reference
>
> Thanks to Oscar Perpiñán Lamigueiro and Tom Philippi for their help.
>
> library(maps)
> library(maptools)
> library(raster)
> library(rasterVis)
>
> data(stateMapEnv) # for U.S. state boundaries
> state.map <- map("state", plot=F)
> set_Polypath(FALSE) # per Roger Bivand, allows overprinting with sp.polygons()
>
> # generate geographic cell boundaries that cover the northwest U.S.
> lon.cell.bounds <- seq(-125, -109, by=1)
> lat.cell.bounds <- seq(41, 49, by=1)
> # save min and max for raster later
> xmn <- min(lon.cell.bounds); xmx <- max(lon.cell.bounds)
> ymn <- min(lat.cell.bounds); ymx <- max(lat.cell.bounds)
> # get the centers of the cells
> lon <- (lon.cell.bounds[1:(length(lon.cell.bounds)-1)] + lon.cell.bounds[2:length(lon.cell.bounds)]) / 2
> lat <- (lat.cell.bounds[1:(length(lat.cell.bounds)-1)] + lat.cell.bounds[2:length(lat.cell.bounds)]) / 2
> num.lon <- length(lon) # number of cells in longitude (x)
> num.lat <- length(lat) # number of cells in latitude (y)
>
> # Create a matrix of selected cell coordinates, roughly corresponding to the state of Washington.
> select.lon <- seq(-123.5, -117.5, by=1)
> select.lat <- seq(46.5, 48.5, by=1)
> select.coords <- expand.grid(select.lon, select.lat)
> num.sel.cells <- nrow(select.coords)
>
> raster.layers <- list()
> for(i in 1:4) {
> # make the raster object
> myrast <- raster(xmn=xmn, xmx=xmx, ymn=ymn, ymx=ymx, ncols=num.lon, nrows=num.lat)
> # use cellFromXY() to select the target cells in the raster
> select.cell.numbers <- cellFromXY(myrast, select.coords)
> # give the selected cells some values
> myrast[select.cell.numbers] <- seq(i, i+1, length=num.sel.cells)
> # save the raster to the list
> raster.layers[[i]] <- myrast
> }
> raster.stack <- stack(raster.layers) # stack is a collection of RasterLayer objects
>
> # polygon shapefile for the state boundaries
> ext <- as.vector(extent(raster.stack[[1]]))
> boundaries <- map('state', fill=TRUE, xlim=ext[1:2], ylim=ext[3:4], plot=FALSE)
> IDs <- sapply(strsplit(boundaries$names, ":"), function(x) x[1])
> bPols <- map2SpatialPolygons(boundaries, IDs=IDs, proj4string=CRS(projection(raster.stack[[1]])))
>
> # plot it!
> levelplot(raster.stack,
> names.attr=c("Panel 1, 1-2", "Panel 2, 2-3", "Panel 3, 3-4", "Panel 4, 4-5"),
> panel = function(...) {
> panel.levelplot(...)
> sp.polygons(bPols)
> }, main=paste(sep="\n", "Washington should be mostly covered with a rectangle",
> "and color should be darkest in lower left corner,",
> "lightest in upper right"),
> margin=F)
>
>> -----Original Message-----
>> From: Oscar Perpiñán Lamigueiro [mailto:oscar.perpinan at gmail.com]
>> Subject: Re: [R-sig-Geo] how to use levelplot() with a geographic
>> projection
>>
>> Hi,
>>
>> I think your problem is related with the way you define the RasterLayer.
>> You should use cellFromXY instead.
--
Oscar Perpiñán Lamigueiro
Grupo de Sistemas Fotovoltaicos (IES-UPM)
Dpto. Ingeniería Eléctrica (EUITI-UPM)
URL: http://http://oscarperpinan.github.io
Twitter: @oscarperpinan
More information about the R-sig-Geo
mailing list