From 3211f11241a11cabd5fcba960f2aa0d4c6d54b41 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 13 Feb 2019 18:24:08 +0100 Subject: EPSG Helmert and Molodensky-Badekas methods in the Geographic 2D domain: use the push/pop v_3 operator to preserve the Z component --- src/iso19111/coordinateoperation.cpp | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/iso19111/coordinateoperation.cpp') diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index 7cac18bf..14b1024d 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -8138,6 +8138,18 @@ void Transformation::_exportToPROJString( double z = parameterValueNumericAsSI(EPSG_CODE_PARAMETER_Z_AXIS_TRANSLATION); + if (methodEPSGCode == EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_TIME_DEPENDENT_COORDINATE_FRAME_GEOGRAPHIC_2D || + methodEPSGCode == EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_TIME_DEPENDENT_POSITION_VECTOR_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_2D) { + formatter->addStep("push"); + formatter->addParam("v_3"); + } + setupPROJGeodeticSourceCRS(formatter, sourceCRS(), "Helmert"); formatter->addStep("helmert"); @@ -8204,6 +8216,18 @@ void Transformation::_exportToPROJString( setupPROJGeodeticTargetCRS(formatter, targetCRS(), "Helmert"); + if (methodEPSGCode == EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_TIME_DEPENDENT_COORDINATE_FRAME_GEOGRAPHIC_2D || + methodEPSGCode == EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_TIME_DEPENDENT_POSITION_VECTOR_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_2D) { + formatter->addStep("pop"); + formatter->addParam("v_3"); + } + return; } @@ -8250,6 +8274,14 @@ void Transformation::_exportToPROJString( double pz = parameterValueNumericAsSI( EPSG_CODE_PARAMETER_ORDINATE_3_EVAL_POINT); + if (methodEPSGCode == + EPSG_CODE_METHOD_MOLODENSKY_BADEKAS_PV_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_MOLODENSKY_BADEKAS_CF_GEOGRAPHIC_2D) { + formatter->addStep("push"); + formatter->addParam("v_3"); + } + setupPROJGeodeticSourceCRS(formatter, sourceCRS(), "Molodensky-Badekas"); @@ -8273,6 +8305,14 @@ void Transformation::_exportToPROJString( setupPROJGeodeticTargetCRS(formatter, targetCRS(), "Molodensky-Badekas"); + if (methodEPSGCode == + EPSG_CODE_METHOD_MOLODENSKY_BADEKAS_PV_GEOGRAPHIC_2D || + methodEPSGCode == + EPSG_CODE_METHOD_MOLODENSKY_BADEKAS_CF_GEOGRAPHIC_2D) { + formatter->addStep("pop"); + formatter->addParam("v_3"); + } + return; } -- cgit v1.2.3