aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2016-04-28 21:40:15 +0200
committerKristian Evers <kristianevers@gmail.com>2016-04-28 21:40:15 +0200
commite8fd3d30fb250d6900bc19a11e10892f5902c591 (patch)
tree986b48da60cbb3b3d0edd5b023bb9d9c0a432e47 /src
parent9e39856aaeb4bc6feb61065069ea710f96a74f4a (diff)
downloadPROJ-e8fd3d30fb250d6900bc19a11e10892f5902c591.tar.gz
PROJ-e8fd3d30fb250d6900bc19a11e10892f5902c591.zip
Expanded tabs and added test to merc
Diffstat (limited to 'src')
-rw-r--r--src/PJ_aea.c1
-rw-r--r--src/PJ_merc.c126
2 files changed, 93 insertions, 34 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 282c0b88..1ad52655 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -369,7 +369,6 @@ int pj_longlat_selftest (void) {return 10000;}
int pj_lee_os_selftest (void) {return 10000;}
-int pj_merc_selftest (void) {return 10000;}
int pj_mil_os_selftest (void) {return 10000;}
int pj_mill_selftest (void) {return 10000;}
int pj_misrsom_selftest (void) {return 10000;}
diff --git a/src/PJ_merc.c b/src/PJ_merc.c
index 89913e50..dd894bbd 100644
--- a/src/PJ_merc.c
+++ b/src/PJ_merc.c
@@ -1,44 +1,44 @@
#define PJ_LIB__
-#include <projects.h>
+#include <projects.h>
+
PROJ_HEAD(merc, "Mercator") "\n\tCyl, Sph&Ell\n\tlat_ts=";
#define EPS10 1.e-10
-
static XY e_forward (LP lp, PJ *P) { /* Ellipsoidal, forward */
XY xy = {0.0,0.0};
- if (fabs(fabs(lp.phi) - HALFPI) <= EPS10)
+ if (fabs(fabs(lp.phi) - HALFPI) <= EPS10)
F_ERROR;
- xy.x = P->k0 * lp.lam;
- xy.y = - P->k0 * log(pj_tsfn(lp.phi, sin(lp.phi), P->e));
- return xy;
+ xy.x = P->k0 * lp.lam;
+ xy.y = - P->k0 * log(pj_tsfn(lp.phi, sin(lp.phi), P->e));
+ return xy;
}
static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
XY xy = {0.0,0.0};
- if (fabs(fabs(lp.phi) - HALFPI) <= EPS10)
+ if (fabs(fabs(lp.phi) - HALFPI) <= EPS10)
F_ERROR;
- xy.x = P->k0 * lp.lam;
- xy.y = P->k0 * log(tan(FORTPI + .5 * lp.phi));
- return xy;
+ xy.x = P->k0 * lp.lam;
+ xy.y = P->k0 * log(tan(FORTPI + .5 * lp.phi));
+ return xy;
}
static LP e_inverse (XY xy, PJ *P) { /* Ellipsoidal, inverse */
LP lp = {0.0,0.0};
- if ((lp.phi = pj_phi2(P->ctx, exp(- xy.y / P->k0), P->e)) == HUGE_VAL)
+ if ((lp.phi = pj_phi2(P->ctx, exp(- xy.y / P->k0), P->e)) == HUGE_VAL)
I_ERROR;
- lp.lam = xy.x / P->k0;
- return lp;
+ lp.lam = xy.x / P->k0;
+ return lp;
}
static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */
LP lp = {0.0,0.0};
- lp.phi = HALFPI - 2. * atan(exp(-xy.y / P->k0));
- lp.lam = xy.x / P->k0;
- return lp;
+ lp.phi = HALFPI - 2. * atan(exp(-xy.y / P->k0));
+ lp.lam = xy.x / P->k0;
+ return lp;
}
@@ -48,27 +48,87 @@ static void freeup(PJ *P) { /* Destructor */
PJ *PROJECTION(merc) {
- double phits=0.0;
- int is_phits;
+ double phits=0.0;
+ int is_phits;
- if( (is_phits = pj_param(P->ctx, P->params, "tlat_ts").i) ) {
- phits = fabs(pj_param(P->ctx, P->params, "rlat_ts").f);
- if (phits >= HALFPI) E_ERROR(-24);
- }
+ if( (is_phits = pj_param(P->ctx, P->params, "tlat_ts").i) ) {
+ phits = fabs(pj_param(P->ctx, P->params, "rlat_ts").f);
+ if (phits >= HALFPI) E_ERROR(-24);
+ }
- if (P->es) { /* ellipsoid */
- if (is_phits)
- P->k0 = pj_msfn(sin(phits), cos(phits), P->es);
- P->inv = e_inverse;
- P->fwd = e_forward;
- }
+ if (P->es) { /* ellipsoid */
+ if (is_phits)
+ P->k0 = pj_msfn(sin(phits), cos(phits), P->es);
+ P->inv = e_inverse;
+ P->fwd = e_forward;
+ }
else { /* sphere */
- if (is_phits)
- P->k0 = cos(phits);
- P->inv = s_inverse;
- P->fwd = s_forward;
- }
+ if (is_phits)
+ P->k0 = cos(phits);
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+ }
return P;
}
+
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_merc_selftest (void) {return 0;}
+#else
+
+int pj_merc_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=merc +ellps=GRS80 +lat_1=0.5 +lat_2=2"};
+ char s_args[] = {"+proj=merc +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY e_fwd_expect[] = {
+ { 222638.981586547132, 110579.965218249708},
+ { 222638.981586547132, -110579.965218249112},
+ {-222638.981586547132, 110579.965218249708},
+ {-222638.981586547132, -110579.965218249112},
+ };
+
+ XY s_fwd_expect[] = {
+ { 223402.144255274179, 111706.743574944077},
+ { 223402.144255274179, -111706.743574944485},
+ {-223402.144255274179, 111706.743574944077},
+ {-223402.144255274179, -111706.743574944485},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP e_inv_expect[] = {
+ { 0.00179663056823904264, 0.00090436947522799056},
+ { 0.00179663056823904264, -0.00090436947522799056},
+ {-0.00179663056823904264, 0.00090436947522799056},
+ {-0.00179663056823904264, -0.00090436947522799056},
+ };
+
+ LP s_inv_expect[] = {
+ { 0.00179049310978382265, 0.000895246554845297135},
+ { 0.00179049310978382265, -0.000895246554858019272},
+ {-0.00179049310978382265, 0.000895246554845297135},
+ {-0.00179049310978382265, -0.000895246554858019272},
+ };
+
+ return pj_generic_selftest (e_args, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, e_fwd_expect, s_fwd_expect, inv_in, e_inv_expect, s_inv_expect);
+}
+
+
+#endif