aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/plot/plotdefs.json12
-rw-r--r--docs/source/operations/projections/bertin1953.rst64
-rw-r--r--docs/source/operations/projections/images/bertin1953.pngbin0 -> 177358 bytes
-rw-r--r--docs/source/operations/projections/index.rst1
-rw-r--r--src/Makefile.am2
-rw-r--r--src/PJ_bertin1953.c94
-rw-r--r--src/lib_proj.cmake1
-rw-r--r--src/pj_list.h1
-rw-r--r--test/gie/more_builtins.gie35
9 files changed, 209 insertions, 1 deletions
diff --git a/docs/plot/plotdefs.json b/docs/plot/plotdefs.json
index c494d6a7..9ce9ed88 100644
--- a/docs/plot/plotdefs.json
+++ b/docs/plot/plotdefs.json
@@ -88,6 +88,18 @@
"type": "poly"
},
{
+ "filename": "bertin1953.png",
+ "latmax": 90,
+ "latmin": -90,
+ "latmin": -60,
+ "lonmax": 180,
+ "lonmin": -180,
+ "name": "bertin1953",
+ "projstring": "+proj=bertin1953",
+ "res": "low",
+ "type": "poly"
+ },
+ {
"filename": "bipc.png",
"latmax": 90,
"latmin": -90,
diff --git a/docs/source/operations/projections/bertin1953.rst b/docs/source/operations/projections/bertin1953.rst
new file mode 100644
index 00000000..8be521f3
--- /dev/null
+++ b/docs/source/operations/projections/bertin1953.rst
@@ -0,0 +1,64 @@
+.. _bertin1953:
+
+********************************************************************************
+Bertin 1953
+********************************************************************************
+
+.. versionadded:: 6.0.0
+
++---------------------+-------------------------------+
+| **Classification** | Miscellaneous |
++---------------------+-------------------------------+
+| **Available forms** | Forward, spherical projection |
++---------------------+-------------------------------+
+| **Defined area** | Global |
++---------------------+-------------------------------+
+| **Alias** | bertin1953 |
++---------------------+-------------------------------+
+| **Domain** | 2D |
++---------------------+-------------------------------+
+| **Input type** | Geodetic coordinates |
++---------------------+-------------------------------+
+| **Output type** | Projected coordinates |
++---------------------+-------------------------------+
+
+
+
+.. figure:: ./images/bertin1953.png
+ :width: 500 px
+ :align: center
+ :alt: Bertin 1953
+
+ proj-string: ``+proj=bertin1953``
+
+
+The Bertin 1953 projection is intended for making world maps. Created by Jacques Bertin
+in 1953, this projection was the go-to choice of the French cartographic school when they
+wished to represent phenomena on a global scale. The projection was formulated in 2017
+by Philippe Rivière for visionscarto.net.
+
+
+Usage
+###############################################################################
+
+The Bertin 1953 projection has no special options. Its rotation parameters
+are fixed. Here is an example of a forward projection with scale 1:
+
+ $ echo 122 47 | src/proj +proj=bertin1953 +R=1
+ 0.72 0.73
+
+Parameters
+################################################################################
+
+.. note:: All parameters for the projection are optional.
+
+.. include:: ../options/R.rst
+
+.. include:: ../options/x_0.rst
+
+.. include:: ../options/y_0.rst
+
+Further reading
+################################################################################
+
+#. Philippe Rivière (2017). `Bertin Projection (1953) <https://visionscarto.net/bertin-projection-1953>`, Visionscarto.net.
diff --git a/docs/source/operations/projections/images/bertin1953.png b/docs/source/operations/projections/images/bertin1953.png
new file mode 100644
index 00000000..9b272033
--- /dev/null
+++ b/docs/source/operations/projections/images/bertin1953.png
Binary files differ
diff --git a/docs/source/operations/projections/index.rst b/docs/source/operations/projections/index.rst
index a48eabe6..c2d24449 100644
--- a/docs/source/operations/projections/index.rst
+++ b/docs/source/operations/projections/index.rst
@@ -20,6 +20,7 @@ Projections map the spherical 3D space to a flat 2D space.
apian
august
bacon
+ bertin1953
bipc
boggs
bonne
diff --git a/src/Makefile.am b/src/Makefile.am
index ae5e0a2e..eaf6bd38 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -55,7 +55,7 @@ libproj_la_SOURCES = \
PJ_mill.c PJ_ocea.c PJ_omerc.c PJ_somerc.c \
PJ_tcc.c PJ_tcea.c PJ_times.c PJ_tmerc.c \
PJ_airy.c PJ_aitoff.c PJ_august.c PJ_bacon.c \
- PJ_chamb.c PJ_hammer.c PJ_lagrng.c PJ_larr.c \
+ PJ_bertin1953.c PJ_chamb.c PJ_hammer.c PJ_lagrng.c PJ_larr.c \
PJ_lask.c PJ_latlong.c PJ_nocol.c PJ_ob_tran.c PJ_oea.c \
PJ_tpeqd.c PJ_vandg.c PJ_vandg2.c PJ_vandg4.c \
PJ_wag7.c PJ_lcca.c PJ_geos.c proj_etmerc.c \
diff --git a/src/PJ_bertin1953.c b/src/PJ_bertin1953.c
new file mode 100644
index 00000000..5a027da2
--- /dev/null
+++ b/src/PJ_bertin1953.c
@@ -0,0 +1,94 @@
+/*
+ Created by Jacques Bertin in 1953, this projection was the go-to choice
+ of the French cartographic school when they wished to represent phenomena
+ on a global scale.
+
+ Formula designed by Philippe Rivière, 2017.
+ https://visionscarto.net/bertin-projection-1953
+
+ Port to PROJ by Philippe Rivière, 21 September 2018
+*/
+
+#define PJ_LIB__
+
+#include <errno.h>
+#include <math.h>
+
+#include "proj_internal.h"
+#include "proj.h"
+#include "projects.h"
+
+PROJ_HEAD(bertin1953, "Bertin 1953")
+ "\n\tMisc Sph no inv.";
+
+struct pj_opaque {
+ double cos_delta_phi, sin_delta_phi, cos_delta_gamma, sin_delta_gamma, deltaLambda;
+};
+
+
+static XY s_forward (LP lp, PJ *P) {
+ XY xy = {0.0,0.0};
+ struct pj_opaque *Q = P->opaque;
+
+ double fu = 1.4, k = 12., w = 1.68, d;
+
+ /* Rotate */
+ double cosphi, x, y, z, z0;
+ lp.lam += PJ_TORAD(-16.5);
+ cosphi = cos(lp.phi);
+ x = cos(lp.lam) * cosphi;
+ y = sin(lp.lam) * cosphi;
+ z = sin(lp.phi);
+ z0 = z * Q->cos_delta_phi + x * Q->sin_delta_phi;
+ lp.lam = atan2(y * Q->cos_delta_gamma - z0 * Q->sin_delta_gamma,
+ x * Q->cos_delta_phi - z * Q->sin_delta_phi);
+ z0 = z0 * Q->cos_delta_gamma + y * Q->sin_delta_gamma;
+ lp.phi = asin(z0);
+
+ lp.lam = adjlon(lp.lam);
+
+ /* Adjust pre-projection */
+ if (lp.lam + lp.phi < -fu) {
+ d = (lp.lam - lp.phi + 1.6) * (lp.lam + lp.phi + fu) / 8.;
+ lp.lam += d;
+ lp.phi -= 0.8 * d * sin(lp.phi + M_PI / 2.);
+ }
+
+ /* Project with Hammer (1.68,2) */
+ cosphi = cos(lp.phi);
+ d = sqrt(2./(1. + cosphi * cos(lp.lam / 2.)));
+ xy.x = w * d * cosphi * sin(lp.lam / 2.);
+ xy.y = d * sin(lp.phi);
+
+ /* Adjust post-projection */
+ d = (1. - cos(lp.lam * lp.phi)) / k;
+ if (xy.y < 0.) {
+ xy.x *= 1. + d;
+ }
+ if (xy.y > 0.) {
+ xy.x *= 1. + d / 1.5 * xy.x * xy.x;
+ }
+
+ return xy;
+}
+
+
+PJ *PROJECTION(bertin1953) {
+ struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque));
+ if (0==Q)
+ return pj_default_destructor (P, ENOMEM);
+ P->opaque = Q;
+
+ P->lam0 = 0;
+ P->phi0 = PJ_TORAD(-42.);
+
+ Q->cos_delta_phi = cos(P->phi0);
+ Q->sin_delta_phi = sin(P->phi0);
+ Q->cos_delta_gamma = 1.;
+ Q->sin_delta_gamma = 0.;
+
+ P->es = 0.;
+ P->fwd = s_forward;
+
+ return P;
+}
diff --git a/src/lib_proj.cmake b/src/lib_proj.cmake
index a359369e..3e1a17ad 100644
--- a/src/lib_proj.cmake
+++ b/src/lib_proj.cmake
@@ -46,6 +46,7 @@ SET(SRC_LIBPROJ_PJ
PJ_august.c
PJ_axisswap.c
PJ_bacon.c
+ PJ_bertin1953.c
PJ_bipc.c
PJ_boggs.c
PJ_bonne.c
diff --git a/src/pj_list.h b/src/pj_list.h
index 72a9af7f..cd19d300 100644
--- a/src/pj_list.h
+++ b/src/pj_list.h
@@ -15,6 +15,7 @@ PROJ_HEAD(apian, "Apian Globular I")
PROJ_HEAD(august, "August Epicycloidal")
PROJ_HEAD(axisswap, "Axis ordering")
PROJ_HEAD(bacon, "Bacon Globular")
+PROJ_HEAD(bertin1953, "Bertin 1953")
PROJ_HEAD(bipc, "Bipolar conic of western hemisphere")
PROJ_HEAD(boggs, "Boggs Eumorphic")
PROJ_HEAD(bonne, "Bonne (Werner lat_1=90)")
diff --git a/test/gie/more_builtins.gie b/test/gie/more_builtins.gie
index 960e5814..6ac0c70c 100644
--- a/test/gie/more_builtins.gie
+++ b/test/gie/more_builtins.gie
@@ -59,6 +59,41 @@ roundtrip 100 1 m
-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+Tests for PJ_bertin1953.c
+-------------------------------------------------------------------------------
+operation proj=bertin1953 +R=1
+-------------------------------------------------------------------------------
+accept 0 0
+expect -0.260206554508 -0.685226058142
+
+accept 16.5 42
+expect 0.0 0.0
+
+accept -180 90
+expect 0.0 0.813473286152
+
+accept 0 90
+expect 0.0 0.813473286152
+
+accept 10 -35
+expect -0.138495501548 -1.221408328101
+
+accept -70 -35
+expect -1.504967424950 -0.522846035499
+
+accept 80 7
+expect 0.929377425352 -0.215443296201
+
+accept 128 35
+expect 0.937431733950 0.700084268525
+
+accept 170 -41
+expect 2.162845830414 -0.046534568425
+
+-------------------------------------------------------------------------------
+
+