aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/operation/concatenatedoperation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/iso19111/operation/concatenatedoperation.cpp')
-rw-r--r--src/iso19111/operation/concatenatedoperation.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/iso19111/operation/concatenatedoperation.cpp b/src/iso19111/operation/concatenatedoperation.cpp
index a1c0dca8..ad2ab65b 100644
--- a/src/iso19111/operation/concatenatedoperation.cpp
+++ b/src/iso19111/operation/concatenatedoperation.cpp
@@ -48,6 +48,7 @@
#include "proj.h"
#include "proj_internal.h" // M_PI
// clang-format on
+#include "proj_constants.h"
#include "proj_json_streaming_writer.hpp"
@@ -341,6 +342,37 @@ void ConcatenatedOperation::fixStepsDirection(
if (l_sourceCRS && l_targetCRS) {
op->setCRSs(NN_NO_CHECK(l_sourceCRS), NN_NO_CHECK(l_targetCRS),
nullptr);
+ } else if (l_sourceCRS && l_targetCRS == nullptr &&
+ conv->method()->getEPSGCode() ==
+ EPSG_CODE_METHOD_HEIGHT_DEPTH_REVERSAL) {
+ // Needed for EPSG:7987 e.g.
+ auto vertCRS =
+ dynamic_cast<const crs::VerticalCRS *>(l_sourceCRS.get());
+ if (vertCRS && ends_with(l_sourceCRS->nameStr(), " height") &&
+ &vertCRS->coordinateSystem()->axisList()[0]->direction() ==
+ &cs::AxisDirection::UP) {
+ op->setCRSs(
+ NN_NO_CHECK(l_sourceCRS),
+ crs::VerticalCRS::create(
+ util::PropertyMap().set(
+ common::IdentifiedObject::NAME_KEY,
+ l_sourceCRS->nameStr().substr(
+ 0, l_sourceCRS->nameStr().size() -
+ strlen(" height")) +
+ " depth"),
+ vertCRS->datum(), vertCRS->datumEnsemble(),
+ cs::VerticalCS::create(
+ util::PropertyMap(),
+ cs::CoordinateSystemAxis::create(
+ util::PropertyMap().set(
+ common::IdentifiedObject::NAME_KEY,
+ "Gravity-related depth"),
+ "D", cs::AxisDirection::DOWN,
+ vertCRS->coordinateSystem()
+ ->axisList()[0]
+ ->unit()))),
+ nullptr);
+ }
}
} else if (!conv && l_sourceCRS && l_targetCRS) {