diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/coordinateoperation.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index 56a3b38c..bf3b5146 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -10267,6 +10267,7 @@ CoordinateOperationPtr CoordinateOperationFactory::createOperation( struct PrecomputedOpCharacteristics { double area_{}; double accuracy_{}; + bool isPROJExportable_ = false; bool hasGrids_ = false; bool gridsAvailable_ = false; bool gridsKnown_ = false; @@ -10275,13 +10276,14 @@ struct PrecomputedOpCharacteristics { bool isNullTransformation_ = false; PrecomputedOpCharacteristics() = default; - PrecomputedOpCharacteristics(double area, double accuracy, bool hasGrids, + PrecomputedOpCharacteristics(double area, double accuracy, + bool isPROJExportable, bool hasGrids, bool gridsAvailable, bool gridsKnown, size_t stepCount, bool isApprox, bool isNullTransformation) - : area_(area), accuracy_(accuracy), hasGrids_(hasGrids), - gridsAvailable_(gridsAvailable), gridsKnown_(gridsKnown), - stepCount_(stepCount), isApprox_(isApprox), + : area_(area), accuracy_(accuracy), isPROJExportable_(isPROJExportable), + hasGrids_(hasGrids), gridsAvailable_(gridsAvailable), + gridsKnown_(gridsKnown), stepCount_(stepCount), isApprox_(isApprox), isNullTransformation_(isNullTransformation) {} }; @@ -10309,6 +10311,15 @@ struct SortFunction { // CAUTION: the order of the comparisons is extremely important // to get the intended result. + if (iterA->second.isPROJExportable_ && + !iterB->second.isPROJExportable_) { + return true; + } + if (!iterA->second.isPROJExportable_ && + iterB->second.isPROJExportable_) { + return false; + } + if (!iterA->second.isApprox_ && iterB->second.isApprox_) { return true; } @@ -10686,9 +10697,21 @@ struct FilterResults { std::string::npos || op->nameStr().find(BALLPARK_GEOCENTRIC_TRANSLATION) != std::string::npos; + + bool isPROJExportable = false; + auto formatter = io::PROJStringFormatter::create(); + try { + op->exportToPROJString(formatter.get()); + // Grids might be missing, but at least this is something + // PROJ could potentially process + isPROJExportable = true; + } catch (const std::exception &) { + } + map[op.get()] = PrecomputedOpCharacteristics( - area, getAccuracy(op), hasGrids, gridsAvailable, gridsKnown, - stepCount, isApprox, isNullTransformation); + area, getAccuracy(op), isPROJExportable, hasGrids, + gridsAvailable, gridsKnown, stepCount, isApprox, + isNullTransformation); } // Sort ! |
