From b08b9580ab0aca70c8762b3f8f0039484ddaca60 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 20 Feb 2019 11:02:53 +0100 Subject: vgridshift: propagate multiplier to avoid false-positive detection of nodata values in the grids with US VERTCON grids that are in millimeters --- src/transformations/deformation.cpp | 2 +- src/transformations/vgridshift.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/transformations') diff --git a/src/transformations/deformation.cpp b/src/transformations/deformation.cpp index c28e1489..0e0d641c 100644 --- a/src/transformations/deformation.cpp +++ b/src/transformations/deformation.cpp @@ -92,7 +92,7 @@ static PJ_XYZ get_grid_shift(PJ* P, PJ_XYZ cartesian) { /* look up correction values in grids */ shift.lp = proj_hgrid_value(P, geodetic.lp); - shift.enu.u = proj_vgrid_value(P, geodetic.lp); + shift.enu.u = proj_vgrid_value(P, geodetic.lp, 1.0); if (proj_errno(P) == PJD_ERR_GRID_AREA) proj_log_debug(P, "deformation: coordinate (%.3f, %.3f) outside deformation model", diff --git a/src/transformations/vgridshift.cpp b/src/transformations/vgridshift.cpp index fda38ec3..664010b8 100644 --- a/src/transformations/vgridshift.cpp +++ b/src/transformations/vgridshift.cpp @@ -26,7 +26,7 @@ static PJ_XYZ forward_3d(PJ_LPZ lpz, PJ *P) { if (P->vgridlist_geoid != nullptr) { /* Only try the gridshift if at least one grid is loaded, * otherwise just pass the coordinate through unchanged. */ - point.xyz.z += Q->forward_multiplier * proj_vgrid_value(P, point.lp); + point.xyz.z += Q->forward_multiplier * proj_vgrid_value(P, point.lp, Q->forward_multiplier); } return point.xyz; @@ -41,7 +41,7 @@ static PJ_LPZ reverse_3d(PJ_XYZ xyz, PJ *P) { if (P->vgridlist_geoid != nullptr) { /* Only try the gridshift if at least one grid is loaded, * otherwise just pass the coordinate through unchanged. */ - point.xyz.z -= Q->forward_multiplier * proj_vgrid_value(P, point.lp); + point.xyz.z -= Q->forward_multiplier * proj_vgrid_value(P, point.lp, Q->forward_multiplier); } return point.lpz; -- cgit v1.2.3 From 04844ac495f65e824a0bd9f9e49ea3360f2c063f Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 20 Feb 2019 13:21:15 +0100 Subject: Apply multiplier in proj_vgrid_value() --- src/transformations/vgridshift.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/transformations') diff --git a/src/transformations/vgridshift.cpp b/src/transformations/vgridshift.cpp index 664010b8..4cd48fb6 100644 --- a/src/transformations/vgridshift.cpp +++ b/src/transformations/vgridshift.cpp @@ -26,7 +26,7 @@ static PJ_XYZ forward_3d(PJ_LPZ lpz, PJ *P) { if (P->vgridlist_geoid != nullptr) { /* Only try the gridshift if at least one grid is loaded, * otherwise just pass the coordinate through unchanged. */ - point.xyz.z += Q->forward_multiplier * proj_vgrid_value(P, point.lp, Q->forward_multiplier); + point.xyz.z += proj_vgrid_value(P, point.lp, Q->forward_multiplier); } return point.xyz; @@ -41,7 +41,7 @@ static PJ_LPZ reverse_3d(PJ_XYZ xyz, PJ *P) { if (P->vgridlist_geoid != nullptr) { /* Only try the gridshift if at least one grid is loaded, * otherwise just pass the coordinate through unchanged. */ - point.xyz.z -= Q->forward_multiplier * proj_vgrid_value(P, point.lp, Q->forward_multiplier); + point.xyz.z -= proj_vgrid_value(P, point.lp, Q->forward_multiplier); } return point.lpz; -- cgit v1.2.3 From db29f2ecf6f49250079b962ad788b93fbc497fa3 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 15 Mar 2019 00:10:02 +0100 Subject: Molodensky: avoid division by zero Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13069 Credit to OSS Fuzz --- src/transformations/molodensky.cpp | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'src/transformations') diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index c389fd32..373b1095 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -146,10 +146,20 @@ static PJ_LPZ calc_standard_params(PJ_LPZ lpz, PJ *P) { dphi = (-dx*sphi*clam) - (dy*sphi*slam) + (dz*cphi) + ((nu * P->es * sphi * cphi * da) / a) + (sphi*cphi * ( rho/(1-f) + nu*(1-f))*df); - dphi /= (rho + lpz.z); + const double dphi_denom = rho + lpz.z; + if( dphi_denom == 0.0 ) { + lpz.lam = HUGE_VAL; + return lpz; + } + dphi /= dphi_denom; /* delta lambda */ - dlam = (-dx*slam + dy*clam) / ((nu+lpz.z)*cphi); + const double dlam_denom = (nu+lpz.z)*cphi; + if( dlam_denom == 0.0 ) { + lpz.lam = HUGE_VAL; + return lpz; + } + dlam = (-dx*slam + dy*clam) / dlam_denom; /* delta h */ dh = dx*cphi*clam + dy*cphi*slam + dz*sphi - (a/nu)*da + nu*(1-f)*sphi*sphi*df; @@ -183,7 +193,12 @@ static PJ_LPZ calc_abridged_params(PJ_LPZ lpz, PJ *P) { /* delta lambda */ dlam = -dx*slam + dy*clam; - dlam /= RN(P->a, P->e2s, lpz.phi)*cphi; + const double dlam_denom = RN(P->a, P->e2s, lpz.phi)*cphi; + if( dlam_denom == 0.0 ) { + lpz.lam = HUGE_VAL; + return lpz; + } + dlam /= dlam_denom; /* delta h */ dh = dx*cphi*clam + dy*cphi*slam + dz*sphi - da + adffda*sphi*sphi; @@ -230,6 +245,10 @@ static PJ_XYZ forward_3d(PJ_LPZ lpz, PJ *P) { } else { lpz = calc_standard_params(lpz, P); } + if( lpz.lam == HUGE_VAL ) { + proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + return proj_coord_error().xyz; + } /* offset coordinate */ point.lpz.phi += lpz.phi; @@ -258,6 +277,11 @@ static PJ_LPZ reverse_3d(PJ_XYZ xyz, PJ *P) { else lpz = calc_standard_params(point.lpz, P); + if( lpz.lam == HUGE_VAL ) { + proj_errno_set(P, PJD_ERR_TOLERANCE_CONDITION); + return proj_coord_error().lpz; + } + /* offset coordinate */ point.lpz.phi -= lpz.phi; point.lpz.lam -= lpz.lam; -- cgit v1.2.3 From 6bde8881169cdf37256b0148e7d383232a4e305e Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 15 Mar 2019 23:52:33 +0100 Subject: Helmert: avoid potential division by zero Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11893 Credit to OSS Fuzz --- src/transformations/helmert.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/transformations') diff --git a/src/transformations/helmert.cpp b/src/transformations/helmert.cpp index 034f76f4..c00fad2f 100644 --- a/src/transformations/helmert.cpp +++ b/src/transformations/helmert.cpp @@ -567,14 +567,14 @@ PJ *TRANSFORMATION(helmert, 0) { if (pj_param_exists (P->params, "theta")) { P->left = PJ_IO_UNITS_PROJECTED; P->right = PJ_IO_UNITS_PROJECTED; + P->fwd = helmert_forward; + P->inv = helmert_reverse; } P->fwd4d = helmert_forward_4d; P->inv4d = helmert_reverse_4d; P->fwd3d = helmert_forward_3d; P->inv3d = helmert_reverse_3d; - P->fwd = helmert_forward; - P->inv = helmert_reverse; Q = (struct pj_opaque_helmert *)P->opaque; -- cgit v1.2.3 From 644a592cc866ae2871eb82fdd428182dab47fab2 Mon Sep 17 00:00:00 2001 From: Kristian Evers Date: Sat, 16 Mar 2019 09:53:56 +0100 Subject: Use 1st eccentricity instead of 2nd eccentricity By mistake the second eccentricity was used in a few places in the Molodensky transform. According to the literature the first eccentricity should always be used in the eccentricity. This only affects the output slightly. Reported test coordinates differed by less than a millimeter. Fixes #1321 --- src/transformations/molodensky.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/transformations') diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index 373b1095..289c321e 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -140,7 +140,7 @@ static PJ_LPZ calc_standard_params(PJ_LPZ lpz, PJ *P) { /* ellipsoid radii of curvature */ double rho = RM(a, P->es, lpz.phi); - double nu = RN(a, P->e2s, lpz.phi); + double nu = RN(a, P->es, lpz.phi); /* delta phi */ dphi = (-dx*sphi*clam) - (dy*sphi*slam) + (dz*cphi) @@ -193,7 +193,7 @@ static PJ_LPZ calc_abridged_params(PJ_LPZ lpz, PJ *P) { /* delta lambda */ dlam = -dx*slam + dy*clam; - const double dlam_denom = RN(P->a, P->e2s, lpz.phi)*cphi; + const double dlam_denom = RN(P->a, P->es, lpz.phi)*cphi; if( dlam_denom == 0.0 ) { lpz.lam = HUGE_VAL; return lpz; -- cgit v1.2.3 From 095d2204f8bb05d172936aebbb1e9e44852c049f Mon Sep 17 00:00:00 2001 From: Chris Mayo Date: Fri, 29 Mar 2019 19:17:37 +0000 Subject: Remove duplicate instances of #include "proj_internal.h" Introduced by "Merge projects.h into proj_internal.h" 8ab6f683. --- src/transformations/deformation.cpp | 1 - src/transformations/helmert.cpp | 1 - src/transformations/hgridshift.cpp | 1 - src/transformations/horner.cpp | 1 - src/transformations/molodensky.cpp | 1 - src/transformations/vgridshift.cpp | 1 - 6 files changed, 6 deletions(-) (limited to 'src/transformations') diff --git a/src/transformations/deformation.cpp b/src/transformations/deformation.cpp index 0e0d641c..5bb86909 100644 --- a/src/transformations/deformation.cpp +++ b/src/transformations/deformation.cpp @@ -56,7 +56,6 @@ grid-values in units of mm/year in ENU-space. #include "proj.h" #include "proj_internal.h" #include "proj_math.h" -#include "proj_internal.h" PROJ_HEAD(deformation, "Kinematic grid shift"); diff --git a/src/transformations/helmert.cpp b/src/transformations/helmert.cpp index c00fad2f..63785ea5 100644 --- a/src/transformations/helmert.cpp +++ b/src/transformations/helmert.cpp @@ -52,7 +52,6 @@ Last update: 2018-10-26 #include #include -#include "proj_internal.h" #include "proj_internal.h" #include "geocent.h" diff --git a/src/transformations/hgridshift.cpp b/src/transformations/hgridshift.cpp index 2e2294cb..90633939 100644 --- a/src/transformations/hgridshift.cpp +++ b/src/transformations/hgridshift.cpp @@ -5,7 +5,6 @@ #include #include -#include "proj_internal.h" #include "proj_internal.h" PROJ_HEAD(hgridshift, "Horizontal grid shift"); diff --git a/src/transformations/horner.cpp b/src/transformations/horner.cpp index f5d749c4..a6638773 100644 --- a/src/transformations/horner.cpp +++ b/src/transformations/horner.cpp @@ -85,7 +85,6 @@ #include "proj.h" #include "proj_internal.h" -#include "proj_internal.h" PROJ_HEAD(horner, "Horner polynomial evaluation"); diff --git a/src/transformations/molodensky.cpp b/src/transformations/molodensky.cpp index 289c321e..7d17f64c 100644 --- a/src/transformations/molodensky.cpp +++ b/src/transformations/molodensky.cpp @@ -49,7 +49,6 @@ #include "proj.h" #include "proj_internal.h" -#include "proj_internal.h" PROJ_HEAD(molodensky, "Molodensky transform"); diff --git a/src/transformations/vgridshift.cpp b/src/transformations/vgridshift.cpp index 4cd48fb6..de0cdd8c 100644 --- a/src/transformations/vgridshift.cpp +++ b/src/transformations/vgridshift.cpp @@ -5,7 +5,6 @@ #include #include -#include "proj_internal.h" #include "proj_internal.h" PROJ_HEAD(vgridshift, "Vertical grid shift"); -- cgit v1.2.3 From 6ae93423b74cee676e356e7f9e0a72725f61b5b6 Mon Sep 17 00:00:00 2001 From: Chris Mayo Date: Sat, 30 Mar 2019 19:30:28 +0000 Subject: affine: remove duplicate #include "proj_internal.h" Introduced by "Merge projects.h into proj_internal.h" 8ab6f68. --- src/transformations/affine.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/transformations') diff --git a/src/transformations/affine.cpp b/src/transformations/affine.cpp index bda54f1e..28f73b9a 100644 --- a/src/transformations/affine.cpp +++ b/src/transformations/affine.cpp @@ -25,7 +25,6 @@ #include #include -#include "proj_internal.h" #include "proj.h" #include "proj_internal.h" -- cgit v1.2.3