Transverse Projections
Traditional cylindrical projections assume that the cylinder onto which the world is projected is tangential to (or cuts) a parallel. In transverse projections the cylinder is tangential to a meridian. If a line joining the north pole to the south pole is considered to be vertical, then the projected cylinder in the transverse case is horizontal. There are three transverse projections in the Maps package: the Cassini projection, the transverse cylindrical equal area, and the Transverse Mercator. The latter has become one of the most important of all map projections.
Cassini Projection
The coordinate information for the Cassini projection is
>
`Maps/coords`[`Cassini`] :=
input = [alpha,phi],
coords = [lambda = ''readlib(`Maps/shiftf`)(alpha+Pi/2,Pi)'',
x = r*arcsin(cos(phi)*sin(lambda)),
y = r*(`if`(abs(phi) >= Pi/2,
signum(phi)*Pi,
arctan(tan(phi)/cos(lambda)))
+ Pi/2*(1-'signum'(cos(lambda)))),
[''readlib(`Maps/shiftf`)(x,Pi)'',
''readlib(`Maps/shiftf`)(y,Pi)'']],
params = [r],
view = [-180..180,-90..90,13,7,-90..90,-180..180]:
Note here the first line of the coords option which shifts the longitude so that the central meridian is 90 W.
>
makeprojections(Cassini):
Warning: coordinates already exists, system redefined.
Warning: default information already exists, redefining.
The coordinate system can be plotted using coordplot, but it is necessary to use removelines to eliminate undesired line wraps.
>
ccoords:=removelines(coordplot(Cassini,scaling=constrained)): ccoords;
>
cmap:=removelines(changecoords(world[ng,1866],Cassini)):
>
a:=90: b:=180:
cbox := plot([[-a,-b],[-a,b],[a,b],[a,-b],[-a,-b]],color=black):
>
plots[display]({cmap,cbox,ccoords});
Transverse Mercator
The transverse Mercator is one of the more complicated projections to create using the Maps package (a good reason for including it as a predefined system). The complication arises because the coordinate system is undefined at the poles, necessitating the use of
traperror
and
lasterror
in the command sequence. As with the Cassini, the central meridian is 90 W.
>
`Maps/coords`[`Transverse Mercator`] :=
input = [alpha,phi],
coords = [lambda = ''readlib(`Maps/shiftf`)(alpha+Pi/2,Pi)'',
y = r*(`if`(abs(phi) >= Pi/2,
signum(phi)*Pi,
arctan(tan(phi)/cos(lambda)))
+ Pi/2*(1-'signum'(cos(lambda)))),
x = ''traperror(r/2*ln((1+cos(phi)*sin(lambda))/
(1 - cos(phi)*sin(lambda))))'',
''[`if`(lasterror = '`lasterror`',
readlib(`Maps/shiftf`)(x,Pi),FAIL),
readlib(`Maps/shiftf`)(y,Pi)]''],
params = [r],
view = [-180..180,-90..90,13,7,-180..180,-180..180]:
>
makeprojections(`Transverse Mercator`);
Warning, check parameter definitions r <> lasterror
Warning: coordinates already exists, system redefined.
Warning: default information already exists, redefining.
>
tmgrid:=removelines(coordplot(`Transverse Mercator`,scaling=constrained)):
>
tmmap:=removelines(changecoords(world[ng,1866],`Transverse Mercator`)):
>
plots[display]({tmmap,tmgrid},axes=boxed,xtickmarks=0,ytickmarks=0,view=[-110..110,-180..180]);
>