aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-08 23:16:31 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-08 23:35:41 +0100
commit9d60a52fdaf17a28235a3d7103b1757d7b59de03 (patch)
tree5814eb928b11dc5275929f7b8e4501ceef19feb1
parentcf21ff22f1c68a49199099dd027eadefc8301381 (diff)
downloadPROJ-9d60a52fdaf17a28235a3d7103b1757d7b59de03.tar.gz
PROJ-9d60a52fdaf17a28235a3d7103b1757d7b59de03.zip
Fix and speed-up one of the getMapping() functions
-rw-r--r--include/proj/internal/coordinateoperation_internal.hpp2
-rw-r--r--src/coordinateoperation.cpp36
2 files changed, 26 insertions, 12 deletions
diff --git a/include/proj/internal/coordinateoperation_internal.hpp b/include/proj/internal/coordinateoperation_internal.hpp
index bafc3a3b..d8c091d0 100644
--- a/include/proj/internal/coordinateoperation_internal.hpp
+++ b/include/proj/internal/coordinateoperation_internal.hpp
@@ -66,8 +66,6 @@ const MethodMapping *getMapping(const char *wkt2_name) noexcept;
const MethodMapping *getMapping(const OperationMethod *method) noexcept;
std::vector<const MethodMapping *>
getMappingsFromPROJName(const std::string &projName);
-const ParamMapping *getMapping(const MethodMapping *mapping,
- const OperationParameterValue *param);
const ParamMapping *getMappingFromWKT1(const MethodMapping *mapping,
const std::string &wkt1_name);
bool areEquivalentParameters(const std::string &a, const std::string &b);
diff --git a/src/coordinateoperation.cpp b/src/coordinateoperation.cpp
index 4ada57fb..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 &param_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 &param) {
+ // 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;
}