Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

the Bertin 1953 projection #1133

Merged
merged 5 commits into from
Oct 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 12 additions & 0 deletions docs/plot/plotdefs.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,18 @@
"res": "low",
"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,
Expand Down
64 changes: 64 additions & 0 deletions docs/source/operations/projections/bertin1953.rst
Original file line number Diff line number Diff line change
@@ -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.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this the best reference we have? If possible, I'd like to have a reference to the mathematical description as well, preferably an academic paper.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well if you read that modest blog post, you'll know :)
(I wish I had time and resources to publish this as an academic paper.)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did, but it wasn't clear to me if something else was published.

You are welcome to use the PROJ docs as a platform for describing the mathematics behind the projection.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PS: I agree that my construction is totally ad-hoc, and that another formula might be much nicer mathematically (esp. with second and third derivatives). It's the best I could come up with as a first approximation, and I'm very open to making an upgraded formula at some point (provided it still respects the original drawing).

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions docs/source/operations/projections/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Projections map the spherical 3D space to a flat 2D space.
apian
august
bacon
bertin1953
bipc
boggs
bonne
Expand Down
2 changes: 1 addition & 1 deletion src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
94 changes: 94 additions & 0 deletions src/PJ_bertin1953.c
Original file line number Diff line number Diff line change
@@ -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) */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this is the same Hammer projection as defined in PJ_hammer.c, yes? Why not use that directly by instantiating a Hammer specific PJ object with Q->P_hammer = proj_create(P->ctx, '+proj=hammer ...') in the projection setup and call pj_fwd(Q->P_hammer, lp) here?

This avoids duplicate code and potential bugs in Hammer will be fixed both places if necessary.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I wanted to do that, but couldn't find an example in the src/

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something similar is done in PJ_deformationc.:

/~https://github.com/OSGeo/proj.4/blob/0b32b840d3161c64d8f1f487b153178528c8c124/src/PJ_deformation.c#L270-L272

/~https://github.com/OSGeo/proj.4/blob/0b32b840d3161c64d8f1f487b153178528c8c124/src/PJ_deformation.c#L89

You'll have to adjust it a bit but the general idea is there. Also notice that you need to create a custom descructor for the PJ object. There's an example for that in the same file as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Feel free to add this! It's my first contribution to Proj.4 and it had been a looong time since I coded anything in C :-)

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;
}
1 change: 1 addition & 0 deletions src/lib_proj.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/pj_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)")
Expand Down
35 changes: 35 additions & 0 deletions test/gie/more_builtins.gie
Original file line number Diff line number Diff line change
Expand Up @@ -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

-------------------------------------------------------------------------------





Expand Down