[R-sig-Geo] map projection problem

Roger Bivand Roger.Bivand at nhh.no
Wed Apr 2 10:36:48 CEST 2008


On Tue, 1 Apr 2008, Melanie Abecassis wrote:

> Hi,
> I am unsuccessfully trying to change the map projection  in map function
> of the maps library.
>
> Here is my code :
>
> library(maps)
> library(mapdata)
> library(mapproj)
>
> map(database = "world", fill = TRUE, col = 1, plot = TRUE,add=F,
> xlim = c(-200,-120), ylim = c(-5,45))
> map.axes()
>
> This gives me a map centered on Hawaii.
>
>
> I now want to have *the same map but in the mercator projection* :
>
> map(database = "world", fill = TRUE, col = 1, plot = TRUE,add=F,
> projection="mercator", xlim = c(-200,-120), ylim = c(-5,45))
> map.axes()
>
> And I get a weird map of the US  and parts of Canada only.
>

When fill=TRUE, map() actually returns the whole polygon, so you are 
seeing what you asked map() for, that's just the way it works. If you 
don't need fill, it dangles a bit, but only gives you a little more than 
you asked for.

There are two alternatives, one using map which leaves you with the 
continental US and Canada (I'm going to -180 rather than -200):

library(maps)
library(mapproj)
m0 <- map(database = "world", plot = FALSE, fill=TRUE,
  xlim = c(-200,-120), ylim = c(-5,45))
IDs <- sapply(strsplit(m0$names, ":"), function(x) x[1])
library(maptools)
m1 <- map2SpatialPolygons(m0, IDs=IDs, proj4string = CRS("+proj=longlat"))
summary(m1)
library(rgdal)
m2 <- spTransform(m1, CRS("+proj=merc"))
bb <- cbind(c(-180,-120), c(-5,45))
bbSP <- SpatialPoints(bb, proj4string = CRS("+proj=longlat"))
bbmerc <- spTransform(bbSP, CRS("+proj=merc"))
plot(m2, col=1, xlim=bbc[,1], ylim=bbc[,2])
summary(m2)

which gets you there but isn't clipped, or:

library(maptools)
gshhs.c.b <- system.file("share/gshhs_c.b", package="maptools")
g0 <- Rgshhs(gshhs.c.b, xlim=c(180, 240), ylim=c(-5, 45), level=1)
summary(g0$SP)
library(rgdal)
g2 <- spTransform(g0$SP, CRS("+proj=merc"))
plot(g2, col=1)
summary(g2)

using the coarse version of the GSHHS shorelines shipped with maptools. 
Both shrink the bounding box of the object to the actual shorelines.

In both of these cases, the output Mercator coordinates are the true 
coordinates, not the display coordinates used by mapproj.

Hope this helps,

Roger

>
> Then I tried this :
>
> A=mapproject(c(-200,-120), c(-5,45), projection="mercator")
>
> map(database = "world", fill = TRUE, col = 1, plot = TRUE,add=F,
> projection="mercator", xlim = A$x, ylim = A$y)
> map.axes()
>
> which should be the correct way to do this I think, but I get this :
> Error in map.poly(database, regions, exact, xlim, ylim, boundary,
> interior,  :
>  nothing to draw: all regions out of bounds
>
> Could anyone help me with this ?
> Thanks a lot,
> Melanie
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no




More information about the R-sig-Geo mailing list