diff options
| author | Kristian Evers <kristianevers@gmail.com> | 2016-04-13 23:05:00 +0200 |
|---|---|---|
| committer | Kristian Evers <kristianevers@gmail.com> | 2016-04-13 23:05:00 +0200 |
| commit | 9f0c963ffff90f7d62b5e25dea3db4e3f1cbd897 (patch) | |
| tree | 92799f2b5f024d4beeb59941197c6a925a63e53e /src | |
| parent | 613baf982c3d14ab4ebce2e754043f193f0c56fa (diff) | |
| download | PROJ-9f0c963ffff90f7d62b5e25dea3db4e3f1cbd897.tar.gz PROJ-9f0c963ffff90f7d62b5e25dea3db4e3f1cbd897.zip | |
Converted Craster Parabolic (Putnins P4) projection
Diffstat (limited to 'src')
| -rw-r--r-- | src/PJ_aea.c | 1 | ||||
| -rw-r--r-- | src/PJ_crast.c | 90 |
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 |
