aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-09-16 12:01:39 +0200
committerGitHub <noreply@github.com>2021-09-16 12:01:39 +0200
commita3e412995df7dae2c8ef13d2682e03b770edcb75 (patch)
tree751cd21521ee33e002222b165c1938990d1b0bac /src
parente54739954db813cd8394066b1e64ae8f2dd76bd8 (diff)
parent85f496b26702bf6566296072795e821d70156c09 (diff)
downloadPROJ-a3e412995df7dae2c8ef13d2682e03b770edcb75.tar.gz
PROJ-a3e412995df7dae2c8ef13d2682e03b770edcb75.zip
Merge pull request #2851 from rouault/epsg_10_035
Database: update to EPSG v10.035
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/datum.cpp33
-rw-r--r--src/iso19111/factory.cpp23
-rw-r--r--src/iso19111/operation/coordinateoperationfactory.cpp8
3 files changed, 51 insertions, 13 deletions
diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp
index 96952866..ebef94a2 100644
--- a/src/iso19111/datum.cpp
+++ b/src/iso19111/datum.cpp
@@ -1401,17 +1401,32 @@ bool GeodeticReferenceFrame::hasEquivalentNameToUsingAlias(
if (dbContext) {
if (!identifiers().empty()) {
const auto &id = identifiers().front();
- auto aliasesResult =
+
+ const std::string officialNameFromId = dbContext->getName(
+ "geodetic_datum", *(id->codeSpace()), id->code());
+ const auto aliasesResult =
dbContext->getAliases(*(id->codeSpace()), id->code(), nameStr(),
"geodetic_datum", std::string());
- const char *otherName = other->nameStr().c_str();
- for (const auto &aliasResult : aliasesResult) {
- if (metadata::Identifier::isEquivalentName(
- otherName, aliasResult.c_str())) {
- return true;
- }
- }
- return false;
+
+ const auto isNameMatching =
+ [&aliasesResult, &officialNameFromId](const std::string &name) {
+ const char *nameCstr = name.c_str();
+ if (metadata::Identifier::isEquivalentName(
+ nameCstr, officialNameFromId.c_str())) {
+ return true;
+ } else {
+ for (const auto &aliasResult : aliasesResult) {
+ if (metadata::Identifier::isEquivalentName(
+ nameCstr, aliasResult.c_str())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ return isNameMatching(nameStr()) &&
+ isNameMatching(other->nameStr());
} else if (!other->identifiers().empty()) {
auto otherGRF = dynamic_cast<const GeodeticReferenceFrame *>(other);
if (otherGRF) {
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp
index 4ea9d2ad..f4228532 100644
--- a/src/iso19111/factory.cpp
+++ b/src/iso19111/factory.cpp
@@ -3430,6 +3430,29 @@ std::list<std::string> DatabaseContext::getAliases(
// ---------------------------------------------------------------------------
+/** \brief Return the 'name' column of a table for an object
+ *
+ * @param tableName Table name/category.
+ * @param authName Authority name of the object.
+ * @param code Code of the object
+ * @return Name (or empty)
+ * @throw FactoryException
+ */
+std::string DatabaseContext::getName(const std::string &tableName,
+ const std::string &authName,
+ const std::string &code) const {
+ std::string sql("SELECT name FROM \"");
+ sql += replaceAll(tableName, "\"", "\"\"");
+ sql += "\" WHERE auth_name = ? AND code = ?";
+ auto res = d->run(sql, {authName, code});
+ if (res.empty()) {
+ return std::string();
+ }
+ return res.front()[0];
+}
+
+// ---------------------------------------------------------------------------
+
/** \brief Return the 'text_definition' column of a table for an object
*
* @param tableName Table name/category.
diff --git a/src/iso19111/operation/coordinateoperationfactory.cpp b/src/iso19111/operation/coordinateoperationfactory.cpp
index 1b1cae9b..b59eeb91 100644
--- a/src/iso19111/operation/coordinateoperationfactory.cpp
+++ b/src/iso19111/operation/coordinateoperationfactory.cpp
@@ -883,12 +883,12 @@ struct SortFunction {
b_name.find("NTF (Paris) to NTF (1)") != std::string::npos) {
return false;
}
- if (a_name.find("NTF (Paris) to RGF93 (1)") != std::string::npos &&
- b_name.find("NTF (Paris) to RGF93 (2)") != std::string::npos) {
+ if (a_name.find("NTF (Paris) to RGF93 v1 (1)") != std::string::npos &&
+ b_name.find("NTF (Paris) to RGF93 v1 (2)") != std::string::npos) {
return true;
}
- if (a_name.find("NTF (Paris) to RGF93 (2)") != std::string::npos &&
- b_name.find("NTF (Paris) to RGF93 (1)") != std::string::npos) {
+ if (a_name.find("NTF (Paris) to RGF93 v1 (2)") != std::string::npos &&
+ b_name.find("NTF (Paris) to RGF93 v1 (1)") != std::string::npos) {
return false;
}