aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/crs.cpp42
-rw-r--r--src/iso19111/io.cpp10
-rw-r--r--src/iso19111/operation/conversion.cpp6
-rw-r--r--src/iso19111/operation/coordinateoperationfactory.cpp3
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();