diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2018-12-13 15:09:06 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2018-12-13 15:14:45 +0100 |
| commit | 990d88b09839876598c954230ca66fb2604f7545 (patch) | |
| tree | ea7faa82174a9c1dfdc5700d2d9b6315b93a4065 /src/coordinateoperation.cpp | |
| parent | 37c7893bb460bb13673752673ece3f3d6933807d (diff) | |
| download | PROJ-990d88b09839876598c954230ca66fb2604f7545.tar.gz PROJ-990d88b09839876598c954230ca66fb2604f7545.zip | |
another improvement in isEquivalentTo() when comparing Helmert transformations
Diffstat (limited to 'src/coordinateoperation.cpp')
| -rw-r--r-- | src/coordinateoperation.cpp | 77 |
1 files changed, 31 insertions, 46 deletions
diff --git a/src/coordinateoperation.cpp b/src/coordinateoperation.cpp index 90854d2e..a1f305bf 100644 --- a/src/coordinateoperation.cpp +++ b/src/coordinateoperation.cpp @@ -1510,59 +1510,44 @@ bool SingleOperation::_isEquivalentTo(const util::IComparable *other, if (!equivalentMethods) { if (criterion == util::IComparable::Criterion::EQUIVALENT) { - // _1SP methods can sometimes be equivalent to _2SP ones - // Check it by using convertToOtherMethod() - 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))) { + const auto isTOWGS84Transf = [](int code) { + return code == + EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOCENTRIC || + code == EPSG_CODE_METHOD_POSITION_VECTOR_GEOCENTRIC || + code == EPSG_CODE_METHOD_COORDINATE_FRAME_GEOCENTRIC || + code == + EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_2D || + code == EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_2D || + code == + EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_2D || + code == + EPSG_CODE_METHOD_GEOCENTRIC_TRANSLATION_GEOGRAPHIC_3D || + code == EPSG_CODE_METHOD_POSITION_VECTOR_GEOGRAPHIC_3D || + code == EPSG_CODE_METHOD_COORDINATE_FRAME_GEOGRAPHIC_3D; + }; + + // Translation vs (PV or CF) + // or different PV vs CF convention + if (isTOWGS84Transf(methodEPSGCode) && + isTOWGS84Transf(otherMethodEPSGCode)) { 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; + assert(params.size() == 7); + assert(otherParams.size() == 7); + for (size_t i = 0; i < 7; i++) { + if (std::fabs(params[i] - otherParams[i]) > + 1e-10 * std::fabs(params[i])) { + return false; + } + } + return true; } + // _1SP methods can sometimes be equivalent to _2SP ones + // Check it by using convertToOtherMethod() if (methodEPSGCode == EPSG_CODE_METHOD_LAMBERT_CONIC_CONFORMAL_1SP && otherMethodEPSGCode == |
