! mercator_demo.jnl 9/96 ! Description: Plot a 2-panel demonstration of a Mercator projection ! Note that Lambert conformal is very similar (see Lambert conformal eqn below) ! usage: GO mercator_demo [Y_lo, Y_hi] [Y_tics] ! Y_lo,Y_hi - latitude range to plot ! Y_tics - the tic spacing on the Mercator plot ! The technique that is used is to create a new Y axis of "page positions" ! made by transforming the latitudes of the data grid using the ! Mercator equations. Then "associate" the data with these page positions ! (replacing the original latitudes) using the "GY=@ASN" syntax. ! The only complication to this is to get the axis tic marks as desired ! For that we use the REPEAT loop at the end of the demo ! Map Projections -- A Working Manual ! J.P. Snyder ! USGS Professional Paper 1395 ! US Govt Printing Office, 1987. CANCEL REGION SET WIND/ASP=1.2 SET DATA etopo60 ! determine J index limits corresponding to requested latitude range ! (the default range is 80S to 80N) LET j_lo = J[G=ROSE,Y=$1"80S"] LET j_hi = J[G=ROSE,Y=$2"80N"] ! ***** Standard Rectilinear Projection (for comparison) ***** SET VIEW upper GO magnify 1.2 ! looks nicer SHADE/LEV=(0,10000,1000)/PALETTE=dark_terrestrial/NOKEY/j=`j_lo`:`j_hi` rose ! ***** Mercator Projection ***** SET VIEW lower GO magnify 1.2 ! looks nicer ! define the vertical page location axis ! (the transformed latitudes of the grid to be plotted) LET pi = 3.141529 LET degrad = pi/180 LET radian_lat = degrad * y[g=rose] LET yp = LOG(TAN(radian_lat/2 + pi/4)) ! Mercator eqn ! LET yp = SIN(radian_lat) ! Lambert Conformal eqn. DEFINE AXIS/from/y/name=ypageax yp ! plot the data on a Mercator projection (omit Y axis) SHADE/LEVELS/PALETTE=dark_terrestrial/NOKEY/SET_UP/j=`j_lo`:`j_hi` rose[gy=ypageax@asn] PPL YLAB PPL AXSET 1,1,0,0 ! suppress latitude axes PPL TITLE .15 @CRRelief using Mercator Projection PALETTE dark_terrestrial;ppl shade;palette default PPL AXSET 1,1,1,1 ! *** Vertical Axis Tics *** ! draw vertical axis lines PPL ALINE/NOUSER 1,0,0,0,($PPL$YLEN) PPL ALINE/NOUSER 1,($PPL$XLEN),0,($PPL$XLEN),($PPL$YLEN) ! "lat" will be the latitude of each tic to be drawn LET radian_lat=degrad * lat DEFINE AXIS/Y=$1"80s":$2"80n":$3"40" ytics ! small correction to get label text to align with tic mark LET lat = `y[gy=ytics,y=$1"80s"]`; LET ypage_lo = `yp` LET lat = `y[gy=ytics,y=$2"80n"]`; LET ypage_hi = `yp` LET yoffset = 0.02*(ypage_hi - ypage_lo) ! draw the tics ! note 1: the tic at the equator should really be drawn separately REPEAT/Y=$1"80s":0:$3"40" (LET lat=`y[gy=ytics]`; PPL ALINE 1,12,`yp`,20,`yp`; LABEL 8,`yp-yoffset`,1,0,.1 "@SR`ABS(lat)`#S") REPEAT/Y=0:$2"80n":$3"40" (LET lat=`y[gy=ytics]`; PPL ALINE 1,12,`yp`,20,`yp`; LABEL 8,`yp-yoffset`,1,0,.1 "@SR`lat`#N") LABEL -15,0,0,90,.12 LATITUDE