aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/coordinateoperation.cpp
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2019-02-14 08:48:39 +0100
committerGitHub <noreply@github.com>2019-02-14 08:48:39 +0100
commit8d9778af110ac05e14a4eaca7d9e6445bec4ee0b (patch)
treedf40192dee3b82c9718f32a822f3b501fc004dec /src/iso19111/coordinateoperation.cpp
parent4d1f5486f6453300bdb35c2607e126f6c526c243 (diff)
parent3211f11241a11cabd5fcba960f2aa0d4c6d54b41 (diff)
downloadPROJ-8d9778af110ac05e14a4eaca7d9e6445bec4ee0b.tar.gz
PROJ-8d9778af110ac05e14a4eaca7d9e6445bec4ee0b.zip
Merge pull request #1261 from rouault/make_iso19111_use_push_pop
EPSG Helmert and Molodensky-Badekas methods in the Geographic 2D domain: use the push/pop v_3 operator to preserve the Z component
Diffstat (limited to 'src/iso19111/coordinateoperation.cpp')
-rw-r--r--src/iso19111/coordinateoperation.cpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index d36d901f..14b1024d 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -5489,7 +5489,7 @@ void Conversion::_exportToPROJString(
if (isUTM(zone, north)) {
bConversionDone = true;
formatter->addStep("utm");
- if( useApprox ) {
+ if (useApprox) {
formatter->addParam("approx");
}
formatter->addParam("zone", zone);
@@ -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;
}