From 5fca5d41ef8b3ba0dd458ca78d96bfc2fd7b63a1 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 10 Dec 2018 11:14:56 +0100 Subject: [PATCH] Molodensky: allow parameters to be set to zero The computations work perfectly when one or all parameters are zero. I've been shown a case where there was no ellipsoid change, so da = df = 0. --- src/PJ_molodensky.c | 25 ++++++++++++++++++------- test/gie/more_builtins.gie | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/PJ_molodensky.c b/src/PJ_molodensky.c index 2db510380b..dbc8376858 100644 --- a/src/PJ_molodensky.c +++ b/src/PJ_molodensky.c @@ -272,6 +272,7 @@ static PJ_COORD reverse_4d(PJ_COORD obs, PJ *P) { PJ *TRANSFORMATION(molodensky,1) { + int count_required_params = 0; struct pj_opaque_molodensky *Q = pj_calloc(1, sizeof(struct pj_opaque_molodensky)); if (0==Q) return pj_default_destructor(P, ENOMEM); @@ -288,28 +289,38 @@ PJ *TRANSFORMATION(molodensky,1) { P->right = PJ_IO_UNITS_ANGULAR; /* read args */ - if (pj_param(P->ctx, P->params, "tdx").i) + if (pj_param(P->ctx, P->params, "tdx").i) { + count_required_params ++; Q->dx = pj_param(P->ctx, P->params, "ddx").f; + } - if (pj_param(P->ctx, P->params, "tdy").i) + if (pj_param(P->ctx, P->params, "tdy").i) { + count_required_params ++; Q->dy = pj_param(P->ctx, P->params, "ddy").f; + } - if (pj_param(P->ctx, P->params, "tdz").i) + if (pj_param(P->ctx, P->params, "tdz").i) { + count_required_params ++; Q->dz = pj_param(P->ctx, P->params, "ddz").f; + } - if (pj_param(P->ctx, P->params, "tda").i) + if (pj_param(P->ctx, P->params, "tda").i) { + count_required_params ++; Q->da = pj_param(P->ctx, P->params, "dda").f; + } - if (pj_param(P->ctx, P->params, "tdf").i) + if (pj_param(P->ctx, P->params, "tdf").i) { + count_required_params ++; Q->df = pj_param(P->ctx, P->params, "ddf").f; + } Q->abridged = pj_param(P->ctx, P->params, "tabridged").i; /* We want all parameters (except +abridged) to be set */ - if ((Q->dx == 0) && (Q->dy == 0) && (Q->dz == 0) && (Q->da == 0) && (Q->df == 0)) + if (count_required_params == 0) return pj_default_destructor(P, PJD_ERR_NO_ARGS); - if ((Q->dx == 0) || (Q->dy == 0) || (Q->dz == 0) || (Q->da == 0) || (Q->df == 0)) + if (count_required_params != 5) return pj_default_destructor(P, PJD_ERR_MISSING_ARGS); return P; diff --git a/test/gie/more_builtins.gie b/test/gie/more_builtins.gie index 6346499860..276b1fefbb 100644 --- a/test/gie/more_builtins.gie +++ b/test/gie/more_builtins.gie @@ -57,6 +57,29 @@ expect 144.968 -37.79848 46.378 0 roundtrip 100 1 m ------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +Molodensky with all 0 parameters +------------------------------------------------------------------------------- +operation proj=molodensky a=6378160 rf=298.25 + da=0 df=0 dx=0 dy=0 dz=0 +------------------------------------------------------------------------------- +tolerance 1 mm + +accept 144.9667 -37.8 50 0 +expect 144.9667 -37.8 50 0 + +roundtrip 1 +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +Test error cases of molodensky +------------------------------------------------------------------------------- +# No arguments +operation proj=molodensky a=6378160 rf=298.25 +expect failure errno no_args + +# Missing arguments +operation proj=molodensky a=6378160 rf=298.25 dx=0 +expect failure errno missing_arg -------------------------------------------------------------------------------