diff options
Diffstat (limited to 'src/iso19111/operation/concatenatedoperation.cpp')
| -rw-r--r-- | src/iso19111/operation/concatenatedoperation.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/iso19111/operation/concatenatedoperation.cpp b/src/iso19111/operation/concatenatedoperation.cpp index 20bbce6f..fda341dd 100644 --- a/src/iso19111/operation/concatenatedoperation.cpp +++ b/src/iso19111/operation/concatenatedoperation.cpp @@ -245,6 +245,34 @@ void ConcatenatedOperation::fixStepsDirection( return false; }; + // Special case for EPSG:9731 "ETRS89 to ETRS89 + Catania 1965 height (1)" + // which chains "ETRS89 to ETRS89 + Genoa 1942 height (1)" and + // "Genoa 1942 height to Catania 1965 height (1)" + if (operationsInOut.size() == 2 && isGeographic(concatOpSourceCRS.get())) { + const auto compoundTarget = + dynamic_cast<const crs::CompoundCRS *>(concatOpTargetCRS.get()); + const auto compoundTargetOp0 = dynamic_cast<const crs::CompoundCRS *>( + operationsInOut[0]->targetCRS().get()); + if (compoundTarget && compoundTargetOp0 && + operationsInOut[0]->sourceCRS() && + operationsInOut[1]->sourceCRS() && + operationsInOut[1]->targetCRS() && + concatOpSourceCRS->nameStr() == + compoundTarget->componentReferenceSystems()[0]->nameStr() && + concatOpSourceCRS->nameStr() == + operationsInOut[0]->sourceCRS()->nameStr() && + concatOpSourceCRS->nameStr() == + compoundTargetOp0->componentReferenceSystems()[0]->nameStr() && + compoundTargetOp0->componentReferenceSystems()[1]->nameStr() == + operationsInOut[1]->sourceCRS()->nameStr() && + operationsInOut[1]->targetCRS()->nameStr() == + compoundTarget->componentReferenceSystems()[1]->nameStr()) { + operationsInOut[1]->setCRSs( + NN_NO_CHECK(operationsInOut[0]->targetCRS()), concatOpTargetCRS, + nullptr); + } + } + for (size_t i = 0; i < operationsInOut.size(); ++i) { auto &op = operationsInOut[i]; auto l_sourceCRS = op->sourceCRS(); |
