From 9a112931555aa324ed9caa3c261a4fd11551d615 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 22 Oct 2020 23:16:58 +0200 Subject: WKT1_ESRI export: generate VERTCS[...,DATUM[...,SPHEROID[]] syntax when ellipsoidal height is found --- src/iso19111/crs.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index 1a17ac67..4f9098f2 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -2853,9 +2853,9 @@ void VerticalCRS::_exportToWKT(io::WKTFormatter *formatter) const { !identifiers().empty()); auto l_name = nameStr(); + const auto &dbContext = formatter->databaseContext(); if (formatter->useESRIDialect()) { bool aliasFound = false; - const auto &dbContext = formatter->databaseContext(); if (dbContext) { auto l_alias = dbContext->getAliasFromOfficialName( l_name, "vertical_crs", "ESRI"); @@ -2870,7 +2870,34 @@ void VerticalCRS::_exportToWKT(io::WKTFormatter *formatter) const { } formatter->addQuotedString(l_name); - exportDatumOrDatumEnsembleToWkt(formatter); + + const auto l_datum = datum(); + if (formatter->useESRIDialect() && l_datum && + l_datum->getWKT1DatumType() == "2002") { + bool foundMatch = false; + if (dbContext) { + auto authFactory = io::AuthorityFactory::create( + NN_NO_CHECK(dbContext), std::string()); + auto list = authFactory->createObjectsFromName( + l_datum->nameStr(), + {io::AuthorityFactory::ObjectType::GEODETIC_REFERENCE_FRAME}, + false /* approximate=false*/); + if (!list.empty()) { + auto gdatum = + util::nn_dynamic_pointer_cast(list.front()); + if (gdatum) { + gdatum->_exportToWKT(formatter); + foundMatch = true; + } + } + } + if (!foundMatch) { + // We should export a geodetic datum, but we cannot really do better + l_datum->_exportToWKT(formatter); + } + } else { + exportDatumOrDatumEnsembleToWkt(formatter); + } const auto &cs = SingleCRS::getPrivate()->coordinateSystem; const auto &axisList = cs->axisList(); -- cgit v1.2.3