aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2016-04-13 23:05:00 +0200
committerKristian Evers <kristianevers@gmail.com>2016-04-13 23:05:00 +0200
commit9f0c963ffff90f7d62b5e25dea3db4e3f1cbd897 (patch)
tree92799f2b5f024d4beeb59941197c6a925a63e53e /src
parent613baf982c3d14ab4ebce2e754043f193f0c56fa (diff)
downloadPROJ-9f0c963ffff90f7d62b5e25dea3db4e3f1cbd897.tar.gz
PROJ-9f0c963ffff90f7d62b5e25dea3db4e3f1cbd897.zip
Converted Craster Parabolic (Putnins P4) projection
Diffstat (limited to 'src')
-rw-r--r--src/PJ_aea.c1
-rw-r--r--src/PJ_crast.c90
2 files changed, 82 insertions, 9 deletions
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 65b001b4..2cbb4cc3 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_crast_selftest (void) {return 10000;}
int pj_denoy_selftest (void) {return 10000;}
int pj_eck1_selftest (void) {return 10000;}
int pj_eck2_selftest (void) {return 10000;}
diff --git a/src/PJ_crast.c b/src/PJ_crast.c
index 3f251ac6..9a896459 100644
--- a/src/PJ_crast.c
+++ b/src/PJ_crast.c
@@ -1,24 +1,98 @@
#define PJ_LIB__
# include <projects.h>
-PROJ_HEAD(crast, "Craster Parabolic (Putnins P4)")
-"\n\tPCyl., Sph.";
+
+PROJ_HEAD(crast, "Craster Parabolic (Putnins P4)") "\n\tPCyl., Sph.";
+
#define XM 0.97720502380583984317
#define RXM 1.02332670794648848847
#define YM 3.06998012383946546542
#define RYM 0.32573500793527994772
#define THIRD 0.333333333333333333
-FORWARD(s_forward); /* spheroid */
+
+
+static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */
+ XY xy = {0.0,0.0};
(void) P;
lp.phi *= THIRD;
xy.x = XM * lp.lam * (2. * cos(lp.phi + lp.phi) - 1.);
xy.y = YM * sin(lp.phi);
- return (xy);
+ return xy;
}
-INVERSE(s_inverse); /* spheroid */
+
+
+static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */
+ LP lp = {0.0,0.0};
(void) P;
lp.phi = 3. * asin(xy.y * RYM);
lp.lam = xy.x * RXM / (2. * cos((lp.phi + lp.phi) * THIRD) - 1);
- return (lp);
+ return lp;
}
-FREEUP; if (P) pj_dalloc(P); }
-ENTRY0(crast) 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(crast) {
+ P->es = 0.0;
+ P->inv = s_inverse;
+ P->fwd = s_forward;
+
+ P->pfree = freeup;
+ P->descr = des_crast;
+
+ return P;
+}
+
+#ifdef PJ_OMIT_SELFTEST
+int pj_crast_selftest (void) {return 0;}
+#else
+
+int pj_crast_selftest (void) {
+ double tolerance_lp = 1e-10;
+ double tolerance_xy = 1e-7;
+
+ char e_args[] = {"+proj=crast +ellps=GRS80 +lat_1=0.5 +lat_2=2"};
+ char s_args[] = {"+proj=crast +a=6400000 +lat_1=0.5 +lat_2=2"};
+
+ LP fwd_in[] = {
+ { 2, 1},
+ { 2,-1},
+ {-2, 1},
+ {-2,-1}
+ };
+
+
+ XY s_fwd_expect[] = {
+ {218280.142056780722, 114306.045604279774},
+ {218280.142056780722, -114306.045604279774},
+ {-218280.142056780722, 114306.045604279774},
+ {-218280.142056780722, -114306.045604279774},
+ };
+
+ XY inv_in[] = {
+ { 200, 100},
+ { 200,-100},
+ {-200, 100},
+ {-200,-100}
+ };
+
+ LP s_inv_expect[] = {
+ {0.00183225941982580187, 0.00087483943098902331},
+ {0.00183225941982580187, -0.00087483943098902331},
+ {-0.00183225941982580187, 0.00087483943098902331},
+ {-0.00183225941982580187, -0.00087483943098902331},
+ };
+
+ 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