aboutsummaryrefslogtreecommitdiff
path: root/src/coordinateoperation.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-13 15:09:06 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-13 15:14:45 +0100
commit990d88b09839876598c954230ca66fb2604f7545 (patch)
treeea7faa82174a9c1dfdc5700d2d9b6315b93a4065 /src/coordinateoperation.cpp
parent37c7893bb460bb13673752673ece3f3d6933807d (diff)
downloadPROJ-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.cpp77
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 ==