Skip to content

Commit

Permalink
Molodensky: allow parameters to be set to zero
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
rouault committed Dec 10, 2018
1 parent 3945d99 commit 5fca5d4
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 7 deletions.
25 changes: 18 additions & 7 deletions src/PJ_molodensky.c
Expand Up @@ -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);
Expand All @@ -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;
Expand Down
23 changes: 23 additions & 0 deletions test/gie/more_builtins.gie
Expand Up @@ -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


-------------------------------------------------------------------------------
Expand Down

0 comments on commit 5fca5d4

Please sign in to comment.