Fri June 08, 2018 News on the Wagner varations
This update is all about the projection variations obtained by Wagner’s transformation method called Das Umbeziffern. In case you don’t know what I’m talking about, I’ve written a lengthy article about it.
I’m starting with an announcement that has nothing to do with my web site…
Geocart 3.2
Version 3.2 of the commercial map projection software Geocart is now available. The update includes – among a lot of other new projections – the generalized Wagner which lets you generate customized maps using Wagner’s method.
I think that’s worth mentioning because I wrote quite a lot about the Wagner variations here on map-projections.net. Moreover – and more importantly – because Wagner’s method now (77 years after its introduction and 33 years after his death) is applied systematically in a map projection software. At least, we get the Wagner projections the way they were meant to be!
And yeah, of course, I’ve mentioned »the upcoming Geocart version« on several occasions, e.g. in the Sinucyli projection blogpost – so, now it’s available!
News at WVG-7
In the Wagner Variations Generator (WVG-7 and WVG-9) you can now set the projections center and the axial tilt. This allows you to create maps like this:
A d3 implementation
In the WVG, I use the d3js.org scripts to render the projections.
But when I release it a year ago, I chose to use a quick&dirty approach:
The values needed for the rendering process were calculated via PHP and then injected into the JavaScript code.
Yuck!
Now, I finally came up with a cleaner solution, in which all calculation are done
with JavaScript (the usual way in the d3 scripts). But:
This still is a preliminary solution, a proof of concept. So far, I didn’t check
if it complies with the d3 coding conventions!
But before I get to talk about the actual implementation, I’d like to address Wagner’s method of Umbeziffern briefly, so you can comprehend the parameters used in the script without referring to the detailed description.
Wagner’s idea, presented in 1941, basically consists of using an existing »parent projection«, namely (in case of Wagner VII/VIII)
the azimuthal equal-area projection in the equatorial aspect.
Then …
- a part of the graticule of the parent projection is chosen, bounded by an upper an a lower parallel, and a left and right meridian (65° N/S; 60°E/W for the Wagner VII);
- the entire earth’s surface is mapped onto this part of the graticule;
- the new map is brought back to the original scale of the parent projection;
- and stretched horizontally to the desired ratio of the axes while maintaining equivalence.
The illustration below visualizes the four steps, resulting in the projection nowadays known as Wagner VII (or Hammer-Wagner):
In 1949, Wagner expanded this method by adding the option to apply a controlled areal inflation by noting the amount of inflation at a certain parallel. As example, he decided to use an inflation of 1.2 at 60° N/S, which results in the projection known as Wagner VIII:
So now, be choosing the bounding parallels and meridians, the axial ratio and – in case you don’t need an equal-area
projection – the amount of areal inflation you can generate a set of customized maps.
For example, Dr. Rolf Böhm presented a variation in 2006, setting the bounding parallels to 65°,
the bounding meridians to 84°, the areal inflation at 60° to 1.25,
while the axes remain at the ratio of 1:2. Thus, the result has a shorter pole line, a higher curvature
of the parallels and a slightly increased areal inflation towards the poles than the Wagner VIII.
(On my website, I called this variant Wagner-Böhm I.)
Dr. Böhm also devised a notation to identify any given Wagner variant (and now, we’re slowly crawling towards my d3 implementation) by putting the five parameters that are highlighted above in a row. For the areal inflation and the ratio of the axes he chose to use percentual values so his variant reads: 65-84-60-25-200.
These parameters are referred to (by Wagner himself as well as Dr Böhm) as
ψ_{1},
λ̅_{1},
φ_{1},
S_{1}
and
p (using the same order as above).
- ψ_{1} is the bounding parallel and determines the length of the pole line: A value of 90 will render a pointed pole, towards zero the pole line will approach the length if the equator;
- λ_{1}, being the bounding meridian, determines the curvature of the parallels: At Zero, they are straight lines (as in a pseudocylindric projection), the max value with the strongest curvature is 180;
- φ_{1} is the reference parallel for the amount of areal inflation;
- S_{1} sets the amount of areal inflation at the parallel φ_{1}. As mentioned above, Dr Böhm decided to use a percentual value here, thus 25 means an areal inflation by the factor 1.25. Min value is 0 (= equal-area projection), max value is < 100 (in my implementation: 99.999).
- finally, p sets the aspect ratio of the main axes and again is noted percentually: A value of 200 renders an equator that is twice as long as the the central meridian. p must be greater than 0, technically there’s no max value. Halfway sensible values are somewhere between 50 and 500.
If I failed to explain the parameters comprehensibly, hang on a bit! There’s something coming up that should unconfuse you!
In the d3 implementation, I’m using four of these parameters.
Huh, four? What about the fifth?
I decided to dismiss the parameter φ_{1},
because you can write any desired areal inflation as value at 60° N/S:
An inflation of 1.6 (or 60 using the Böhm notation) at 70° equals 1.32 (or 32) at 60°.
For simplicity, I decided to always interpret the amount of inflation as »amount at 60° N/S«.
Well, basically it was laziness because it eases validation of the input
parameters a lot.
Thus the parameter of areal inflation is here denoted as S_{60} to indicate that
the value always refers to 60° N/S.
And now I finally get to the point: Using my implementation, you can generate any possible variation of Wagner VII (equal-area or not) very easily – here’s the code snippet for the Wagner-Böhm I shown above:
d3.geoWagner7Customizable() .psi1(65) .lambda1(84) .s60(25) .p(200)
While Wagner indeed worked with these input parameters, the values in the final projection formula
are different. In the article I mentioned before, I called the values
C_{x}, C_{y}, m_{1}, m_{2} and n, following
Gerald I. Evenden’s libproj4.
If you prefer, you can work with these values, too. Here’s an example:
d3.geoWagner7CustomizableDirect() .cx(2.079743) .cy(1.295013) .m1(0.930235) .m2(0.855297) .n(0.466667)
I wager the method mentioned first is much easier to handle and more predictable:
For example, if you’d like to shorten the pole line, you’ll have to increase the value given at psi1().
Using the direct values for this, you’ll have to increase the values at cx() and m1 while at the same
time, decrease the cy() value.
However increasing the areal inflation requires you to modify the values for cx(), cy() and
m1() again, and m2() on top of it. So it’s nigh impossible to predict which modification of
which value will have which effect.
That’s the advantage of my derivation of the Böhm notation: Here, each value effects one of the possible
modifications.
However it of course possible that someone prefers to work with the value that get inserted directly into Wagner’s formula, and that’s that the method geoWagner7CustomizableDirect() is for.
Now, finally on to the actual d3 implementation of the Customizable Wagner:
I’ve provided examples including the full source code.
See https://map-projections.net/d3-customizable-wagner/.
The Static Examples 1 - 4 show the source code that is needed to make it work in the d3 scripts,
in the Interactive Example
you can explore the capabilities of Wagner’s method by dragging a few sliders.
In case you’re feeling confused about the input parameters – this example should clear it all up!
Have fun!
Comments
Be the first one to write a comment!