diff options
| author | Howard Butler <howard@hobu.co> | 2016-08-21 23:34:18 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-21 23:34:18 -0500 |
| commit | 307914d451d87afd94b66aed872bba96d1968c85 (patch) | |
| tree | 414c975126e04f69141ea260f83e52021b7cffb9 /src | |
| parent | c33ab589cf13d3e774cf0f842b221a8e44e21672 (diff) | |
| parent | 2277d307a5dc34f9fa47a4fcb255544605754f21 (diff) | |
| download | PROJ-307914d451d87afd94b66aed872bba96d1968c85.tar.gz PROJ-307914d451d87afd94b66aed872bba96d1968c85.zip | |
Merge pull request #400 from kbevers/times-projection
Implementation of Times projection
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/PJ_times.c | 135 | ||||
| -rw-r--r-- | src/lib_proj.cmake | 1 | ||||
| -rw-r--r-- | src/makefile.vc | 2 | ||||
| -rw-r--r-- | src/pj_list.h | 1 |
5 files changed, 139 insertions, 2 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 73d12a3c..8acf2774 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -41,7 +41,7 @@ libproj_la_SOURCES = \ PJ_cass.c PJ_cc.c PJ_cea.c PJ_eqc.c \ PJ_gall.c PJ_labrd.c PJ_lsat.c PJ_misrsom.c PJ_merc.c \ PJ_mill.c PJ_ocea.c PJ_omerc.c PJ_somerc.c \ - PJ_tcc.c PJ_tcea.c PJ_tmerc.c \ + PJ_tcc.c PJ_tcea.c PJ_times.c PJ_tmerc.c \ PJ_airy.c PJ_aitoff.c PJ_august.c PJ_bacon.c \ PJ_chamb.c PJ_hammer.c PJ_lagrng.c PJ_larr.c \ PJ_lask.c PJ_nocol.c PJ_ob_tran.c PJ_oea.c \ diff --git a/src/PJ_times.c b/src/PJ_times.c new file mode 100644 index 00000000..26d5e41c --- /dev/null +++ b/src/PJ_times.c @@ -0,0 +1,135 @@ +/****************************************************************************** + * Project: PROJ.4 + * Purpose: Implementation of the Times projection. + * Author: Kristian Evers <kristianevers@gmail.com> + * + ****************************************************************************** + * Copyright (c) 2016, Kristian Evers + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ***************************************************************************** + * Based on describtion of the Times Projection in + * + * Flattening the Earth, Snyder, J.P., 1993, p.213-214. + *****************************************************************************/ + +#define PJ_LIB__ +#include <projects.h> + +PROJ_HEAD(times, "Times") "\n\tCyl, Sph"; + +static XY s_forward (LP lp, PJ *P) { /* Spheroidal, forward */ + double T, S, S2; + XY xy = {0.0,0.0}; + (void) P; + + T = tan(lp.phi/2.0); + S = sin(M_FORTPI * T); + S2 = S*S; + + xy.x = lp.lam * (0.74482 - 0.34588*S2); + xy.y = 1.70711 * T; + + return xy; +} + + +static LP s_inverse (XY xy, PJ *P) { /* Spheroidal, inverse */ + double T, S, S2; + LP lp = {0.0,0.0}; + (void) P; + + T = xy.y / 1.70711; + S = sin(M_FORTPI * T); + S2 = S*S; + + lp.lam = xy.x / (0.74482 - 0.34588 * S2); + lp.phi = 2 * atan(T); + + return lp; +} + + +static void *freeup_new (PJ *P) { /* Destructor */ + if (0==P) + return 0; + + return pj_dealloc(P); +} + + +static void freeup (PJ *P) { + freeup_new (P); + return; +} + + +PJ *PROJECTION(times) { + P->es = 0.0; + + P->inv = s_inverse; + P->fwd = s_forward; + + return P; +} + + +#ifdef PJ_OMIT_SELFTEST +int pj_times_selftest (void) {return 0;} +#else + +int pj_times_selftest (void) { + double tolerance_lp = 1e-10; + double tolerance_xy = 1e-7; + int result; + int n = 5; + + char s_args[] = {"+proj=times +ellps=sphere"}; + + XY *inv_in = malloc(n*sizeof(XY)); + LP *s_inv_expect = malloc(n*sizeof(LP)); + + LP fwd_in[] = { + { 0, 0}, + { 80, 70}, + { 25, -10}, + {-35, 20}, + {-45, -30} + }; + + XY s_fwd_expect[] = { + { 0.0, 0.0}, + { 5785183.5760670956, 7615452.0661204215}, + { 2065971.5301078814, -951526.0648494592}, + {-2873054.0454850947, 1917730.9530005211}, + {-3651383.2035214868, -2914213.4578159209}, + }; + + memcpy(inv_in, &s_fwd_expect, n*sizeof(XY)); + memcpy(s_inv_expect, &fwd_in, n*sizeof(LP)); + + result = pj_generic_selftest (0, s_args, tolerance_xy, tolerance_lp, n, n, fwd_in, 0, s_fwd_expect, inv_in, 0, s_inv_expect); + free(inv_in); + free(s_inv_expect); + + return result; +} + + +#endif diff --git a/src/lib_proj.cmake b/src/lib_proj.cmake index 7b8ec961..a90cdac9 100644 --- a/src/lib_proj.cmake +++ b/src/lib_proj.cmake @@ -127,6 +127,7 @@ SET(SRC_LIBPROJ_PJ PJ_sts.c PJ_tcc.c PJ_tcea.c + PJ_times.c PJ_tmerc.c PJ_tpeqd.c PJ_urm5.c diff --git a/src/makefile.vc b/src/makefile.vc index 2efad1f0..6f63bc61 100644 --- a/src/makefile.vc +++ b/src/makefile.vc @@ -38,7 +38,7 @@ pseudo = \ PJ_putp4p.obj PJ_putp5.obj PJ_putp6.obj PJ_robin.obj \ PJ_sts.obj PJ_urm5.obj PJ_urmfps.obj PJ_wag2.obj \ PJ_wag3.obj PJ_wink1.obj PJ_wink2.obj PJ_isea.obj \ - PJ_calcofi.obj PJ_natearth.obj PJ_natearth2.obj + PJ_calcofi.obj PJ_natearth.obj PJ_natearth2.obj PJ_times.obj support = \ aasincos.obj adjlon.obj bch2bps.obj bchgen.obj pj_gauss.obj \ diff --git a/src/pj_list.h b/src/pj_list.h index bc4c448a..454c0a3c 100644 --- a/src/pj_list.h +++ b/src/pj_list.h @@ -123,6 +123,7 @@ PROJ_HEAD(sterea, "Oblique Stereographic Alternative") PROJ_HEAD(gstmerc, "Gauss-Schreiber Transverse Mercator (aka Gauss-Laborde Reunion)") PROJ_HEAD(tcc, "Transverse Central Cylindrical") PROJ_HEAD(tcea, "Transverse Cylindrical Equal Area") +PROJ_HEAD(times, "Times Projection") PROJ_HEAD(tissot, "Tissot Conic") PROJ_HEAD(tmerc, "Transverse Mercator") PROJ_HEAD(tpeqd, "Two Point Equidistant") |
