Skip to content
Open
Show file tree
Hide file tree
Changes from 46 commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
4c7a57f
Feature: Snyder Polyhedral Equal Area projections
felixpalmer Apr 17, 2026
f382bfd
Documentation
felixpalmer Apr 17, 2026
402608b
Remove authalic.h, replacing with pj_authalic_xxx
felixpalmer Apr 21, 2026
f461d3e
Don't redefine PI
felixpalmer May 4, 2026
85a00f5
Remove render scripts
felixpalmer May 4, 2026
26d7234
Linting
felixpalmer May 4, 2026
7d09495
spelling
felixpalmer May 4, 2026
1d851a5
clang-format
felixpalmer May 4, 2026
7d9658e
try with meta operator
felixpalmer May 4, 2026
b2b8885
reduce planar triangles storage via meta
felixpalmer May 4, 2026
58a3a1b
tidy
felixpalmer May 4, 2026
e7671e6
consistency
felixpalmer May 4, 2026
0199fd3
Tidy net
felixpalmer May 4, 2026
714e125
Tidy
felixpalmer May 4, 2026
ecb8f24
Run linter
felixpalmer May 4, 2026
19165c1
Tidy up conway code
felixpalmer May 4, 2026
b6a1fff
Tidy
felixpalmer May 4, 2026
05ebb58
format
felixpalmer May 4, 2026
73997b8
Add proj options. Implement DSEA, ISEA & net unfolding
felixpalmer May 7, 2026
4dcb330
Code review
felixpalmer May 7, 2026
ad34fb7
Tidy
felixpalmer May 8, 2026
61ee123
ISEA back-compatibilty
felixpalmer May 8, 2026
69dadc8
Tidy
felixpalmer May 8, 2026
7cc1cee
orient option for ISEA
felixpalmer May 8, 2026
0309c49
Authalic conversion of orient_lat
felixpalmer May 8, 2026
4a2942e
General rigid_transform
felixpalmer May 10, 2026
66f5a7d
General rigid transform
felixpalmer May 10, 2026
cf2ecdf
face_centroid
felixpalmer May 10, 2026
75081d9
Tidy vec names
felixpalmer May 10, 2026
0f26588
Improve nets
felixpalmer May 10, 2026
f0ddf00
Improve nets
felixpalmer May 10, 2026
5073f55
Rotate nets
felixpalmer May 10, 2026
76dcbe8
Rearrange dodecahedron faces
felixpalmer May 10, 2026
2c18a51
Rearrange tetrahedron
felixpalmer May 10, 2026
98128f2
Snyder compatible tetrahedron
felixpalmer May 10, 2026
08d5e37
test update
felixpalmer May 10, 2026
6fe2b0e
Automatically reorient z axis
felixpalmer May 10, 2026
41ee13b
Switch to 1-indexing
felixpalmer May 11, 2026
15eacb0
Recenter tsea
felixpalmer May 11, 2026
06f22e3
Update comments for 1-indexing
felixpalmer May 12, 2026
28400ce
Utility for dumping nets
felixpalmer May 12, 2026
c452348
Review polyhedral.rst
felixpalmer May 12, 2026
7d66076
options
felixpalmer May 12, 2026
67e20ea
rename old isea to isea_legacy
felixpalmer May 12, 2026
00af60c
Doc pages for all projections
felixpalmer May 12, 2026
6e3234c
Figure numbers
felixpalmer May 13, 2026
5d9c9f2
clockwise
felixpalmer May 13, 2026
b770575
Fix CI failures: subproject include, RST nesting, spelling
felixpalmer May 13, 2026
6d86c2d
Remove legacy isea
felixpalmer May 14, 2026
48610ce
Update docs/source/operations/projections/polyhedral.rst
felixpalmer May 14, 2026
934037d
Update docs/source/operations/projections/dsea.rst
felixpalmer May 14, 2026
7ceb0a1
Update docs/source/operations/projections/tsea.rst
felixpalmer May 14, 2026
53041f5
Braces
felixpalmer May 14, 2026
074aa14
Regenerate figures using plotdefs & update docs
felixpalmer May 14, 2026
bfb82bb
Remove print_polyhedral_layout
felixpalmer May 14, 2026
c5141d2
Remove extra brace
felixpalmer May 14, 2026
54faf21
Add sanity check for net unfolding
felixpalmer May 14, 2026
f5d7da8
Move polyhedral
felixpalmer May 14, 2026
ef23b7b
Update generate_all_images.py
felixpalmer May 14, 2026
faa4bcd
Wordlist
felixpalmer May 14, 2026
bea50ba
Move shared vec3 & sphere code to src
felixpalmer May 15, 2026
a1541df
Use safer aatan2
felixpalmer May 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/source/operations/options/azi.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.. option:: +azi=<value>

Azimuth from the polyhedron's first vertex to its second, in degrees.
Comment thread
felixpalmer marked this conversation as resolved.
Outdated
Together with ``+orient_lat`` and ``+orient_lon`` this fully constrains
the 3D pose of the polyhedron on the sphere.
18 changes: 18 additions & 0 deletions docs/source/operations/options/lat_0_polyhedral.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.. option:: +lat_0=<value>

Geodetic latitude of the geographic point that should land at the
projected origin ``(0, 0)``. Used together with ``+lon_0``; the pair
translates the projected output without rotating the polyhedron.
``+x_0`` / ``+y_0`` are applied on top of this translation.

When unset, the projected origin falls on the unfold's root face
instead (its centroid in general, or its bounding-box centre for
``+proj=isea``) rather than at a fixed lat / lon.

.. note::
The default convention is to interpret this value as decimal degrees. To
specify radians instead, follow the value with the "r" character.

Example: `+lat_0=1.570796r`

See :ref:`Projection Units <projection_units>` for more information.
18 changes: 18 additions & 0 deletions docs/source/operations/options/lon_0_polyhedral.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.. option:: +lon_0=<value>

Geodetic longitude of the geographic point that should land at the
projected origin ``(0, 0)``. Used together with ``+lat_0``; the pair
translates the projected output without rotating the polyhedron.
``+x_0`` / ``+y_0`` are applied on top of this translation.

When unset, the projected origin falls on the unfold's root face
instead (its centroid in general, or its bounding-box centre for
``+proj=isea``) rather than at a fixed lat / lon.

.. note::
The default convention is to interpret this value as decimal degrees. To
specify radians instead, follow the value with the "r" character.

Example: `+lon_0=1.570796r`

See :ref:`Projection Units <projection_units>` for more information.
5 changes: 5 additions & 0 deletions docs/source/operations/options/orient_lat.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.. option:: +orient_lat=<value>

Geodetic latitude of the polyhedron's first vertex, in degrees. Together
with ``+orient_lon`` and ``+azi`` this fully constrains the 3D pose of
the polyhedron on the sphere.
5 changes: 5 additions & 0 deletions docs/source/operations/options/orient_lon.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.. option:: +orient_lon=<value>

Longitude of the polyhedron's first vertex, in degrees. Together with
``+orient_lat`` and ``+azi`` this fully constrains the 3D pose of the
polyhedron on the sphere.
4 changes: 2 additions & 2 deletions docs/source/operations/projections/all_images.rst
Original file line number Diff line number Diff line change
Expand Up @@ -644,12 +644,12 @@ List of all projection images
********************************************************************************


:ref:`isea`
:ref:`isea_legacy`

.. figure:: ./images/isea.png
:width: 500 px
:align: center
:alt: isea
:alt: isea_legacy


********************************************************************************
Expand Down
125 changes: 125 additions & 0 deletions docs/source/operations/projections/dsea.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
.. _dsea:

********************************************************************************
Dodecahedral Snyder Equal Area
********************************************************************************

Comment thread
felixpalmer marked this conversation as resolved.
Snyder's equal-area mapping :cite:`Snyder1992` applied to the twelve pentagonal
faces of a regular dodecahedron and unfolded into a planar net.

The dodecahedron is subdivided into 12 × 10 = 120 right sub-triangles,
and each sub-triangle is mapped independently using the area-preserving
Snyder construction.

See :ref:`polyhedral` for the shared theory.

+---------------------+----------------------------------------------------------+
| **Classification** | Polyhedral, equal area |
+---------------------+----------------------------------------------------------+
| **Available forms** | Forward and inverse, spherical and ellipsoidal |
+---------------------+----------------------------------------------------------+
| **Defined area** | Global |
+---------------------+----------------------------------------------------------+
| **Alias** | dsea |
+---------------------+----------------------------------------------------------+
| **Domain** | 2D |
+---------------------+----------------------------------------------------------+
| **Input type** | Geodetic coordinates |
+---------------------+----------------------------------------------------------+
| **Output type** | Projected coordinates |
+---------------------+----------------------------------------------------------+


.. figure:: ./images/dsea_net.png
:width: 500 px
:align: center
:alt: Dodecahedral Snyder Equal Area

proj-string: ``+proj=dsea``


Nets
################################################################################

dsea (default)
--------------------------------------------------------------------------------

Snyder's layout (Figure 11).

.. figure:: ./images/dsea_net.png
:width: 500 px
:align: center
:alt: DSEA default net

proj-string: ``+proj=dsea``

a5
--------------------------------------------------------------------------------

Layout used by the `A5 index <https://a5geo.org>`_. First 8 faces contain the
majority of the populated land mass.

.. figure:: ./images/dsea_a5_net.png
:width: 500 px
:align: center
:alt: DSEA A5 net

proj-string: ``+proj=dsea +net=a5``

crescent
--------------------------------------------------------------------------------

.. figure:: ./images/dsea_crescent_net.png
:width: 500 px
:align: center
:alt: DSEA crescent net

proj-string: ``+proj=dsea +net=crescent``

flower
--------------------------------------------------------------------------------

.. figure:: ./images/dsea_flower_net.png
:width: 500 px
:align: center
:alt: DSEA flower net

proj-string: ``+proj=dsea +net=flower``


Parameters
################################################################################

.. note::
All parameters are optional.

.. option:: +net=<name>

Selects the planar unfolding. Accepted values: ``dsea``, ``a5``,
``crescent``, ``flower``.

*Defaults to* ``dsea``.

.. include:: ../options/orient_lat.rst

*Defaults to* ``atan((1 + 2·cos(36°))/2) ≈ 52.6226°``.

.. include:: ../options/orient_lon.rst

*Defaults to −36.0 (or −129.0 when* ``+net=a5`` *).*

.. include:: ../options/azi.rst

*Defaults to 240.0.*

.. include:: ../options/lat_0_polyhedral.rst

.. include:: ../options/lon_0_polyhedral.rst

.. include:: ../options/x_0.rst

.. include:: ../options/y_0.rst

.. include:: ../options/ellps.rst

.. include:: ../options/R.rst
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions docs/source/operations/projections/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ Projections map the spherical 3D space to a flat 2D space.
comill
crast
denoy
dsea
eck1
eck2
eck3
Expand Down Expand Up @@ -71,6 +72,8 @@ Projections map the spherical 3D space to a flat 2D space.
imoll_o
imw_p
isea
isea_legacy
polyhedral
Comment thread
felixpalmer marked this conversation as resolved.
Outdated
kav5
kav7
krovak
Expand Down Expand Up @@ -147,6 +150,7 @@ Projections map the spherical 3D space to a flat 2D space.
tobmerc
tpeqd
tpers
tsea
ups
urm5
urmfps
Expand Down
88 changes: 52 additions & 36 deletions docs/source/operations/projections/isea.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,19 @@
Icosahedral Snyder Equal Area
********************************************************************************

Snyder's Icosahedral Equal Area map projection on an icosahedron polyhedral globe
offers relatively low scale and angular distortion. The equations involved are
relatively straight-forward. The interruptions remain a disadvantage, as with
any low-error projection system applied to the entire globe :cite:`Snyder1992`.
This projection is used as a basis for defining discrete global grid hierarchies.
Snyder's equal-area mapping :cite:`Snyder1992` applied to the twenty triangular
faces of a regular icosahedron and unfolded into a planar net.

The icosahedron is subdivided into 20 × 6 = 120 right sub-triangles, and each
sub-triangle is mapped independently using the area-preserving Snyder
construction.

See :ref:`polyhedral` for the shared theory.

+---------------------+----------------------------------------------------------+
| **Classification** | Polyhedral, equal area |
+---------------------+----------------------------------------------------------+
| **Available forms** | Forward and inverse, spherical |
| **Available forms** | Forward and inverse, spherical and ellipsoidal |
+---------------------+----------------------------------------------------------+
| **Defined area** | Global |
+---------------------+----------------------------------------------------------+
Expand All @@ -27,66 +30,79 @@ This projection is used as a basis for defining discrete global grid hierarchies
+---------------------+----------------------------------------------------------+


.. figure:: ./images/isea.png
.. figure:: ./images/isea_net.png
:width: 500 px
:align: center
:alt: Icosahedral Snyder Equal Area

proj-string: ``+proj=isea``

.. note::
As the projection is only defined on a sphere, it should only be used
with a spherical ellipsoid e.g., ``+R=6371007.18091875`` for a sphere with the
authalic radius of the WGS84 ellipsoid. For mapping coordinates on the WGS84
ellipsoid to the authalic sphere, the input latitude should be converted
from geodetic latitude to authalic latitude. A future version may
automatically perform this conversion when using a non-spherical ellipsoid.

Parameters
Nets
################################################################################

.. note:: All parameters are optional for the projection.
``isea`` ships a single net (Snyder's Figure 12). Two named orientations of
that net are available via ``+orient=``.

isea (default)
--------------------------------------------------------------------------------

.. option:: +orient=<string>
Snyder's layout (Figure 12).

Can be set to either ``isea`` or ``pole``. See Snyder's Figure 12 for pole orientation :cite:`Snyder1992`.
.. figure:: ./images/isea_net.png
:width: 500 px
:align: center
:alt: ISEA default orientation

proj-string: ``+proj=isea``

*Defaults to isea*
pole
--------------------------------------------------------------------------------

.. option:: +azi=<value>
One icosahedron vertex placed on the geographic north pole.

Azimuth.
.. figure:: ./images/isea_pole_net.png
:width: 500 px
:align: center
:alt: ISEA pole orientation

Not supported by the inverse.
proj-string: ``+proj=isea +orient=pole``

*Defaults to 0.0*

.. option:: +aperture=<value>
Parameters
################################################################################

Not supported by the inverse.
.. note::
All parameters are optional.

*Defaults to 3.0*
.. option:: +orient=<name>

.. option:: +resolution=<value>
Shorthand for two named orientations. Accepted values: ``isea``, ``pole``.
Equivalent to setting ``+orient_lat`` / ``+orient_lon`` / ``+azi``
explicitly; individual ``+orient_*`` parameters still override.

Not supported by the inverse.
*Defaults to* ``isea``.

*Defaults to 4.0*
.. include:: ../options/orient_lat.rst

.. option:: +mode=<string>
*Defaults to ~58.40° geodetic (arctan(φ) ≈ 58.2825° authalic).*

Can be either ``plane``, ``di``, ``dd`` or ``hex``.
.. include:: ../options/orient_lon.rst

Only ``plane`` supported by the inverse.
*Defaults to 11.25° on a sphere, 11.20° on an ellipsoid.*

*Defaults to plane*
.. include:: ../options/azi.rst

.. include:: ../options/lon_0.rst
*Defaults to 0.0.*

.. include:: ../options/lat_0.rst
.. include:: ../options/lat_0_polyhedral.rst

.. include:: ../options/R.rst
.. include:: ../options/lon_0_polyhedral.rst

.. include:: ../options/x_0.rst

.. include:: ../options/y_0.rst

.. include:: ../options/ellps.rst

.. include:: ../options/R.rst
Loading
Loading