aboutsummaryrefslogtreecommitdiff
path: root/src/conversions/set.cpp
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2020-01-29 17:13:00 +0100
committerGitHub <noreply@github.com>2020-01-29 17:13:00 +0100
commite35cf5d63cdd11ab5bc8590d4172b474c4c64938 (patch)
treef15a498410f5d492a8fe6e1c8a10eff202253b08 /src/conversions/set.cpp
parent9f6ab28f1d26561a547802a18b3a2f7877834ca8 (diff)
parent4b7ec1a1822b808491fd4b675404a8259e9dc28f (diff)
downloadPROJ-e35cf5d63cdd11ab5bc8590d4172b474c4c64938.tar.gz
PROJ-e35cf5d63cdd11ab5bc8590d4172b474c4c64938.zip
Merge pull request #1896 from rouault/add_set_operation
Add +proj=set operation to set component(s) of a coordinate to a fixed value
Diffstat (limited to 'src/conversions/set.cpp')
-rw-r--r--src/conversions/set.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/conversions/set.cpp b/src/conversions/set.cpp
new file mode 100644
index 00000000..7628bf4f
--- /dev/null
+++ b/src/conversions/set.cpp
@@ -0,0 +1,75 @@
+#define PJ_LIB__
+
+#include "proj_internal.h"
+#include <errno.h>
+
+PROJ_HEAD(set, "Set coordinate value");
+
+/* Projection specific elements for the PJ object */
+namespace { // anonymous namespace
+struct Set {
+ bool v1;
+ bool v2;
+ bool v3;
+ bool v4;
+ double v1_val;
+ double v2_val;
+ double v3_val;
+ double v4_val;
+};
+} // anonymous namespace
+
+static PJ_COORD set_fwd_inv(PJ_COORD point, PJ *P) {
+
+ struct Set *set = static_cast<struct Set*>(P->opaque);
+
+ if (set->v1)
+ point.v[0] = set->v1_val;
+ if (set->v2)
+ point.v[1] = set->v2_val;
+ if (set->v3)
+ point.v[2] = set->v3_val;
+ if (set->v4)
+ point.v[3] = set->v4_val;
+
+ return point;
+}
+
+PJ *OPERATION(set, 0) {
+ P->inv4d = set_fwd_inv;
+ P->fwd4d = set_fwd_inv;
+
+ auto set = static_cast<struct Set*>(pj_calloc (1, sizeof(struct Set)));
+ P->opaque = set;
+ if (nullptr==P->opaque)
+ return pj_default_destructor(P, ENOMEM);
+
+ if (pj_param_exists(P->params, "v_1"))
+ {
+ set->v1 = true;
+ set->v1_val = pj_param (P->ctx, P->params, "dv_1").f;
+ }
+
+ if (pj_param_exists(P->params, "v_2"))
+ {
+ set->v2 = true;
+ set->v2_val = pj_param (P->ctx, P->params, "dv_2").f;
+ }
+
+ if (pj_param_exists(P->params, "v_3"))
+ {
+ set->v3 = true;
+ set->v3_val = pj_param (P->ctx, P->params, "dv_3").f;
+ }
+
+ if (pj_param_exists(P->params, "v_4"))
+ {
+ set->v4 = true;
+ set->v4_val = pj_param (P->ctx, P->params, "dv_4").f;
+ }
+
+ P->left = PJ_IO_UNITS_WHATEVER;
+ P->right = PJ_IO_UNITS_WHATEVER;
+
+ return P;
+}