aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-10-08 16:10:55 +0200
committerEven Rouault <even.rouault@spatialys.com>2020-10-08 17:31:57 +0200
commitacd1cf3278a532b56f3f621e27a8895b3db3cb75 (patch)
tree6c9bf16250dd7ba58b6f2b9ea7462d857ec43e72 /src
parent67af1d5741da08d9546b907e0da2c21c54c61b27 (diff)
downloadPROJ-acd1cf3278a532b56f3f621e27a8895b3db3cb75.tar.gz
PROJ-acd1cf3278a532b56f3f621e27a8895b3db3cb75.zip
Make GeographicCRS::is2DPartOf3D() work with DatumEnsemble
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/coordinateoperation.cpp4
-rw-r--r--src/iso19111/crs.cpp26
2 files changed, 12 insertions, 18 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index 30861be0..184ff435 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -14196,7 +14196,7 @@ void CoordinateOperationFactory::Private::createOperationsBoundToGeog(
if (hubSrcGeog && geogCRSOfBaseOfBoundSrc &&
(hubSrcGeog->_isEquivalentTo(
geogDst, util::IComparable::Criterion::EQUIVALENT) ||
- hubSrcGeog->is2DPartOf3D(NN_NO_CHECK(geogDst)))) {
+ hubSrcGeog->is2DPartOf3D(NN_NO_CHECK(geogDst), dbContext))) {
triedBoundCrsToGeogCRSSameAsHubCRS = true;
CoordinateOperationPtr opIntermediate;
@@ -14976,7 +14976,7 @@ void CoordinateOperationFactory::Private::createOperationsCompoundToGeog(
if (!foundRegisteredTransformWithAllGridsAvailable && srcGeogCRS &&
!srcGeogCRS->_isEquivalentTo(
geogDst, util::IComparable::Criterion::EQUIVALENT) &&
- !srcGeogCRS->is2DPartOf3D(NN_NO_CHECK(geogDst))) {
+ !srcGeogCRS->is2DPartOf3D(NN_NO_CHECK(geogDst), dbContext)) {
auto verticalTransformsTmp = createOperations(
componentsSrc[1],
NN_NO_CHECK(srcGeogCRS)
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp
index eb3918f7..134f6006 100644
--- a/src/iso19111/crs.cpp
+++ b/src/iso19111/crs.cpp
@@ -1006,7 +1006,8 @@ CRSNNPtr CRS::promoteTo3D(const std::string &newName,
if (firstResAxisList[2]->_isEquivalentTo(
verticalAxisIfNotAlreadyPresent.get(),
util::IComparable::Criterion::EQUIVALENT) &&
- geogCRS->is2DPartOf3D(NN_NO_CHECK(firstResGeog))) {
+ geogCRS->is2DPartOf3D(NN_NO_CHECK(firstResGeog),
+ dbContext)) {
return NN_NO_CHECK(
util::nn_dynamic_pointer_cast<CRS>(firstRes));
}
@@ -2371,7 +2372,8 @@ GeographicCRS::create(const util::PropertyMap &properties,
/** \brief Return whether the current GeographicCRS is the 2D part of the
* other 3D GeographicCRS.
*/
-bool GeographicCRS::is2DPartOf3D(util::nn<const GeographicCRS *> other)
+bool GeographicCRS::is2DPartOf3D(util::nn<const GeographicCRS *> other,
+ const io::DatabaseContextPtr &dbContext)
PROJ_PURE_DEFN {
const auto &axis = d->coordinateSystem_->axisList();
const auto &otherAxis = other->d->coordinateSystem_->axisList();
@@ -2389,19 +2391,10 @@ bool GeographicCRS::is2DPartOf3D(util::nn<const GeographicCRS *> other)
util::IComparable::Criterion::EQUIVALENT))) {
return false;
}
- const auto &thisDatum = GeodeticCRS::getPrivate()->datum_;
- const auto &otherDatum = other->GeodeticCRS::getPrivate()->datum_;
- if (thisDatum && otherDatum) {
- return thisDatum->_isEquivalentTo(
- otherDatum.get(), util::IComparable::Criterion::EQUIVALENT);
- }
- const auto &thisDatumEnsemble = datumEnsemble();
- const auto &otherDatumEnsemble = other->datumEnsemble();
- if (thisDatumEnsemble && otherDatumEnsemble) {
- return thisDatumEnsemble->_isEquivalentTo(
- otherDatumEnsemble.get(), util::IComparable::Criterion::EQUIVALENT);
- }
- return false;
+ const auto thisDatum = datumNonNull(dbContext);
+ const auto otherDatum = other->datumNonNull(dbContext);
+ return thisDatum->_isEquivalentTo(otherDatum.get(),
+ util::IComparable::Criterion::EQUIVALENT);
}
//! @endcond
@@ -2543,7 +2536,8 @@ GeographicCRS::demoteTo2D(const std::string &newName,
auto firstResAsGeogCRS =
util::nn_dynamic_pointer_cast<GeographicCRS>(firstRes);
if (firstResAsGeogCRS &&
- firstResAsGeogCRS->is2DPartOf3D(NN_NO_CHECK(this))) {
+ firstResAsGeogCRS->is2DPartOf3D(NN_NO_CHECK(this),
+ dbContext)) {
return NN_NO_CHECK(firstResAsGeogCRS);
}
}