diff options
| author | Even Rouault <even.rouault@mines-paris.org> | 2019-03-29 11:26:14 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-03-29 11:26:14 +0100 |
| commit | a0dfcf28d3af1179847c75a2a8981cb7fe967ab8 (patch) | |
| tree | 32045f850d82858f3e63520da88e1fc85dc220f6 /src/iso19111/coordinateoperation.cpp | |
| parent | 8d7a01bc3d3d9662812242880b8ab1231d014edc (diff) | |
| parent | 5893c7ddef817df0c42c7ee636e6e083b0c65aed (diff) | |
| download | PROJ-a0dfcf28d3af1179847c75a2a8981cb7fe967ab8.tar.gz PROJ-a0dfcf28d3af1179847c75a2a8981cb7fe967ab8.zip | |
Merge pull request #1390 from rouault/createoperation_boundcrs_more_aggresive
createOperations(): improve BoundCRS<-->non-bound-CRS case
Diffstat (limited to 'src/iso19111/coordinateoperation.cpp')
| -rw-r--r-- | src/iso19111/coordinateoperation.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index 58e97272..24e5f8ab 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -11729,7 +11729,6 @@ CoordinateOperationFactory::Private::createOperations( return applyInverse(createOperations(targetCRS, sourceCRS, context)); } - // boundCRS to a geogCRS that is the same as the hubCRS auto boundSrc = dynamic_cast<const crs::BoundCRS *>(sourceCRS.get()); auto geogDst = dynamic_cast<const crs::GeographicCRS *>(targetCRS.get()); if (boundSrc && geogDst) { @@ -11738,6 +11737,7 @@ CoordinateOperationFactory::Private::createOperations( dynamic_cast<const crs::GeographicCRS *>(hubSrc.get()); auto geogCRSOfBaseOfBoundSrc = boundSrc->baseCRS()->extractGeographicCRS(); + // Is it: boundCRS to a geogCRS that is the same as the hubCRS ? if (hubSrcGeog && geogCRSOfBaseOfBoundSrc && (hubSrcGeog->_isEquivalentTo( geogDst, util::IComparable::Criterion::EQUIVALENT) || @@ -11855,6 +11855,35 @@ CoordinateOperationFactory::Private::createOperations( return res; } + if (hubSrcGeog && geogCRSOfBaseOfBoundSrc) { + // This one should go to the above 'Is it: boundCRS to a geogCRS + // that is the same as the hubCRS ?' case + auto opsFirst = createOperations(sourceCRS, hubSrc, context); + auto opsLast = createOperations(hubSrc, targetCRS, context); + if (!opsFirst.empty() && !opsLast.empty()) { + for (const auto &opFirst : opsFirst) { + for (const auto &opLast : opsLast) { + // Exclude artificial transformations from the hub + // to the target CRS + if (!opLast->hasBallparkTransformation()) { + try { + res.emplace_back( + ConcatenatedOperation:: + createComputeMetadata( + {opFirst, opLast}, + !allowEmptyIntersection)); + } catch ( + const InvalidOperationEmptyIntersection &) { + } + } + } + } + if (!res.empty()) { + return res; + } + } + } + return createOperations(boundSrc->baseCRS(), targetCRS, context); } |
