aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/operation/concatenatedoperation.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-04-23 10:10:15 +0200
committerGitHub <noreply@github.com>2021-04-23 10:10:15 +0200
commit99939f327e91ba602843018af9bd4328b50821fe (patch)
tree6743cf5b5feab06004e85ff55f654cd1671a6dc9 /src/iso19111/operation/concatenatedoperation.cpp
parent81899cee1197e7bbd4558e9c7208eff8293789b5 (diff)
parentf6abb7d75c647013dd83a82361b96c202e615d90 (diff)
downloadPROJ-99939f327e91ba602843018af9bd4328b50821fe.tar.gz
PROJ-99939f327e91ba602843018af9bd4328b50821fe.zip
Merge pull request #2683 from rouault/epsg_10_019
Database: update to EPSG v10.019
Diffstat (limited to 'src/iso19111/operation/concatenatedoperation.cpp')
-rw-r--r--src/iso19111/operation/concatenatedoperation.cpp35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/iso19111/operation/concatenatedoperation.cpp b/src/iso19111/operation/concatenatedoperation.cpp
index ce4b015a..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"
@@ -321,7 +322,8 @@ void ConcatenatedOperation::fixStepsDirection(
if (l_sourceCRS) {
derivedCRS = dynamic_cast<const crs::DerivedCRS *>(
l_sourceCRS.get());
- if (conv->isEquivalentTo(
+ if (derivedCRS &&
+ conv->isEquivalentTo(
derivedCRS->derivingConversion().get(),
util::IComparable::Criterion::EQUIVALENT)) {
op->setCRSs(concatOpTargetCRS, NN_NO_CHECK(l_sourceCRS),
@@ -340,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) {