Hello,

Perhaps the problem could be related with the CRS setting you are using.
Instead of:

global.map.proj <- CRS('+proj=latlon +ellps=WGS84')

you should try:

global.map.proj <- CRS('+proj=longlat +ellps=WGS84')

Besides, following your code I think you are not setting the CRS of your
RasterBrick.

I have tried successfully the next toy example:

global.map.proj <- CRS('+proj=longlat +ellps=WGS84')
global.map <- map('world', plot=FALSE)
global.map.shp <- map2SpatialLines(global.map, proj4string=global.map.proj)

r <- raster()
r <- init(r, fun=function(x)1)
projection(r) <- global.map.proj
levelplot(r) + layer(sp.lines(global.map.shp))

Besides, you can modify the theme to fill the sea (NA values) with color:

myTheme <- modifyList(RdBuTheme(),
list(panel.background=list(col='skyblue3')))
## you won't see any differences here because r does not contains NA cells.
levelplot(r, par.settings=myTheme) + layer(sp.lines(global.map.shp))

Finally, you may find useful these sources for the countries boundaries:

http://www.diva-gis.org/Data
http://www.naturalearthdata.com/downloads/110m-cultural-vectors/

Best,

Oscar.

2012/12/19 Michael Sumner <mdsum...@gmail.com>

> Here's a crack at a full example, sorry the clip/merge polygon stuff
> is a mess still.
>
> library(maptools)
> library(raster)
>
> ## first, do the jiggery pokery of wrld_simpl to
> ## convert from Atlantic to Pacific view
> xrange <- c(0, 360)
> yrange <- c(-90, 90)
>
> require(maptools)
> require(raster)
> require(rgeos)
>
>     ext <- extent(xrange[1], xrange[2], yrange[1], yrange[2])
>     data(wrld_simpl, package = "maptools")
>
> ## this is a bit more general than needed for this example, since I
> ## wanted arbitrary crops originally
>
>         eastrange <- c(xrange[1], 180.0)
>         westrange <- c(-180.0, xrange[2] - 360)
>
>         ew <- extent(westrange[1], westrange[2], yrange[1], yrange[2])
>         ee <- extent(eastrange[1], eastrange[2], yrange[1], yrange[2])
>
>         geome <- as(ee, "SpatialPolygons")
>         geomw <- as(ew, "SpatialPolygons")
>
>         ## why does this get dropped?
>         proj4string(geome) <- CRS(proj4string(wrld_simpl))
>         proj4string(geomw) <- CRS(proj4string(wrld_simpl))
>
>         worlde <- gIntersection(wrld_simpl, geome)
>         worldw <- gIntersection(wrld_simpl, geomw)
>         worldw <- elide(worldw, shift = c(360.0, 0.0))
>
>         proj4string(worldw) <- CRS(proj4string(wrld_simpl))
>
>         dfe <- data.frame(x = seq_len(length(worlde@polygons)))
>         dfw <- data.frame(x = seq_len(length(worldw@polygons)))
>         rownames(dfw) <- as.character(as.numeric(rownames(dfe)) +
> nrow(dfe))
>
>         worlde <- SpatialPolygonsDataFrame(worlde, dfe, match.ID = FALSE)
>         worldw <- SpatialPolygonsDataFrame(worldw, dfw, match.ID = FALSE)
>         worldw <- spChFIDs(worldw, rownames(dfw))
>
>         world <- spRbind(worlde, worldw)
>
>
> ## so, "world" is longitudes [0, 360], which is pretty much essential
> ## given the input data shown
>
> r <- raster(nrows = 180, ncols = 360, xmn = 0, xmx = 360, ymn = -90,
> ymx = 90, crs = "+proj=longlat +ellps=WGS84 +over")
>
> ## fake a raster so we have something equivalent to your data (but
> simple/r)
> rast <- rasterize(world, r)
>
> ## fill the ocean parts with something . . .
> rast[is.na(rast)] <- 1:sum(is.na(getValues(rast)))
>
> library(rasterVis)
> levelplot(rast, margin = FALSE) + layer(sp.polygons(world, lwd=0.8,
> col='darkgray'))
>
>
>
>
>
> On Tue, Dec 18, 2012 at 8:55 PM, Michael Sumner <mdsum...@gmail.com>
> wrote:
> > I meant "wrld_simpl2 version like the maps package has".
> >
> > On Tue, Dec 18, 2012 at 8:54 PM, Michael Sumner <mdsum...@gmail.com>
> wrote:
> >> I happened to write this yesterday, which switches the parts of
> >> wrld_simpl from < 0 longitude to the east (Pacific view). I haven't
> >> investigated what you need in detail, so just ignore if I'm off track.
> >>
> >> It's not careful about data or anything, since all I needed was the
> >> raw geometry. It might be of use. "xrange" here can be anything from
> >> [-180, 360] though it's really assuming you don't traverse more than
> >> 360 in total.
> >>
> >> It would be nice to carefully clean up a copy of wrld_simpl like this
> >> and make a wrld_simpl version like the maps package has.
> >>
> >> Cheers, Mike.
> >>
> >>
> >> xrange <- c(140, 250)
> >> ##xrange <- c(0, 360)
> >> yrange <- c(-60, 20)
> >>
> >> require(maptools)
> >> require(raster)
> >> require(rgeos)
> >>
> >>
> >>
> >>     ext <- extent(xrange[1], xrange[2], yrange[1], yrange[2])
> >>     data(wrld_simpl, package = "maptools")
> >>     if (xrange[2] > 180.0) {
> >>
> >>         eastrange <- c(xrange[1], 180.0)
> >>         westrange <- c(-180.0, xrange[2] - 360)
> >>
> >>         ew <- extent(westrange[1], westrange[2], yrange[1], yrange[2])
> >>         ee <- extent(eastrange[1], eastrange[2], yrange[1], yrange[2])
> >>
> >>         geome <- as(ee, "SpatialPolygons")
> >>         geomw <- as(ew, "SpatialPolygons")
> >>
> >>         ## why does this get dropped?
> >>         proj4string(geome) <- CRS(proj4string(wrld_simpl))
> >>         proj4string(geomw) <- CRS(proj4string(wrld_simpl))
> >>
> >>         worlde <- gIntersection(wrld_simpl, geome)
> >>         worldw <- gIntersection(wrld_simpl, geomw)
> >>         worldw <- elide(worldw, shift = c(360.0, 0.0))
> >>
> >>         proj4string(worldw) <- CRS(proj4string(wrld_simpl))
> >>
> >>         dfe <- data.frame(x = seq_len(length(worlde@polygons)))
> >>         dfw <- data.frame(x = seq_len(length(worldw@polygons)))
> >>         rownames(dfw) <- as.character(as.numeric(rownames(dfe)) +
> nrow(dfe))
> >>
> >>         worlde <- SpatialPolygonsDataFrame(worlde, dfe, match.ID =
> FALSE)
> >>         worldw <- SpatialPolygonsDataFrame(worldw, dfw, match.ID =
> FALSE)
> >>         worldw <- spChFIDs(worldw, rownames(dfw))
> >>
> >>         world <- spRbind(worlde, worldw)
> >>
> >>     } else {
> >>
> >>         geom <- as(ext, "SpatialPolygons")
> >>         proj4string(geom) <- CRS(proj4string(wrld_simpl))
> >>         ## TODO: make this spdf if needed
> >>         world <- gIntersection(wrld_simpl, geom)
> >>     }
> >>
> >>
> >> plot(world)
> >>
> >>
> >>
> >> On Tue, Dec 18, 2012 at 8:15 PM, Tom Roche <tom_ro...@pobox.com> wrote:
> >>>
> >>> summary: I've tried several ways to draw wrld_simpl over global data
> >>> plotted with rasterVis::levelplot, but keep encountering the same
> >>> problem:
> >>>
> >>> - only the eastern hemisphere of the map plots
> >>>
> >>> - the eastern hemisphere of the map overlays the western hemisphere of
> >>>   the data
> >>>
> >>> How to fix? or otherwise provide geographical context?
> >>>
> >>> details:
> >>>
> >>> (I'll attempt to produce a "complete, self-contained example" after I
> >>> make the code publicly viewable, but for now, I'm hoping the problem is
> >>> sufficiently simple to diagnose.)
> >>>
> >>> I have atmospheric data in a netCDF file specifying gas concentrations
> >>> over a 3D space with dimensions longitude, latitude, and (vertical)
> >>> level, such that
> >>>
> >>> * the horizontal extents are global
> >>>
> >>> * the vertical coordinates are pressures (specifically hybrid
> >>>   sigma-pressure)
> >>>
> >>> package=raster provides very usable API for loading the data into a
> >>> RasterBrick, and package=rasterVis makes it relatively easy to
> levelplot
> >>> the data in a single "atmospheric column" with the highest pressures at
> >>> the bottom. However I also want to provide some geographic context
> >>> (e.g., to overlay the data with national boundaries), and have failed
> to
> >>> date.
> >>>
> >>> I have done this with maptools::wrld_simpl successfully in other
> >>> contexts, i.e.,
> >>>
> >>> * loading the data with package=ncdf4 (which is considerably more work)
> >>> * converting the data to a data.frame
> >>> * lattice::levelplot-ing the data
> >>> * lattice::xyplot-ing the map
> >>>
> >>> But when I do
> >>>
> >>> data(wrld_simpl)
> >>> global.raster <- brick(in.fp, varname=data.var.name)
> >>> layers.n <- nbands(global.raster)
> >>> global.data.df <- as.data.frame(global.raster)
> >>> # some twiddling of names(global.data.df) omitted
> >>> global.map <- map('world', plot=FALSE)
> >>> global.map.df <- data.frame(lon=global.map$x, lat=global.map$y)
> >>> pdf(file=pdf.fp, width=5, height=100)
> >>> # using rasterVis::levelplot, not lattice::levelplot
> >>> levelplot(global.raster,
> >>>   margin=FALSE,
> >>>   names.attr=names(global.data.df),
> >>>   layout=c(1,layers.n), # all layers in one "atmospheric column"
> >>> ) + xyplot(lat ~ lon, global.map.df, type='l', lty=1, lwd=1,
> col='black')
> >>> dev.off()
> >>>
> >>> the data plots apparently correctly, but the map plots incorrectly, as
> >>> shown by this .png of the top level:
> >>>
> >>> https://docs.google.com/open?id=0BzDAFHgIxRzKOVdlSDFMR29BdWM
> >>>
> >>> As noted above, the map's eastern hemisphere overlays the data's
> western
> >>> hemisphere, and nothing overlays the data's eastern hemisphere.
> >>>
> >>> I tried several variations on the above, but either got the same
> >>> results, or outright error. (Unfortunately the error messages are often
> >>> printed on the levelplot, but the messages are truncated (so they can't
> >>> be understood), and it's annoying to "fail slow" (after waiting for a
> >>> long plot to finish).) So after some research I sought to emulate the
> >>> means recommended @
> >>>
> >>> http://rastervis.r-forge.r-project.org/#levelplot
> >>>
> >>> data(wrld_simpl)
> >>> global.raster <- brick(in.fp, varname=data.var.name)
> >>> layers.n <- nbands(global.raster)
> >>> global.data.df <- as.data.frame(global.raster)
> >>> # some twiddling of names(global.data.df) omitted
> >>> global.map.proj <- CRS('+proj=latlon +ellps=WGS84')
> >>> global.map <- map('world', plot=FALSE)
> >>> global.map.shp <- map2SpatialLines(global.map,
> proj4string=global.map.proj)
> >>> pdf(file=pdf.fp, width=5, height=100)
> >>> # using rasterVis::levelplot, not lattice::levelplot
> >>> levelplot(global.raster,
> >>>   margin=FALSE,
> >>>   names.attr=names(global.data.df),
> >>>   layout=c(1,layers.n), # all layers in one "atmospheric column"
> >>> ) + layer(sp.lines(global.map.shp, lwd=0.8, col='darkgray'))
> >>> dev.off()
> >>>
> >>> This also fails, and very similarly (though the line colors differ).
> See
> >>> this .png:
> >>>
> >>> https://docs.google.com/open?id=0BzDAFHgIxRzKYzd6cVB2TDE4RE0
> >>>
> >>> I'm guessing I can either do something simple to wrld_simpl's longitude
> >>> values, or Something Completely Different that would Just Work Better,
> >>> but don't know. Your assistance is appreciated.
> >>>
> >>> TIA, Tom Roche <tom_ro...@pobox.com>
> >>>
> >>> _______________________________________________
> >>> R-sig-Geo mailing list
> >>> R-sig-Geo@r-project.org
> >>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> >>
> >>
> >>
> >> --
> >> Michael Sumner
> >> Hobart, Australia
> >> e-mail: mdsum...@gmail.com
> >
> >
> >
> > --
> > Michael Sumner
> > Hobart, Australia
> > e-mail: mdsum...@gmail.com
>
>
>
> --
> Michael Sumner
> Hobart, Australia
> e-mail: mdsum...@gmail.com
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>

        [[alternative HTML version deleted]]

_______________________________________________
R-sig-Geo mailing list
R-sig-Geo@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-sig-geo

Reply via email to