Deutsch  •  English
Deutsch  •  English

Wagner Variations Generator    – custom map projections, based on Wagner IX

Short info: see below  –  More Info: Wagner – Das Umbeziffern  –  WVG, based on Wagner VII


See below for a detailed description of the parameters

Please leave the following four input field blank in any case!

Predefined Configurations
Image Options

Wagner IX

Presented by Karlheinz Wagner in 1949 using the name Der Aitoffsche Entwurf mit Pollinie (Aitoffsche projection with a pole line).
A.k.a Aitoffsche-Wagner.
Equally spaced parallels at the central meridian.

Share this configuration

Share projection parameters only
Share parameters & image options

Values of the current configuration

Böhm’s Notation (adapted)


Canters’ Notation

m1 = 0.7778
n  = 0.2778
k1 = 1.6733
k2 = 1.6733
p  = 0.5

In Wagner’s Formula

m1 = 0.777778
n  = 0.277778
Cx = 3.6
Cy = 1.285714

These values refer to the transcription of Wagner’s formula in libproj4 by Gerald I. Evenden, v1.2, 2005.[4] Wagner himself wrote m1 as 7/9 und n as 5/18.

Variables for d3.js

var CM = 0.777777777778,
CN = 0.277777777778,
CX = 3.6,
CY = 1.28571428571;

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 well-known Wagner IX does. Modify using the following parameters:

  1. ψ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.
  2. λ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.
  3. 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.
  4. a
    – Width of x-axis
    Min.: 20 / Max.: 100
    Reasonable values are probably higher than 50.
    Noted in percent: The lower the number, the narrower the projection.
– Of course one of the parameters #3 and #4 is redundant: Instead auf setting p to 200 and a to 88, you might as well leave a at 1 and set p to 155. But Wagner constructed the projection variant that is called IX.i here just like that, i.e. calculating the formula with p = 200 and subsequently, compressing the x-axis by a = 0,88 (which is, here in the WVG, noted as 88%). Without explicitly mentioning it, Canters[2]:129, too, operates with both parameters when he summarizes Wagner’s formulae. Therefore, I kept both parameters although I’m aware that it seems quite illogical.
The good news is that illogical things won’t break your computer, although SciFi flicks of the 1960ies might imply otherwise.
– There is a form validation which prevents sending values that don’t meet the min/max values noted above. However, you can try to enter values like e.g. 0.01 for ψ1. In that case, hit the »Ignore validation & render« button but be aware that a faulty image might be rendered, or no image at all.
– Depending on your browser and the regional settings of your system, the decimal marker can be a dot, a comma, or either of them. If you run into problem using a dot, try a comma (and vice versa).

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.

  1. Continents: The land masses can be shown as grey silhouette, as outlines only, with a colored display of the countries – or not at all.
  2. Graticule: Meridians and Parallels can be shown at a spacing of 5, 10, 15, 18, 20, 30 or 45 degree – or not at all.
  3. 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
  4. Background projection: You can compare the rendered projection to one of 159 others projections. It’s a listing of all the cylindric, pseudocylindric and lenticular projections that are offered by
    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.
  5. 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 m1, n, k1, k2 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 m1, n and p, k1 and k2 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 well-nigh perfectly the template: Approx. Canters (v), with v for values.
This time, the values for m1, n and k1 correspond to Canters data while k2 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 one-hundred 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.



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:

  1. 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. WVG-7), 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.
  2. Canters’ Notation: Parameter values as listed by Frank Canters in Small-scale Map Projection Design[3]:185 (Table 5.2).
  3. In Wagner’s Formula: Constants to insert into Wagner’s formula for Wagner VII/VIII, from Kartographische Netzentwürfe [1], see Umbeziffern: Notation.
  4. Values for the d3.geo.projection.jssource code snippet below.
  5. 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,
Background projection images:
The background projection images are licensed under CC BY-SA 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.


This page utilizes a few scripts mentioned below. I’d like to thank the authors for their great work!


  1. Wagner, Karlheinz:
    Kartographische Netzentwürfe.
    Leipzig 1949.
  2. Dr. Rolf Böhm:
    Variationen von Weltkartennetzen der Wagner-Hammer-Aitoff-Entwurfsfamilie
    First publication in: Kartographische Nachrichten Nr. 1/2006. Kirschbaum: Bonn-Bad Godesberg.
    Quoted from (german)
  3. a b c Canters, Frank:
    Small-scale Map Projection Design.
    London & New York 2002.
  4. 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 d3-geo-projection.js. The variables CM, CN, CX, CY are set to generate the currently selected projection.
The function was written for v1.2.1 of d3-geo-projection.js, it might not be operative in older versions.

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)
// (...)
// 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.


Go to top

This website uses cookies to improve your experience.   More info