[R-sig-Geo] Maps across the dateline

Roger Bivand Roger.Bivand at nhh.no
Thu Jan 19 22:01:32 CET 2006


On Thu, 19 Jan 2006 White.Denis at epamail.epa.gov wrote:

While there are plenty of good answers to this question, the most direct 
one - given that the maps package is maintained from New Zealand, is to 
use the world2 database it provides:

?world2

which runs 0-360 (roughly), and should be good enough resolution for a 
whole-Pacific map.

Roger

> 
> 
> >I'm trying to plot some
> >data for the Pacific Ocean and want to get a map onto my plot as
> >well.
> >I'm using the function 'map()' from library(maps). However, I cannot
> >get it to plot anything across the dateline since it requires that
> >longitudes between 180 and 360 degrees east to be written as negative
> >degrees east of Greenwich (e.g. -180 to 0 degrees east). The
> >longitudes
> >I want to plot are 135 to 255 degrees east but the function map()
> >wants
> >that to be written 135 to 180 degrees east and -180 to -105 degrees
> >east, so I would have to divide the grid up in two. But even if I do
> >that I can't plot it together because -180 doesn't come after 180.
> >
> >Does anyone have a way to plot something across the dateline? I only
> >want a map of the Pacific, not the rest of the world.
> >
> >Thanks,
> >Anne Hertel
> 
> If you use an appropriate map projection centered at 180/-180, for
> example, then you should be able to plot your data and islands or
> latitude/longitude lines as desired.  See the following example for
> plotting some random points and the latitude and longitude graticule
> lines using one particular map projection.  This projection, the Lambert
> azimuthal, is an equal area projection but may not be the most
> appropriate for your needs.  There are web sites that can help to choose
> a projection if you need it.
> 
> # plot data across 180/-180
> 
> # Lambert azimuthal equal area map projection
> lambaz <- function (lon, lat, clon=NULL, clat=NULL)
>   # Arguments are vectors of longitude and latitude,
>   # that is, geographic coordinates in decimal degrees.
>   # Projection center is (clon, clat), which, if null, is
>   # set to the midpoint of the input in lat-lon space.
>   # Line identifiers in lon[is.na (lat)] retained in x.
>   # Returns a two column matrix with column names "x" and "y",
>   # in units of kilometers.  This is Lambert's azimuthal
>   # equal area map projection using a spherical earth model.
>   # (ref JP Snyder, USGS Prof Paper 1395, p 182 ff).
> {
>     R <- 6371 # authalic radius of Clarke 1866 rounded to km
>     if (is.null (clon) || is.null (clat))
>     {
>         rlat <- range (lat, na.rm=TRUE)
>         rlon <- range (lon, na.rm=TRUE)
>         clat <- diff (rlat) / 2 + rlat[1]
>         clon <- diff (rlon) / 2 + rlon[1]
>     }
>     dlon <- (lon - clon) * pi / 180
>     cosdlon <- cos (dlon)
>     sinlat <- sin (lat * pi / 180)
>     coslat <- cos (lat * pi / 180)
>     sinclat <- sin (clat * pi / 180)
>     cosclat <- cos (clat * pi / 180)
>     kp <- 1 + sinclat*sinlat + cosclat*coslat*cosdlon
>     kp <- sqrt (2 / kp)
>     x <- R * kp * coslat * sin (dlon)
>     y <- R * kp * (cosclat*sinlat - sinclat*coslat*cosdlon)
>     x[is.na (lat)] <- lon[is.na (lat)]
>     xy <- cbind (x=x, y=y)
>     xy
> }
> 
> # generate latitude and longitude graticules
> graticule <- function (minlon=-180, maxlon=180,
>     minlat=-90, maxlat=90, ginc=10, dinc=2)
> {
>     dlon <- maxlon - minlon
>     dlat <- maxlat - minlat
>     nr <- (dlon / dinc + 1) * (dlat / ginc + 1) +
>         (dlat / dinc + 1) * (dlon / ginc + 1) +
>         dlon / ginc + dlat / ginc + 2
>     geo <- matrix (0, nrow=nr, ncol=2)
>     i <- n <- 0
>     for (lon in seq (minlon, maxlon, by=ginc))
>     {
>         i <- i + 1
>         n <- n + 1
>         geo[i, 1] <- n
>         geo[i, 2] <- NA
>         for (lat in seq (minlat, maxlat, by=dinc))
>         {
>             i <- i + 1
>             geo[i, 1] <- lon
>             geo[i, 2] <- lat
>         }
>     }
>     for (lat in seq (minlat, maxlat, by=ginc))
>     {
>         i <- i + 1
>         n <- n + 1
>         geo[i, 1] <- n
>         geo[i, 2] <- NA
>         for (lon in seq (minlon, maxlon, by=dinc))
>         {
>             i <- i + 1
>             geo[i, 1] <- lon
>             geo[i, 2] <- lat
>         }
>     }
>     geo
> }
> 
> # a graticule for central pacific
> east.part <- graticule (minlon=-180, maxlon=-150,
>                         minlat=-30, maxlat=30)
> west.part <- graticule (minlon= 150, maxlon= 180,
>                         minlat=-30, maxlat=30)
> grat.geo <- rbind (east.part, west.part)
> grat.lam <- lambaz (grat.geo[,1], grat.geo[,2], clon=180, clat=0)
> 
> # generate random points in central pacific
> east.pts <- cbind (runif (100, min=-180, max=-150),
>                    runif (100, min=-30, max=30))
> west.pts <- cbind (runif (100, min= 150, max= 180),
>                    runif (100, min=-30, max=30))
> pts.geo <- rbind (east.pts, west.pts)
> pts.lam <- lambaz (pts.geo[,1], pts.geo[,2], clon=180, clat=0)
> 
> # plot in geographic coordinate space (lat, lon)
> plot.new ()
> plot.window (range (grat.geo[,1], na.rm=TRUE),
>              range (grat.geo[,2], na.rm=TRUE), asp=1)
> lines (grat.geo)
> points (pts.geo, pch=20)
> 
> # plot in Lambert space
> plot.new ()
> plot.window (range (grat.lam[,1], na.rm=TRUE),
>              range (grat.lam[,2], na.rm=TRUE), asp=1)
> lines (grat.lam)
> points (pts.lam, pch=20)
> 
> _______________________________________________
> 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