aboutsummaryrefslogtreecommitdiff
path: root/src/projections/aea.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/projections/aea.cpp')
-rw-r--r--src/projections/aea.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/projections/aea.cpp b/src/projections/aea.cpp
index 9a0c4656..721ea3c9 100644
--- a/src/projections/aea.cpp
+++ b/src/projections/aea.cpp
@@ -99,7 +99,7 @@ static PJ *destructor (PJ *P, int errlev) { /* Destructor
-static PJ_XY e_forward (PJ_LP lp, PJ *P) { /* Ellipsoid/spheroid, forward */
+static PJ_XY aea_e_forward (PJ_LP lp, PJ *P) { /* Ellipsoid/spheroid, forward */
PJ_XY xy = {0.0,0.0};
struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
Q->rho = Q->c - (Q->ellips ? Q->n * pj_qsfn(sin(lp.phi), P->e, P->one_es) : Q->n2 * sin(lp.phi));;
@@ -114,7 +114,7 @@ static PJ_XY e_forward (PJ_LP lp, PJ *P) { /* Ellipsoid/spheroid, forward */
}
-static PJ_LP e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoid/spheroid, inverse */
+static PJ_LP aea_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoid/spheroid, inverse */
PJ_LP lp = {0.0,0.0};
struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
if( (Q->rho = hypot(xy.x, xy.y = Q->rho0 - xy.y)) != 0.0 ) {
@@ -152,9 +152,11 @@ static PJ *setup(PJ *P) {
int secant;
struct pj_opaque *Q = static_cast<struct pj_opaque*>(P->opaque);
- P->inv = e_inverse;
- P->fwd = e_forward;
+ P->inv = aea_e_inverse;
+ P->fwd = aea_e_forward;
+ if (fabs(Q->phi1) > M_HALFPI || fabs(Q->phi2) > M_HALFPI)
+ return destructor(P, PJD_ERR_LAT_LARGER_THAN_90);
if (fabs(Q->phi1 + Q->phi2) < EPS10)
return destructor(P, PJD_ERR_CONIC_LAT_EQUAL);
Q->n = sinphi = sin(Q->phi1);
@@ -178,6 +180,10 @@ static PJ *setup(PJ *P) {
return destructor(P, 0);
Q->n = (m1 * m1 - m2 * m2) / (ml2 - ml1);
+ if (Q->n == 0) {
+ // Not quite, but es is very close to 1...
+ return destructor(P, PJD_ERR_INVALID_ECCENTRICITY);
+ }
}
Q->ec = 1. - .5 * P->one_es * log((1. - P->e) /
(1. + P->e)) / P->e;