aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHoward Butler <howard@hobu.co>2016-08-21 23:34:18 -0500
committerGitHub <noreply@github.com>2016-08-21 23:34:18 -0500
commit307914d451d87afd94b66aed872bba96d1968c85 (patch)
tree414c975126e04f69141ea260f83e52021b7cffb9 /src
parentc33ab589cf13d3e774cf0f842b221a8e44e21672 (diff)
parent2277d307a5dc34f9fa47a4fcb255544605754f21 (diff)
downloadPROJ-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.am2
-rw-r--r--src/PJ_times.c135
-rw-r--r--src/lib_proj.cmake1
-rw-r--r--src/makefile.vc2
-rw-r--r--src/pj_list.h1
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")