What’s this all about?
Karlheinz Wagner’s method of map projection transformation – called das Umbeziffern – consists of
selecting a part of an existing projection and mapping the entire surface of the earth onto this part.
The resulting new projection is determined by four configuration parameters.
You can find a detailed description of this process in the article
Umbeziffern – The Wagner Transformation Method.
On this page you can experiment with this mechanism by modifying
the parameters. Change the values within the allowed range and hit the Render my projection button.
The four configuration parameters
This example is using the equatorial aspect of the azimuthal equidistant projection as parent projection,
as the wellknown Wagner IX does. Modify using the following parameters:

ψ_{1}
– the bounding parallel of the parent projection.
Min. value: 1 / max. value: 90
In effect, lower values increase, higher values decrease the pole line length.
At 90°, the poles become points. At 1°, the pole line is (almost) as long as the equator.

λ_{1}
– the bounding longitude of the parent projection.
min.: 1 / max.: 180
Lower values generate a less pronounced, higher values generate a more pronounced curvature
of the parallels.
At 1°, the parallels become (almost) straight lines.
Note: A value of 180° will generate a faulty image.
In that case, try a value < 180, even 179.99° will do.

p
– axial ratio.
min.: 1 / max.: 9999
Reasonable values range (depending on parameters 1 to 4) roughly between 150 and 250.
Noted in percent: The ratio of central meridian to equator. At 200, the equator is twice as long
as the central meridian.
Lower values increase the height of the projection, higher values increase the width.

a
– Width of xaxis
Min.: 20 / Max.: 100
Reasonable values are probably higher than 50.
Noted in percent: The lower the number, the narrower the projection.
Predefined Configurations
Instead of building your own projection, you can select an existing projection that can be generated using
the Wagner IX formula. The corresponding configuration parameters will be filled into the form.
This might contribute to a better understanding pf the parameters and is a great start for your own experiments.
See below for a detailed description of the various implementations of
Canters’ optimization of Wagner IX.
Image Options
These option don’t modify the projection in itself but only the image that is generated.

Continents: The land masses can be shown as grey silhouette, as outlines only,
with a colored display of the countries – or not at all.

Graticule: Meridians and Parallels can be shown at a spacing of
5, 10, 15, 18, 20, 30 or 45 degree – or not at all.

Map scale factor: This has nothing to do with the nominal scale that you’ll often find
on printed maps. It’s just an internal factor of the script that renders the projection. The default value of 150 was chosen because with this value, all predefined projections fit into the given boundary.
Higher values increase, lower valued decrease the size of the projection.
Min.: 30 / max.: 300

Background projection: You can compare the rendered projection to one of 170 others projections.
It’s a listing of all the cylindric, pseudocylindric and lenticular projections that are offered by mapprojections.net.
The background projection can’t be scaled. To match rendered and background projection in size, you just have to play around
with the map scale factor until you succeed. Sorry.

Tissot Indicatrix: Visualizes the distortions of the current configuration.
The implementation that is used here might not be absolutely accurate, but it’s close enough for a
reasonable evaluation.
Read more about Tissot’s indicatrix here.
About the various Canters renderings
In 2002, Frank Canters introduced an optimization auf Wagner IX.^{[3]}
However, here are three different renderings of that optimization: At the button Approx. Canters (i),
at Approx. Canters (v) and at Canters original values.
What is that supposed to mean?
The form above takes parameters according to Böhm’s notation (limiting meridian/parallel etc.) and translates them to
numeric constants which can be inserted into Wagner’s formula.
Canters, however, used a different approach by directly modifying the said constants. Thus, I had no idea
which parameters the form would need to shoot out an accurate rendering of Canters optimization.
So I started fiddling with the input parameters – increasing this one, decreasing that one – and hoped that at some
point, I’ll end up with the right values for
m_{1}, n, k_{1}, k_{2} and p.
I failed.
Then I scanned the illustration provided in Canters text book and used it as background image for the renderings.
Thus, I had a template that I could approach and after a few attempts, I came up with input parameters which rendered
an image that matched the template as far as I could see. That’s the version called Approx. Canters (i)
(with i for illustration) here.
Alas, while it even has the correct values for m_{1}, n and p,
k_{1} and k_{2} differ.
Then I had the idea that I should skip the translation of input parameters after Böhm’s scheme.
Instead, I would feed the formula that renders the image directly with Canters values.
(That’s the direct injection of Canters original values.)
That worked – but I was quite surprised to see that this variant would not match the scanned template from the book.
The deviations are minor, but visible.
I’ll come back to that later.
Again, I played with the input parameters, but this time I tried to approximate the rendering from
Canters original values instead of the illustration from the book. And again, the result matches
wellnigh perfectly the template:
Approx. Canters (v), with v for values.
This time, the values for m_{1}, n and k_{1} correspond to Canters
data while k_{2} and p differ.
Let’s sum that up briefly:
– Approx. Canters (i) translates the input parameters to approximate
the illustration in Canters text book;
– Approx. Canters (v) translates the input parameters to approximate
the following version:
– Canters original values bypass the input values and render the image directly.
That’s why the according button looks different – and if you click the button, the input parameters will
be set to zero.
Phew, that was discombobulating, wasn’t it?
But one question remains: Why is the image that was rendered from the original values
not equivalent to the illustration in the text book?
Well, I honestly don’t know. There is of course the possibility the I was doing something wrong
when I wrote the function that renders the image. On the other hand, it works fine for
Wagner IX and IX.i … So maybe the illustration isn’t accurate onehundred per cent?
I don’t know how the illustrations in Canters’ book were generated. Moreover, if you think about it,
such an illustration doesn’t even have to be absolutely accurate. It’s there to give the reader
an idea of how the projection will look. If he actually wants to work with this projection,
he’ll refer to the formula. And – well, the illustration for Winkel II (Fig 2.7, page 59) is
definitely not accurate: There are kinks in the meridians near the poles.
Which might imply that other illustrations have similar minor deviations – simply because it
doesn’t matter.
Download
You can download the generated projection to view or edit it in other applications.
The full projection will be saved to your hard disk, even if here on this page it isn’t shown fully because it
exceeds the bounding frame.
The projection will be saved as SVG file. SVG means Scalable Vector Graphics, and guess what, it is exactly that. ;)
Which makes is a good choice for line drawings like they are used here.
There are numerous applications to open and edit SVG files, many of them are free, e.g.
Inkscape,
LibreOffice Draw,
OpenOffice Draw,
and GIMP (all of them are available for Windows, macOS and Linux).
Commercial software (for Windows and macOS) include
PhotoLine,
Affinity Designer
and Adobe Illustrator.
The background projection you may have selected will not be part of the SVG file.
But you can download it separately (as PNG file) using the link Download background projection which in this case
will be visible beneath the projection image.
Values of the current configuration
For the current configuration, the following values are displayed:

Böhm’s notation:
The representation of a Wagner variant as suggested by Dr. Böhm in his german article
Variationen von Weltkartennetzen
^{[2]}.
Böhm created this notation for variations of Wagner VII/VIII (s. WVG7),
I adapted it for Wagner IX.
The extended variant is my own suggestion, it only adds a prefix that indicates
which Wagner projection was modified.

Canters’ Notation:
Parameter values as listed by Frank Canters in
Smallscale Map Projection Design^{[3]:185}
(Table 5.2).

In Wagner’s Formula:
Constants to insert into Wagner’s formula for Wagner VII/VIII, from
Kartographische Netzentwürfe
^{[1]},
see Umbeziffern: Notation.

Values for the d3.geo.projection.jssource code snippet below.

Areal Inflation:
A list of values of the areal inflation at latitudes in steps of 10 degrees (plus 85°
to show the enormous increase near the poles). Displayed as factor (e.g. 1.500)
and in percent (20).
Of course, this list is dismissed when you’ve rendered an equivalent projection.
Terms of Use
SVG files:
All generated SVG images that are generated on this
page are in the public domain. You may use the images in
any manner, including modifying the content and design,
electronic dissemination, and offset printing. The
author of this site, Tobias Jung, renounces all financial claim to the
data and invites you to use it for personal, educational,
and commercial purposes.
No permission is needed to use the SVG files.
Crediting the author is unnecessary. However, if you wish
to cite the data source, simply use: Tobias Jung,
mapprojections.net.
Background projection images:
The background projection images are licensed under
CC BYSA 4.0.
For more information please refer to the link Download background projection which is
visible beneath the projection image in case you have selected a background projection.
The author provides this page as a free piece of service
and is not responsible for any problems relating to
accuracy, content, design, and how it is used.
Please also pay regard to the imprint of this website.
Credits
This page utilizes a few scripts mentioned below. I’d like to thank the authors for their great work!
References

↑
Wagner, Karlheinz:
Kartographische Netzentwürfe.
Leipzig 1949.

↑
Dr. Rolf Böhm:
Variationen von Weltkartennetzen der WagnerHammerAitoffEntwurfsfamilie
First publication in: Kartographische Nachrichten Nr. 1/2006. Kirschbaum: BonnBad Godesberg.
Quoted from www.boehmwanderkarten.de/archiv/pdf/boehm_kn_2_2006_2015_complete.pdf
(german)

↑ ^{a b
c}
Canters, Frank:
Smallscale Map Projection Design.
London & New York 2002.

↑
libproj4, cartographic projection library, release 050319.
Source code snippet for d3.geo.projection.js
This is the source code you’ll have to add to d3geoprojection.js.
The variables
CM, CN, CX, CY
are set to generate the currently selected projection.
The function was written for v1.2.1 of d3geoprojection.js, it might not be operative in older versions.
Remarks:
a) This is a provisional version of the source code. Currently, I’m trying to get the inverse function done,
which might lead to certain adjustments in the forward formula shown here.
b) A clean solution would be to pass the variables
to the function instead of hardcoding them. However, since this variant works fine for me, I won’t write
that clean solution.
function wagner9GenRaw(lambda, phi) {
var CM = 0.777777777778,
CN = 0.277777777778,
CX = 3.6,
CY = 1.28571428571;
var cosdel = cos(phi *= CM) * cos(CN * lambda);
var y = acos(cosdel);
if ( y == 0) {
return [ 0,0 ];
} else {
var cosalph = sin(phi) / sqrt(abs(1  cosdel * cosdel));
var x = CX * y * sqrt(abs(1  cosalph * cosalph));
if (lambda < 0) {
x = x;
}
y *= CY * cosalph;
return [ x , y ];
}
}
var wagnerGen9 = function() {
return d3Geo.geoProjection(wagner9GenRaw)
.scale(150);
};
// (...)
// don't forget the additional lines at the end of the file:
exports.geoWagnerGen9 = wagnerGen9;
exports.geoWagnerGen9Raw = wagner9GenRaw;
Since this is a JavaScript translation of the C source code by Gerald I. Evenden,
the original license applies (although a single function probably isn’t a substantial portion):
libproj  library of cartographic projections
Copyright (c) 2003 Gerald I. Evenden
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Go to top