diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/crs.cpp | 42 | ||||
| -rw-r--r-- | src/iso19111/io.cpp | 10 | ||||
| -rw-r--r-- | src/iso19111/operation/conversion.cpp | 6 | ||||
| -rw-r--r-- | src/iso19111/operation/coordinateoperationfactory.cpp | 3 |
4 files changed, 49 insertions, 12 deletions
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index 2ea8393c..4750896a 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -98,20 +98,36 @@ struct CRS::Private { BoundCRSPtr canonicalBoundCRS_{}; std::string extensionProj4_{}; bool implicitCS_ = false; + bool over_ = false; bool allowNonConformantWKT1Export_ = false; // for what was initially a COMPD_CS with a VERT_CS with a datum type == // ellipsoidal height / 2002 CompoundCRSPtr originalCompoundCRS_{}; - void setImplicitCS(const util::PropertyMap &properties) { - const auto pVal = properties.get("IMPLICIT_CS"); - if (pVal) { - if (const auto genVal = - dynamic_cast<const util::BoxedValue *>(pVal->get())) { - if (genVal->type() == util::BoxedValue::Type::BOOLEAN && - genVal->booleanValue()) { - implicitCS_ = true; + void setNonStandardProperties(const util::PropertyMap &properties) { + { + const auto pVal = properties.get("IMPLICIT_CS"); + if (pVal) { + if (const auto genVal = + dynamic_cast<const util::BoxedValue *>(pVal->get())) { + if (genVal->type() == util::BoxedValue::Type::BOOLEAN && + genVal->booleanValue()) { + implicitCS_ = true; + } + } + } + } + + { + const auto pVal = properties.get("OVER"); + if (pVal) { + if (const auto genVal = + dynamic_cast<const util::BoxedValue *>(pVal->get())) { + if (genVal->type() == util::BoxedValue::Type::BOOLEAN && + genVal->booleanValue()) { + over_ = true; + } } } } @@ -142,6 +158,9 @@ CRS::~CRS() = default; * (e.g from ESRI WKT) */ bool CRS::hasImplicitCS() const { return d->implicitCS_; } +/** \brief Return whether the CRS has a +over flag */ +bool CRS::hasOver() const { return d->over_; } + //! @endcond // --------------------------------------------------------------------------- @@ -2854,7 +2873,7 @@ GeographicCRS::create(const util::PropertyMap &properties, GeographicCRS::nn_make_shared<GeographicCRS>(datum, datumEnsemble, cs)); crs->assignSelf(crs); crs->setProperties(properties); - crs->CRS::getPrivate()->setImplicitCS(properties); + crs->CRS::getPrivate()->setNonStandardProperties(properties); return crs; } @@ -3122,6 +3141,9 @@ void GeographicCRS::_exportToPROJString( if (!formatter->getCRSExport()) { addAngularUnitConvertAndAxisSwap(formatter); } + if (hasOver()) { + formatter->addParam("over"); + } } //! @endcond @@ -4298,7 +4320,7 @@ ProjectedCRS::create(const util::PropertyMap &properties, crs->assignSelf(crs); crs->setProperties(properties); crs->setDerivingConversionCRS(); - crs->CRS::getPrivate()->setImplicitCS(properties); + crs->CRS::getPrivate()->setNonStandardProperties(properties); return crs; } diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index a7fedb91..f047ef3e 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -10489,9 +10489,12 @@ PROJStringParser::createFromPROJString(const std::string &projString) { auto crs = dynamic_cast<CRS *>(obj.get()); bool hasSignificantParamValues = false; + bool hasOver = false; for (const auto &kv : d->steps_[0].paramValues) { - if (!((kv.key == "type" && kv.value == "crs") || - kv.key == "wktext" || kv.key == "no_defs")) { + if (kv.key == "over") { + hasOver = true; + } else if (!((kv.key == "type" && kv.value == "crs") || + kv.key == "wktext" || kv.key == "no_defs")) { hasSignificantParamValues = true; break; } @@ -10502,6 +10505,9 @@ PROJStringParser::createFromPROJString(const std::string &projString) { properties.set(IdentifiedObject::NAME_KEY, d->title_.empty() ? crs->nameStr() : d->title_); + if (hasOver) { + properties.set("OVER", true); + } const auto &extent = getExtent(crs); if (extent) { properties.set( diff --git a/src/iso19111/operation/conversion.cpp b/src/iso19111/operation/conversion.cpp index 21052a07..39c21439 100644 --- a/src/iso19111/operation/conversion.cpp +++ b/src/iso19111/operation/conversion.cpp @@ -3320,6 +3320,9 @@ static bool createPROJ4WebMercator(const Conversion *conv, formatter->addParam("k", 1.0); formatter->addParam("units", units); formatter->addParam("nadgrids", "@null"); + if (targetProjCRS && targetProjCRS->hasOver()) { + formatter->addParam("over"); + } formatter->addParam("wktext"); formatter->addParam("no_defs"); return true; @@ -4095,6 +4098,9 @@ void Conversion::_exportToPROJString( formatter->pushOmitZUnitConversion(); projCRS->addUnitConvertAndAxisSwap(formatter, bAxisSpecFound); formatter->popOmitZUnitConversion(); + if (projCRS->hasOver()) { + formatter->addParam("over"); + } } auto derivedGeographicCRS = diff --git a/src/iso19111/operation/coordinateoperationfactory.cpp b/src/iso19111/operation/coordinateoperationfactory.cpp index e13d4071..6b7d4d20 100644 --- a/src/iso19111/operation/coordinateoperationfactory.cpp +++ b/src/iso19111/operation/coordinateoperationfactory.cpp @@ -5645,6 +5645,9 @@ namespace crs { crs::CRSNNPtr CRS::getResolvedCRS(const crs::CRSNNPtr &crs, const io::AuthorityFactoryPtr &authFactory, metadata::ExtentPtr &extentOut) { + if (crs->hasOver()) { + return crs; + } const auto &ids = crs->identifiers(); const auto &name = crs->nameStr(); |
