aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2022-03-16 14:00:35 +0100
committergithub-actions[bot] <github-actions[bot]@users.noreply.github.com>2022-03-16 13:01:01 +0000
commit9296f97e45ace4afb574f93af8de0734cc34eae1 (patch)
tree427524ce97649db5fc9e014acc0d790911837255 /src/iso19111
parentcd8609b915bbcd2fe6948dbc30e248fb5dcefb55 (diff)
downloadPROJ-9296f97e45ace4afb574f93af8de0734cc34eae1.tar.gz
PROJ-9296f97e45ace4afb574f93af8de0734cc34eae1.zip
Merge pull request #3118 from rouault/dynamic_datum_isequivalentto
Fix comparison of GeodeticRefrenceFrame vs DynamicGeodeticReferenceFrame
Diffstat (limited to 'src/iso19111')
-rw-r--r--src/iso19111/datum.cpp61
1 files changed, 53 insertions, 8 deletions
diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp
index 7c76061e..758eaec3 100644
--- a/src/iso19111/datum.cpp
+++ b/src/iso19111/datum.cpp
@@ -1414,7 +1414,8 @@ void GeodeticReferenceFrame::_exportToJSON(
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
-bool GeodeticReferenceFrame::_isEquivalentTo(
+
+bool GeodeticReferenceFrame::isEquivalentToNoExactTypeCheck(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
auto otherGRF = dynamic_cast<const GeodeticReferenceFrame *>(other);
@@ -1427,6 +1428,19 @@ bool GeodeticReferenceFrame::_isEquivalentTo(
ellipsoid()->_isEquivalentTo(otherGRF->ellipsoid().get(), criterion,
dbContext);
}
+
+// ---------------------------------------------------------------------------
+
+bool GeodeticReferenceFrame::_isEquivalentTo(
+ const util::IComparable *other, util::IComparable::Criterion criterion,
+ const io::DatabaseContextPtr &dbContext) const {
+ if (criterion == Criterion::STRICT &&
+ !util::isOfExactType<GeodeticReferenceFrame>(*other)) {
+ return false;
+ }
+ return isEquivalentToNoExactTypeCheck(other, criterion, dbContext);
+}
+
//! @endcond
// ---------------------------------------------------------------------------
@@ -1558,11 +1572,20 @@ DynamicGeodeticReferenceFrame::deformationModelName() const {
bool DynamicGeodeticReferenceFrame::_isEquivalentTo(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
- auto otherDGRF = dynamic_cast<const DynamicGeodeticReferenceFrame *>(other);
- if (otherDGRF == nullptr ||
- !GeodeticReferenceFrame::_isEquivalentTo(other, criterion, dbContext)) {
+ if (criterion == Criterion::STRICT &&
+ !util::isOfExactType<DynamicGeodeticReferenceFrame>(*other)) {
return false;
}
+ if (!GeodeticReferenceFrame::isEquivalentToNoExactTypeCheck(
+ other, criterion, dbContext)) {
+ return false;
+ }
+ auto otherDGRF = dynamic_cast<const DynamicGeodeticReferenceFrame *>(other);
+ if (otherDGRF == nullptr) {
+ // we can go here only if criterion != Criterion::STRICT, and thus
+ // given the above check we can consider the objects equivalent.
+ return true;
+ }
return frameReferenceEpoch()._isEquivalentTo(
otherDGRF->frameReferenceEpoch(), criterion) &&
metadata::Identifier::isEquivalentName(
@@ -2101,7 +2124,7 @@ void VerticalReferenceFrame::_exportToJSON(
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
-bool VerticalReferenceFrame::_isEquivalentTo(
+bool VerticalReferenceFrame::isEquivalentToNoExactTypeCheck(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
auto otherVRF = dynamic_cast<const VerticalReferenceFrame *>(other);
@@ -2121,6 +2144,19 @@ bool VerticalReferenceFrame::_isEquivalentTo(
}
return true;
}
+
+// ---------------------------------------------------------------------------
+
+bool VerticalReferenceFrame::_isEquivalentTo(
+ const util::IComparable *other, util::IComparable::Criterion criterion,
+ const io::DatabaseContextPtr &dbContext) const {
+ if (criterion == Criterion::STRICT &&
+ !util::isOfExactType<VerticalReferenceFrame>(*other)) {
+ return false;
+ }
+ return isEquivalentToNoExactTypeCheck(other, criterion, dbContext);
+}
+
//! @endcond
// ---------------------------------------------------------------------------
@@ -2195,11 +2231,20 @@ DynamicVerticalReferenceFrame::deformationModelName() const {
bool DynamicVerticalReferenceFrame::_isEquivalentTo(
const util::IComparable *other, util::IComparable::Criterion criterion,
const io::DatabaseContextPtr &dbContext) const {
- auto otherDGRF = dynamic_cast<const DynamicVerticalReferenceFrame *>(other);
- if (otherDGRF == nullptr ||
- !VerticalReferenceFrame::_isEquivalentTo(other, criterion, dbContext)) {
+ if (criterion == Criterion::STRICT &&
+ !util::isOfExactType<DynamicVerticalReferenceFrame>(*other)) {
return false;
}
+ if (!VerticalReferenceFrame::isEquivalentToNoExactTypeCheck(
+ other, criterion, dbContext)) {
+ return false;
+ }
+ auto otherDGRF = dynamic_cast<const DynamicVerticalReferenceFrame *>(other);
+ if (otherDGRF == nullptr) {
+ // we can go here only if criterion != Criterion::STRICT, and thus
+ // given the above check we can consider the objects equivalent.
+ return true;
+ }
return frameReferenceEpoch()._isEquivalentTo(
otherDGRF->frameReferenceEpoch(), criterion) &&
metadata::Identifier::isEquivalentName(