Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
84 changes: 84 additions & 0 deletions docs/plot/plotdefs.json
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,54 @@
"res": "low",
"type": "poly"
},
{
"filename": "dsea.png",
"latmax": 90,
"latmin": -90,
"lonmax": 180,
"lonmin": -180,
"name": "dsea",
"projstring": "+proj=dsea",
"res": "low",
"type": "line",
"delta_cut": 1e6
},
{
"filename": "dsea_a5.png",
"latmax": 90,
"latmin": -90,
"lonmax": 180,
"lonmin": -180,
"name": "dsea_a5",
"projstring": "+proj=dsea +net=a5",
"res": "low",
"type": "line",
"delta_cut": 1e6
},
{
"filename": "dsea_crescent.png",
"latmax": 90,
"latmin": -90,
"lonmax": 180,
"lonmin": -180,
"name": "dsea_crescent",
"projstring": "+proj=dsea +net=crescent",
"res": "low",
"type": "line",
"delta_cut": 1e6
},
{
"filename": "dsea_flower.png",
"latmax": 90,
"latmin": -90,
"lonmax": 180,
"lonmin": -180,
"name": "dsea_flower",
"projstring": "+proj=dsea +net=flower",
"res": "low",
"type": "line",
"delta_cut": 1e6
},
{
"filename": "airocean.png",
"latmax": 90,
Expand Down Expand Up @@ -647,6 +695,18 @@
"type": "line",
"delta_cut": 1e6
},
{
"filename": "isea_pole.png",
"latmax": 90,
"latmin": -90,
"lonmax": 180,
"lonmin": -180,
"name": "isea_pole",
"projstring": "+proj=isea +orient=pole",
"res": "low",
"type": "line",
"delta_cut": 1e6
},
{
"filename": "kav5.png",
"latmax": 90,
Expand Down Expand Up @@ -1504,6 +1564,30 @@
"res": "low",
"type": "poly"
},
{
"filename": "tsea.png",
"latmax": 90,
"latmin": -90,
"lonmax": 180,
"lonmin": -180,
"name": "tsea",
"projstring": "+proj=tsea",
"res": "low",
"type": "line",
"delta_cut": 1e6
},
{
"filename": "tsea_star.png",
"latmax": 90,
"latmin": -90,
"lonmax": 180,
"lonmin": -180,
"name": "tsea_star",
"projstring": "+proj=tsea +net=star",
"res": "low",
"type": "line",
"delta_cut": 1e6
},
{
"filename": "ups.png",
"latmax": 90,
Expand Down
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
clockwise. 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.
77 changes: 77 additions & 0 deletions docs/source/operations/projections/all_images.rst
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,50 @@ List of all projection images
********************************************************************************


:ref:`dsea`

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


********************************************************************************


:ref:`dsea`

.. figure:: ./images/dsea_a5.png
:width: 500 px
:align: center
:alt: dsea


********************************************************************************


:ref:`dsea`

.. figure:: ./images/dsea_crescent.png
:width: 500 px
:align: center
:alt: dsea


********************************************************************************


:ref:`dsea`

.. figure:: ./images/dsea_flower.png
:width: 500 px
:align: center
:alt: dsea


********************************************************************************


:ref:`eck1`

.. figure:: ./images/eck1.png
Expand Down Expand Up @@ -655,6 +699,17 @@ List of all projection images
********************************************************************************


:ref:`isea`

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


********************************************************************************


:ref:`kav5`

.. figure:: ./images/kav5.png
Expand Down Expand Up @@ -1480,6 +1535,28 @@ List of all projection images
********************************************************************************


:ref:`tsea`

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


********************************************************************************


:ref:`tsea`

.. figure:: ./images/tsea_star.png
:width: 500 px
:align: center
:alt: tsea


********************************************************************************


:ref:`ups`

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

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

Comment thread
felixpalmer marked this conversation as resolved.
.. versionadded:: 9.9

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.png
:width: 500 px
:align: center
:alt: Dodecahedral Snyder Equal Area

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


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

The default net (shown above) follows Snyder's Figure 11. Three alternative
nets are available via ``+net=``:

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

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

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

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

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

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

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

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

.. figure:: ./images/dsea_flower.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
5 changes: 5 additions & 0 deletions docs/source/operations/projections/generate_all_images.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
"peirce_q_square" : "peirce_q",
"peirce_q_diamond" : "peirce_q",
"peirce_q_horizontal" : "peirce_q",
"dsea_a5" : "dsea",
"dsea_crescent" : "dsea",
"dsea_flower" : "dsea",
"isea_pole" : "isea",
"tsea_star" : "tsea",
}

with open(all_images_path, 'w') as all_images:
Expand Down
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.
Binary file modified docs/source/operations/projections/images/isea.png
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