diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2018-12-09 19:49:25 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2018-12-09 19:49:25 +0100 |
| commit | 3945d99793709ba68b614fbdd24c1b9069be475b (patch) | |
| tree | 3d8a7bcefd22ef99da1fc97951ffa75ec75b36bc /src/coordinateoperation.cpp | |
| parent | 23127c01ad535902665a975da81e27c389bb7aeb (diff) | |
| parent | 9d60a52fdaf17a28235a3d7103b1757d7b59de03 (diff) | |
| download | PROJ-3945d99793709ba68b614fbdd24c1b9069be475b.tar.gz PROJ-3945d99793709ba68b614fbdd24c1b9069be475b.zip | |
Merge remote-tracking branch 'rouault/gdalbarn'
Diffstat (limited to 'src/coordinateoperation.cpp')
| -rw-r--r-- | src/coordinateoperation.cpp | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/src/coordinateoperation.cpp b/src/coordinateoperation.cpp index 8f75864e..3fa5ea9c 100644 --- a/src/coordinateoperation.cpp +++ b/src/coordinateoperation.cpp @@ -264,21 +264,37 @@ getMappingsFromPROJName(const std::string &projName) { // --------------------------------------------------------------------------- -const ParamMapping *getMapping(const MethodMapping *mapping, - const OperationParameterValue *param) { - const auto ¶m_name = param->parameter()->name(); - const std::string &name = *(param_name->description()); - const std::string &code = param_name->code(); - const int epsg_code = !code.empty() ? ::atoi(code.c_str()) : 0; +static const ParamMapping *getMapping(const MethodMapping *mapping, + const OperationParameterNNPtr ¶m) { + // First try with id + const int epsg_code = param->getEPSGCode(); + if (epsg_code) { + for (int i = 0; mapping->params[i] != nullptr; ++i) { + const auto *paramMapping = mapping->params[i]; + if (paramMapping->epsg_code == epsg_code) { + return paramMapping; + } + } + } + + // then equivalent name + const std::string &name = param->nameStr(); for (int i = 0; mapping->params[i] != nullptr; ++i) { const auto *paramMapping = mapping->params[i]; if (metadata::Identifier::isEquivalentName(paramMapping->wkt2_name, - name.c_str()) || - (epsg_code != 0 && paramMapping->epsg_code == epsg_code) || - areEquivalentParameters(paramMapping->wkt2_name, name)) { + name.c_str())) { + return paramMapping; + } + } + + // and finally different name, but equivalent parameter + for (int i = 0; mapping->params[i] != nullptr; ++i) { + const auto *paramMapping = mapping->params[i]; + if (areEquivalentParameters(paramMapping->wkt2_name, name)) { return paramMapping; } } + return nullptr; } @@ -1002,7 +1018,7 @@ void OperationParameterValue::_exportToWKT( void OperationParameterValue::_exportToWKT(io::WKTFormatter *formatter, const MethodMapping *mapping) const { const ParamMapping *paramMapping = - mapping ? getMapping(mapping, this) : nullptr; + mapping ? getMapping(mapping, d->parameter) : nullptr; if (paramMapping && paramMapping->wkt1_name == nullptr) { return; } @@ -9206,9 +9222,9 @@ static size_t getStepCount(const CoordinateOperationNNPtr &op) { // --------------------------------------------------------------------------- -struct FilterAndSort { +struct FilterResults { - FilterAndSort(const std::vector<CoordinateOperationNNPtr> &sourceListIn, + FilterResults(const std::vector<CoordinateOperationNNPtr> &sourceListIn, const CoordinateOperationContextNNPtr &contextIn, const crs::CRSNNPtr &sourceCRSIn, const crs::CRSNNPtr &targetCRSIn, @@ -9223,6 +9239,9 @@ struct FilterAndSort { computeAreaOfIntest(); filterOut(forceStrictContainmentTest); + } + + FilterResults &andSort() { sort(); // And now that we have a sorted list, we can remove uninteresting @@ -9232,6 +9251,7 @@ struct FilterAndSort { removeUninterestingOps(); removeDuplicateOps(); removeSyntheticNullTransforms(); + return *this; } // ---------------------------------------------------------------------- @@ -9646,7 +9666,8 @@ static std::vector<CoordinateOperationNNPtr> filterAndSort(const std::vector<CoordinateOperationNNPtr> &sourceList, const CoordinateOperationContextNNPtr &context, const crs::CRSNNPtr &sourceCRS, const crs::CRSNNPtr &targetCRS) { - return FilterAndSort(sourceList, context, sourceCRS, targetCRS, false) + return FilterResults(sourceList, context, sourceCRS, targetCRS, false) + .andSort() .getRes(); } //! @endcond @@ -10449,7 +10470,7 @@ createNullGeocentricTranslation(const crs::CRSNNPtr &sourceCRS, bool CoordinateOperationFactory::Private::hasPerfectAccuracyResult( const std::vector<CoordinateOperationNNPtr> &res, const Context &context) { - auto resTmp = FilterAndSort(res, context.context, context.sourceCRS, + auto resTmp = FilterResults(res, context.context, context.sourceCRS, context.targetCRS, true) .getRes(); for (const auto &op : resTmp) { |
