aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2016-04-13 21:56:03 +0200
committerKristian Evers <kristianevers@gmail.com>2016-04-13 21:56:03 +0200
commita98e366f1e91202d576cecb2015dfa8db6a42bc3 (patch)
tree970c239b4dc568223d3236df5134c81d0df85d90
parentb62b21c363e436b8260279623cd2e4ebf7faccdf (diff)
downloadPROJ-a98e366f1e91202d576cecb2015dfa8db6a42bc3.tar.gz
PROJ-a98e366f1e91202d576cecb2015dfa8db6a42bc3.zip
Converted Collignon projection
-rw-r--r--src/PJ_aea.c1
-rw-r--r--src/PJ_collg.c76
2 files changed, 72 insertions, 5 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 2e441beb..52510360 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -357,7 +357,6 @@ int pj_aeqd_selftest (void) {return 10000;}
int pj_alsk_selftest (void) {return 10000;}
int pj_chamb_selftest (void) {return 10000;}
-int pj_collg_selftest (void) {return 10000;}
int pj_comill_selftest (void) {return 10000;}
int pj_crast_selftest (void) {return 10000;}
int pj_denoy_selftest (void) {return 10000;}
diff --git a/src/PJ_collg.c b/src/PJ_collg.c
index 871dfc97..80029a3a 100644
--- a/src/PJ_collg.c
+++ b/src/PJ_collg.c
@@ -1,10 +1,14 @@
#define PJ_LIB__
# include <projects.h>
+
PROJ_HEAD(collg, "Collignon") "\n\tPCyl, Sph.";
#define FXC 1.12837916709551257390
#define FYC 1.77245385090551602729
#define ONEEPS 1.0000001
-FORWARD(s_forward); /* spheroid */
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0,0.0};
(void) P;
if ((xy.y = 1. - sin(lp.phi)) <= 0.)
xy.y = 0.;
@@ -14,7 +18,10 @@ FORWARD(s_forward); /* spheroid */
xy.y = FYC * (1. - xy.y);
return (xy);
}
-INVERSE(s_inverse); /* spheroid */
+
+
+static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */
+ LP lp = {0.0,0.0};
lp.phi = xy.y / FYC - 1.;
if (fabs(lp.phi = 1. - lp.phi * lp.phi) < 1.)
lp.phi = asin(lp.phi);
@@ -26,5 +33,66 @@ INVERSE(s_inverse); /* spheroid */
lp.lam = xy.x / (FXC * sqrt(lp.lam));
return (lp);
}
-FREEUP; if (P) pj_dalloc(P); }
-ENTRY0(collg) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P)
+
+
+static void *freeup_new (PJ *P) { /* Destructor */
+ return pj_dealloc(P);
+}
+
+static void freeup (PJ *P) {
+ freeup_new (P);
+ return;
+}
+
+
+PJ *PROJECTION(collg) {
+ P->es = 0.0;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+
+ return P;
+}
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_collg_selftest (void) {return 0;}
+#else
+
+int pj_collg_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char s_args[] = {"+proj=collg +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+ XY s_fwd_expect[] = {
+ {249872.921577929839, 99423.1747884602082},
+ {254272.532301245432, -98559.3077607425657},
+ {-249872.921577929839, 99423.1747884602082},
+ {-254272.532301245432, -98559.3077607425657},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ {0.00158679719207879865, 0.00101017310941749921},
+ {0.001586769215623956, -0.00101018201458258111},
+ {-0.00158679719207879865, 0.00101017310941749921},
+ {-0.001586769215623956, -0.00101018201458258111},
+ };
+
+ return pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, 4, 4, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect);
+}
+
+
+#endif