aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/metadata.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-09-28 14:47:09 +0200
committerEven Rouault <even.rouault@spatialys.com>2021-09-28 14:47:09 +0200
commite6e6e4ca345e774910afa5bbe485c3d9f7851cd4 (patch)
treedd1cd3df30565228b932bbfc1d8d97e142111344 /src/iso19111/metadata.cpp
parentf982d9d3104731727c445930bf14008d1c572d0a (diff)
downloadPROJ-e6e6e4ca345e774910afa5bbe485c3d9f7851cd4.tar.gz
PROJ-e6e6e4ca345e774910afa5bbe485c3d9f7851cd4.zip
Add a mapping for versioned authorities, so that one can use IAU:xxxx or IAU_2015:xxxx transparently
Diffstat (limited to 'src/iso19111/metadata.cpp')
-rw-r--r--src/iso19111/metadata.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/iso19111/metadata.cpp b/src/iso19111/metadata.cpp
index fc1b103f..6c168152 100644
--- a/src/iso19111/metadata.cpp
+++ b/src/iso19111/metadata.cpp
@@ -1058,7 +1058,12 @@ const optional<std::string> &Identifier::uri() PROJ_PURE_DEFN {
void Identifier::_exportToWKT(WKTFormatter *formatter) const {
const bool isWKT2 = formatter->version() == WKTFormatter::Version::WKT2;
const std::string &l_code = code();
- const std::string &l_codeSpace = *codeSpace();
+ std::string l_codeSpace = *codeSpace();
+ std::string l_version = *version();
+ const auto &dbContext = formatter->databaseContext();
+ if (dbContext) {
+ dbContext->getAuthorityAndVersion(*codeSpace(), l_codeSpace, l_version);
+ }
if (!l_codeSpace.empty() && !l_code.empty()) {
if (isWKT2) {
formatter->startNode(WKTConstants::ID, false);
@@ -1069,8 +1074,7 @@ void Identifier::_exportToWKT(WKTFormatter *formatter) const {
} catch (const std::exception &) {
formatter->addQuotedString(l_code);
}
- if (version().has_value()) {
- auto l_version = *(version());
+ if (!l_version.empty()) {
try {
(void)c_locale_stod(l_version);
formatter->add(l_version);
@@ -1079,7 +1083,7 @@ void Identifier::_exportToWKT(WKTFormatter *formatter) const {
}
}
if (authority().has_value() &&
- *(authority()->title()) != l_codeSpace) {
+ *(authority()->title()) != *codeSpace()) {
formatter->startNode(WKTConstants::CITATION, false);
formatter->addQuotedString(*(authority()->title()));
formatter->endNode();
@@ -1103,7 +1107,12 @@ void Identifier::_exportToWKT(WKTFormatter *formatter) const {
void Identifier::_exportToJSON(JSONFormatter *formatter) const {
const std::string &l_code = code();
- const std::string &l_codeSpace = *codeSpace();
+ std::string l_codeSpace = *codeSpace();
+ std::string l_version = *version();
+ const auto &dbContext = formatter->databaseContext();
+ if (dbContext) {
+ dbContext->getAuthorityAndVersion(*codeSpace(), l_codeSpace, l_version);
+ }
if (!l_codeSpace.empty() && !l_code.empty()) {
auto writer = formatter->writer();
auto objContext(formatter->MakeObjectContext(nullptr, false));
@@ -1116,8 +1125,7 @@ void Identifier::_exportToJSON(JSONFormatter *formatter) const {
writer->Add(l_code);
}
- if (version().has_value()) {
- const auto l_version = *(version());
+ if (!l_version.empty()) {
writer->AddObjKey("version");
try {
const double dblVersion = c_locale_stod(l_version);
@@ -1132,7 +1140,8 @@ void Identifier::_exportToJSON(JSONFormatter *formatter) const {
writer->Add(l_version);
}
}
- if (authority().has_value() && *(authority()->title()) != l_codeSpace) {
+ if (authority().has_value() &&
+ *(authority()->title()) != *codeSpace()) {
writer->AddObjKey("authority_citation");
writer->Add(*(authority()->title()));
}