aboutsummaryrefslogtreecommitdiff
path: root/src/coordinateoperation.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-13 00:55:10 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-13 00:55:10 +0100
commitbe7adb85aa92dd601a92313d5b725270596b1a95 (patch)
treee67af5c817e54aebed540876e185a1159a87eb09 /src/coordinateoperation.cpp
parentc566213d28d488df622eeebb52b9aa44fd231189 (diff)
downloadPROJ-be7adb85aa92dd601a92313d5b725270596b1a95.tar.gz
PROJ-be7adb85aa92dd601a92313d5b725270596b1a95.zip
improve isEquivalentTo() when comparing Helmert transformations
Diffstat (limited to 'src/coordinateoperation.cpp')
-rw-r--r--src/coordinateoperation.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/coordinateoperation.cpp b/src/coordinateoperation.cpp
index ac2c4196..ef03edf8 100644
--- a/src/coordinateoperation.cpp
+++ b/src/coordinateoperation.cpp
@@ -1463,6 +1463,57 @@ bool SingleOperation::_isEquivalentTo(
// Check it by using convertToOtherMethod()
const int otherMethodEPSGCode = otherSO->d->method_->getEPSGCode();
+
+ if ((methodEPSGCode ==
+ EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOCENTRIC &&
+ (otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_POSITION_VECTOR_GEOCENTRIC ||
+ otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_COORDINATE_FRAME_GEOCENTRIC)) ||
+ (methodEPSGCode ==
+ EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_2D &&
+ (otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_2D ||
+ otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_2D)) ||
+ (methodEPSGCode ==
+ EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_3D &&
+ (otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_3D ||
+ otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_3D))) {
+ auto transf = static_cast<const Transformation *>(this);
+ auto otherTransf = static_cast<const Transformation *>(otherSO);
+ auto params = transf->getTOWGS84Parameters();
+ auto otherParams = otherTransf->getTOWGS84Parameters();
+ return params == otherParams;
+ }
+
+ if ((otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOCENTRIC &&
+ (methodEPSGCode ==
+ EPSG_CODE_METHOD_POSITION_VECTOR_GEOCENTRIC ||
+ methodEPSGCode ==
+ EPSG_CODE_METHOD_COORDINATE_FRAME_GEOCENTRIC)) ||
+ (otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_2D &&
+ (methodEPSGCode ==
+ EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_2D ||
+ methodEPSGCode ==
+ EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_2D)) ||
+ (otherMethodEPSGCode ==
+ EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_3D &&
+ (methodEPSGCode ==
+ EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_3D ||
+ methodEPSGCode ==
+ EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_3D))) {
+ auto transf = static_cast<const Transformation *>(this);
+ auto otherTransf = static_cast<const Transformation *>(otherSO);
+ auto params = transf->getTOWGS84Parameters();
+ auto otherParams = otherTransf->getTOWGS84Parameters();
+ return params == otherParams;
+ }
+
if (methodEPSGCode ==
EPSG_CODE_METHOD_LAMBERT_CONIC_CONFORMAL_1SP &&
otherMethodEPSGCode ==