diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2019-11-28 18:54:17 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2019-11-28 18:54:17 +0100 |
| commit | cef7a8a209717938a08e909dcc03c05b09c5cd77 (patch) | |
| tree | 165cbf217185cd9d36c3636bc3f84a19ac900906 /src | |
| parent | b0983324c5ac3e2435a36a8aa5030c81f2ad779a (diff) | |
| download | PROJ-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.cpp | 18 |
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); } |
