diff options
Diffstat (limited to 'src/iso19111/datum.cpp')
| -rw-r--r-- | src/iso19111/datum.cpp | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp index fbd4fd2d..7d42fd13 100644 --- a/src/iso19111/datum.cpp +++ b/src/iso19111/datum.cpp @@ -1581,8 +1581,7 @@ DatumEnsemble::DatumEnsemble(const std::vector<DatumNNPtr> &datumsIn, #ifdef notdef DatumEnsemble::DatumEnsemble(const DatumEnsemble &other) - : common::IdentifiedObject(other), - d(internal::make_unique<Private>(*other.d)) {} + : common::ObjectUsage(other), d(internal::make_unique<Private>(*other.d)) {} #endif // --------------------------------------------------------------------------- @@ -1621,16 +1620,83 @@ DatumEnsemble::positionalAccuracy() const { // --------------------------------------------------------------------------- //! @cond Doxygen_Suppress +DatumNNPtr +DatumEnsemble::asDatum(const io::DatabaseContextPtr &dbContext) const { + + const auto &l_datums = datums(); + auto *grf = dynamic_cast<const GeodeticReferenceFrame *>(l_datums[0].get()); + + const auto &l_identifiers = identifiers(); + if (dbContext) { + if (!l_identifiers.empty()) { + const auto &id = l_identifiers[0]; + try { + auto factory = io::AuthorityFactory::create( + NN_NO_CHECK(dbContext), *(id->codeSpace())); + if (grf) { + return factory->createGeodeticDatum(id->code()); + } else { + return factory->createVerticalDatum(id->code()); + } + } catch (const std::exception &) { + } + } + } + + std::string l_name(nameStr()); + if (grf) { + // Remap to traditional datum names + if (l_name == "World Geodetic System 1984 ensemble") { + l_name = "World Geodetic System 1984"; + } else if (l_name == + "European Terrestrial Reference System 1989 ensemble") { + l_name = "European Terrestrial Reference System 1989"; + } + } + auto props = + util::PropertyMap().set(common::IdentifiedObject::NAME_KEY, l_name); + if (isDeprecated()) { + props.set(common::IdentifiedObject::DEPRECATED_KEY, true); + } + if (!l_identifiers.empty()) { + const auto &id = l_identifiers[0]; + props.set(metadata::Identifier::CODESPACE_KEY, *(id->codeSpace())) + .set(metadata::Identifier::CODE_KEY, id->code()); + } + const auto &l_usages = domains(); + if (!l_usages.empty()) { + + auto array(util::ArrayOfBaseObject::create()); + for (const auto &usage : l_usages) { + array->add(usage); + } + props.set(common::ObjectUsage::OBJECT_DOMAIN_KEY, + util::nn_static_pointer_cast<util::BaseObject>(array)); + } + const auto anchor = util::optional<std::string>(); + + if (grf) { + return GeodeticReferenceFrame::create(props, grf->ellipsoid(), anchor, + grf->primeMeridian()); + } else { + assert(dynamic_cast<VerticalReferenceFrame *>(l_datums[0].get())); + return datum::VerticalReferenceFrame::create(props, anchor); + } +} +//! @endcond + +// --------------------------------------------------------------------------- + +//! @cond Doxygen_Suppress void DatumEnsemble::_exportToWKT( io::WKTFormatter *formatter) const // throw(FormattingException) { const bool isWKT2 = formatter->version() == io::WKTFormatter::Version::WKT2; if (!isWKT2 || !formatter->use2019Keywords()) { - throw io::FormattingException( - "DatumEnsemble can only be exported to WKT2:2019"); + return asDatum(formatter->databaseContext())->_exportToWKT(formatter); } - auto l_datums = datums(); + const auto &l_datums = datums(); assert(!l_datums.empty()); formatter->startNode(io::WKTConstants::ENSEMBLE, false); @@ -1687,7 +1753,7 @@ void DatumEnsemble::_exportToJSON( writer->Add(l_name); } - auto l_datums = datums(); + const auto &l_datums = datums(); writer->AddObjKey("members"); { auto membersContext(writer->MakeArrayContext(false)); |
