Miscellaneous Projections - Guyou
The Guyou projection is the transverse of the Pierce quincuncial projection developed in another worksheet. Guyou's projection uses some of the same equations in its coordinate system, beginning with the integral equations:
> `Pierce/integral` := unapply(int(1/sqrt(1-1/2*sin(t)^2),t=0..v),v);
> x = `Pierce/integral`(v);
> y=`Pierce/integral`(u);
In the Guyou projection u and v are given by
> sin(u) = sqrt(1+cos(a)*cos(b)-sin(a)*sin(b));
> sin(v) = sqrt(1-cos(a)*cos(b)-sin(a)*sin(b));
with parameters a and b given by
> a = arccos(sqrt(2)/2*(cos(phi)*sin(lambda)-sin(phi)));
> b = arccos(sqrt(2)/2*(cos(phi)*sin(lambda)+sin(phi)));
Numerical results for the necessary integral can be obtained as follows:
>
GuyouElliptic := proc(xx)
option remember;
evalf(EllipticF(sin(abs(xx)),1/2*2^(1/2)));
end;
We now proceed to define the coordinate system as a series of equations as shown below. Note the use of the signum function to assign the appropriate sign to the coordinates and the enclosure of the entire algorithm within quote marks to delay evaluation of the functions.
>
`Guyou/equations`:= 'a = arccos(sqrt(2)/2*(cos(phi)*sin(lambda)-sin(phi))),
b= arccos(sqrt(2)/2*(cos(phi)*sin(lambda)+sin(phi))),
u = arcsin(sqrt(1+cos(a)*cos(b)-sin(a)*sin(b))),
v = arcsin(sqrt(1-cos(a)*cos(b)-sin(a)*sin(b))),
x = 'signum'(lambda)*'GuyouElliptic'(u),
y = 'signum'(phi)*'GuyouElliptic'(v)';
>
mapcoords(Guyou,
input = [lambda,phi],
coords = [`Guyou/equations`, [x,y]],
params = [r],
view = [-180..180,-90..90,13,7,-90..90,-180..180]):
We will not use coordplot to isplay the coordinate system; rather, we shall make a grid:
> tt1 := graticule([seq(ii*10, ii = -18..18)],[-90,-60,-40,-20,-5,5,20,40,60,90]):
and convert it to the Guyou coordinate system.
> pp3 := display(`Maps/changecoords`(tt1,Guyou)): pp3;
Now we can test these new coordinates on the whole world.
> changecoords(world[50],Guyou);
In this projection the eastern and western hemispheres overlap. If we redefine the coordinate system as follows:
>
mapcoords(`Guyou western`,
input = [Lambda,phi],
coords = [temp = '`if`(Lambda>0, RETURN([FAIL,FAIL]), 0)',
lambda = 'readlib(`Maps/shiftf`)'(Lambda-evalf(Pi/2),evalf(Pi/2)),
`Guyou/equations`,[x,y]],
params = [r],
view = [-180..180,-90..90,13,7,-90..90,-180..180]):
we may obtain a view of the western hemisphere:
> westhemi:=changecoords(world[50],`Guyou western`):
> westhemi:=removelines(westhemi): westhemi;
We proceed in a similar way for the eastern hemisphere.
>
mapcoords(`Guyou eastern`,
input = [Lambda,phi],
coords = [temp = '`if`(Lambda<0, RETURN([FAIL,FAIL]), 0)',
lambda = 'readlib(`Maps/shiftf`)'(Lambda-evalf(Pi/2),evalf(Pi/2)),
`Guyou/equations`,[x,y]],
a params = [r],
view = [-180..180,-90..90,13,7,-90..90,-180..180]):
Simply repeating the above projection for the southern hemisphere will give an image analogous to that shown above centered on the south pole.
>
easthemi:=changecoords(world[50],`Guyou eastern`):
easthemi;
We can place the eastern and western hemispheres next to one another to obtain a map of the world. However, parts of Europe and Africa appear in the western hemisphere and the result is not as attractive as it might be.
A more elegant picture can be obtained by making the central merdian west of the tip of West Africa. We redefine the simple equirectangular projection to allow us to redraw that projection for an arbitrary central meridian.
>
mapcoords(Equirectangular,
input = [Lambda,phi],
coords = [lambda = 'readlib(`Maps/shiftf`)'(Lambda-shift,180),[lambda,phi]],
params = [r,shift],
view = [-180..180,-80..85,13,7,-180..180,-80..85]);
We remake the world map using 20 degrees west as the central meridian.
> sworld:=removelines(changecoords(world[ng,50],Equirectangular(1,-20))):
>
sworld2:=plots[display]({sworld,worldgrid}):
sworld2;
Using the ungridded world map, we recreate the western and eastern hemispheres. We also use the coordinate systems plotted above. The eastern hemisphere (and a copy of the cooridinate system) must be moved so that it does not overlap the western. The result of the last command below yields the complete Guyou projection shown above.
> westhemi:=changecoords(sworld,`Guyou western`):
> easthemi:=changecoords(sworld,`Guyou eastern`):
> east2 := plottools[translate](easthemi,2*106.2295080,0):
> pp3a := plottools[translate](pp3,2*106.2295080,0):
> plots[display]({east2,westhemi,pp3,pp3a});
As with the Pierce quincuncial, the Guyou projection can be mosaiced indeifinitely. This is left as an exercise.