From be7adb85aa92dd601a92313d5b725270596b1a95 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 13 Dec 2018 00:55:10 +0100 Subject: improve isEquivalentTo() when comparing Helmert transformations --- src/coordinateoperation.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/coordinateoperation.cpp') 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(this); + auto otherTransf = static_cast(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(this); + auto otherTransf = static_cast(otherSO); + auto params = transf->getTOWGS84Parameters(); + auto otherParams = otherTransf->getTOWGS84Parameters(); + return params == otherParams; + } + if (methodEPSGCode == EPSG_CODE_METHOD_LAMBERT_CONIC_CONFORMAL_1SP && otherMethodEPSGCode == -- cgit v1.2.3