aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-11-28 18:54:17 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-11-28 18:54:17 +0100
commitcef7a8a209717938a08e909dcc03c05b09c5cd77 (patch)
tree165cbf217185cd9d36c3636bc3f84a19ac900906 /src
parentb0983324c5ac3e2435a36a8aa5030c81f2ad779a (diff)
downloadPROJ-cef7a8a209717938a08e909dcc03c05b09c5cd77.tar.gz
PROJ-cef7a8a209717938a08e909dcc03c05b09c5cd77.zip
createOperations(): fix vertical to geographic when synthetizing an operation that involves a vertical axis reversal
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/coordinateoperation.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index e1430a85..27f11100 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -13817,13 +13817,22 @@ void CoordinateOperationFactory::Private::createOperationsVertToGeog(
}
}
- const double convSrc =
- vertSrc->coordinateSystem()->axisList()[0]->unit().conversionToSI();
+ const auto &srcAxis = vertSrc->coordinateSystem()->axisList()[0];
+ const double convSrc = srcAxis->unit().conversionToSI();
double convDst = 1.0;
const auto &geogAxis = geogDst->coordinateSystem()->axisList();
+ bool dstIsUp = true;
+ bool dstIsDown = true;
if (geogAxis.size() == 3) {
- convDst = geogAxis[2]->unit().conversionToSI();
+ const auto &dstAxis = geogAxis[2];
+ convDst = dstAxis->unit().conversionToSI();
+ dstIsUp = dstAxis->direction() == cs::AxisDirection::UP;
+ dstIsDown = dstAxis->direction() == cs::AxisDirection::DOWN;
}
+ const bool srcIsUp = srcAxis->direction() == cs::AxisDirection::UP;
+ const bool srcIsDown = srcAxis->direction() == cs::AxisDirection::DOWN;
+ const bool heightDepthReversal =
+ ((srcIsUp && dstIsDown) || (srcIsDown && dstIsUp));
const double factor = convSrc / convDst;
auto conv = Transformation::createChangeVerticalUnit(
@@ -13831,7 +13840,8 @@ void CoordinateOperationFactory::Private::createOperationsVertToGeog(
common::IdentifiedObject::NAME_KEY,
buildTransfName(sourceCRS->nameStr(), targetCRS->nameStr()) +
BALLPARK_VERTICAL_TRANSFORMATION_NO_ELLIPSOID_VERT_HEIGHT),
- sourceCRS, targetCRS, common::Scale(factor), {});
+ sourceCRS, targetCRS,
+ common::Scale(heightDepthReversal ? -factor : factor), {});
conv->setHasBallparkTransformation(true);
res.push_back(conv);
}