From 7f0946ab38ad7dd5077a3970e7ed5f647365fa7b Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 15 Sep 2021 00:28:25 +0200 Subject: isEquivalentTo(): improve comparison of datum names based on official name and aliases (preparation for EPSG v10.035 update) --- src/iso19111/datum.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/iso19111/datum.cpp') 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(other); if (otherGRF) { -- cgit v1.2.3