Skip to content

Commit

Permalink
Merge 09db482 into 6677479
Browse files Browse the repository at this point in the history
  • Loading branch information
rouault committed Mar 25, 2019
2 parents 6677479 + 09db482 commit d19107a
Show file tree
Hide file tree
Showing 11 changed files with 333 additions and 94 deletions.
2 changes: 1 addition & 1 deletion include/proj/crs.hpp
Expand Up @@ -503,7 +503,7 @@ class PROJ_GCC_DLL DerivedCRS : virtual public SingleCRS {
PROJ_INTERNAL void setDerivingConversionCRS();

PROJ_INTERNAL void baseExportToWKT(
io::WKTFormatter *&formatter, const std::string &keyword,
io::WKTFormatter *formatter, const std::string &keyword,
const std::string &baseKeyword) const; // throw(FormattingException)

PROJ_INTERNAL bool
Expand Down
12 changes: 10 additions & 2 deletions include/proj/io.hpp
Expand Up @@ -195,8 +195,7 @@ class PROJ_GCC_DLL WKTFormatter {
WKT2_2018_SIMPLIFIED,

/** WKT1 as traditionally output by GDAL, deriving from OGC 01-009.
A notable departuPROJ_GCC_DLLre from WKT1_GDAL with respect to OGC
01-009 is
A notable departure from WKT1_GDAL with respect to OGC 01-009 is
that in WKT1_GDAL, the unit of the PRIMEM value is always degrees.
*/
WKT1_GDAL,
Expand Down Expand Up @@ -262,6 +261,13 @@ class PROJ_GCC_DLL WKTFormatter {
PROJ_INTERNAL void popOutputId();
PROJ_INTERNAL bool outputId() const;

PROJ_INTERNAL void pushHasId(bool hasId);
PROJ_INTERNAL void popHasId();

PROJ_INTERNAL void pushDisableUsage();
PROJ_INTERNAL void popDisableUsage();
PROJ_INTERNAL bool outputUsage() const;

PROJ_INTERNAL void
pushAxisLinearUnit(const common::UnitOfMeasureNNPtr &unit);
PROJ_INTERNAL void popAxisLinearUnit();
Expand Down Expand Up @@ -303,6 +309,8 @@ class PROJ_GCC_DLL WKTFormatter {
PROJ_INTERNAL bool primeMeridianOrParameterUnitOmittedIfSameAsAxis() const;
PROJ_INTERNAL bool primeMeridianInDegree() const;
PROJ_INTERNAL bool outputCSUnitOnlyOnceIfSame() const;
PROJ_INTERNAL bool idOnTopLevelOnly() const;
PROJ_INTERNAL bool topLevelHasId() const;

/** WKT version. */
enum class Version {
Expand Down
2 changes: 1 addition & 1 deletion src/iso19111/common.cpp
Expand Up @@ -1073,7 +1073,7 @@ void ObjectUsage::setProperties(

void ObjectUsage::baseExportToWKT(WKTFormatter *formatter) const {
const bool isWKT2 = formatter->version() == WKTFormatter::Version::WKT2;
if (isWKT2 && formatter->outputId()) {
if (isWKT2 && formatter->outputUsage()) {
auto l_domains = domains();
if (!l_domains.empty()) {
if (formatter->use2018Keywords()) {
Expand Down
88 changes: 69 additions & 19 deletions src/iso19111/coordinateoperation.cpp
Expand Up @@ -7639,6 +7639,53 @@ void Transformation::_exportToWKT(io::WKTFormatter *formatter) const {

// ---------------------------------------------------------------------------

static void exportSourceCRSAndTargetCRSToWKT(const CoordinateOperation *co,
io::WKTFormatter *formatter) {
auto l_sourceCRS = co->sourceCRS();
assert(l_sourceCRS);
auto l_targetCRS = co->targetCRS();
assert(l_targetCRS);
const bool isWKT2 = formatter->version() == io::WKTFormatter::Version::WKT2;
const bool canExportCRSId =
(isWKT2 && formatter->use2018Keywords() &&
!(formatter->idOnTopLevelOnly() && formatter->topLevelHasId()));

const bool hasDomains = !co->domains().empty();
if (hasDomains) {
formatter->pushDisableUsage();
}

formatter->startNode(io::WKTConstants::SOURCECRS, false);
if (canExportCRSId && !l_sourceCRS->identifiers().empty()) {
// fake that top node has no id, so that the sourceCRS id is
// considered
formatter->pushHasId(false);
l_sourceCRS->_exportToWKT(formatter);
formatter->popHasId();
} else {
l_sourceCRS->_exportToWKT(formatter);
}
formatter->endNode();

formatter->startNode(io::WKTConstants::TARGETCRS, false);
if (canExportCRSId && !l_targetCRS->identifiers().empty()) {
// fake that top node has no id, so that the targetCRS id is
// considered
formatter->pushHasId(false);
l_targetCRS->_exportToWKT(formatter);
formatter->popHasId();
} else {
l_targetCRS->_exportToWKT(formatter);
}
formatter->endNode();

if (hasDomains) {
formatter->popDisableUsage();
}
}

// ---------------------------------------------------------------------------

void SingleOperation::exportTransformationToWKT(
io::WKTFormatter *formatter) const {
const bool isWKT2 = formatter->version() == io::WKTFormatter::Version::WKT2;
Expand All @@ -7647,11 +7694,6 @@ void SingleOperation::exportTransformationToWKT(
"Transformation can only be exported to WKT2");
}

auto l_sourceCRS = sourceCRS();
assert(l_sourceCRS);
auto l_targetCRS = targetCRS();
assert(l_targetCRS);

if (formatter->abridgedTransformation()) {
formatter->startNode(io::WKTConstants::ABRIDGEDTRANSFORMATION,
!identifiers().empty());
Expand All @@ -7672,13 +7714,7 @@ void SingleOperation::exportTransformationToWKT(
}

if (!formatter->abridgedTransformation()) {
formatter->startNode(io::WKTConstants::SOURCECRS, false);
l_sourceCRS->_exportToWKT(formatter);
formatter->endNode();

formatter->startNode(io::WKTConstants::TARGETCRS, false);
l_targetCRS->_exportToWKT(formatter);
formatter->endNode();
exportSourceCRSAndTargetCRSToWKT(this, formatter);
}

method()->_exportToWKT(formatter);
Expand Down Expand Up @@ -9337,20 +9373,34 @@ void ConcatenatedOperation::_exportToWKT(io::WKTFormatter *formatter) const {
}
}

formatter->startNode(io::WKTConstants::SOURCECRS, false);
sourceCRS()->_exportToWKT(formatter);
formatter->endNode();
exportSourceCRSAndTargetCRSToWKT(this, formatter);

formatter->startNode(io::WKTConstants::TARGETCRS, false);
targetCRS()->_exportToWKT(formatter);
formatter->endNode();
const bool canExportOperationId =
!(formatter->idOnTopLevelOnly() && formatter->topLevelHasId());

const bool hasDomains = !domains().empty();
if (hasDomains) {
formatter->pushDisableUsage();
}

for (const auto &operation : operations()) {
formatter->startNode(io::WKTConstants::STEP, false);
operation->_exportToWKT(formatter);
if (canExportOperationId && !operation->identifiers().empty()) {
// fake that top node has no id, so that the operation id is
// considered
formatter->pushHasId(false);
operation->_exportToWKT(formatter);
formatter->popHasId();
} else {
operation->_exportToWKT(formatter);
}
formatter->endNode();
}

if (hasDomains) {
formatter->popDisableUsage();
}

ObjectUsage::baseExportToWKT(formatter);
formatter->endNode();
}
Expand Down
17 changes: 13 additions & 4 deletions src/iso19111/crs.cpp
Expand Up @@ -2421,16 +2421,21 @@ void DerivedCRS::setDerivingConversionCRS() {

// ---------------------------------------------------------------------------

void DerivedCRS::baseExportToWKT(io::WKTFormatter *&formatter,
void DerivedCRS::baseExportToWKT(io::WKTFormatter *formatter,
const std::string &keyword,
const std::string &baseKeyword) const {
formatter->startNode(keyword, !identifiers().empty());
formatter->addQuotedString(nameStr());

const auto &l_baseCRS = d->baseCRS_;
formatter->startNode(baseKeyword, !l_baseCRS->identifiers().empty());
formatter->startNode(baseKeyword, formatter->use2018Keywords() &&
!l_baseCRS->identifiers().empty());
formatter->addQuotedString(l_baseCRS->nameStr());
l_baseCRS->exportDatumOrDatumEnsembleToWkt(formatter);
if (formatter->use2018Keywords() &&
!(formatter->idOnTopLevelOnly() && formatter->topLevelHasId())) {
l_baseCRS->formatID(formatter);
}
formatter->endNode();

formatter->setUseDerivingConversion(true);
Expand Down Expand Up @@ -2658,7 +2663,7 @@ void ProjectedCRS::_exportToWKT(io::WKTFormatter *formatter) const {
dynamic_cast<const GeographicCRS *>(l_baseCRS.get()))
? io::WKTConstants::BASEGEOGCRS
: io::WKTConstants::BASEGEODCRS,
!l_baseCRS->identifiers().empty());
formatter->use2018Keywords() && !l_baseCRS->identifiers().empty());
formatter->addQuotedString(l_baseCRS->nameStr());
l_baseCRS->exportDatumOrDatumEnsembleToWkt(formatter);
// insert ellipsoidal cs unit when the units of the map
Expand All @@ -2669,6 +2674,10 @@ void ProjectedCRS::_exportToWKT(io::WKTFormatter *formatter) const {
geodeticCRSAxisList[0]->unit()._exportToWKT(formatter);
}
l_baseCRS->primeMeridian()->_exportToWKT(formatter);
if (formatter->use2018Keywords() &&
!(formatter->idOnTopLevelOnly() && formatter->topLevelHasId())) {
l_baseCRS->formatID(formatter);
}
formatter->endNode();
} else {
const auto oldAxisOutputRule = formatter->outputAxis();
Expand Down Expand Up @@ -4848,7 +4857,7 @@ DerivedCRSTemplate<DerivedCRSTraits>::create(

// ---------------------------------------------------------------------------

static void DerivedCRSTemplateCheckExportToWKT(io::WKTFormatter *&formatter,
static void DerivedCRSTemplateCheckExportToWKT(io::WKTFormatter *formatter,
const std::string &crsName,
bool wkt2_2018_only) {
const bool isWKT2 = formatter->version() == io::WKTFormatter::Version::WKT2;
Expand Down
40 changes: 40 additions & 0 deletions src/iso19111/io.cpp
Expand Up @@ -141,6 +141,7 @@ struct WKTFormatter::Private {
std::vector<bool> stackHasChild_{};
std::vector<bool> stackHasId_{false};
std::vector<bool> stackEmptyKeyword_{};
std::vector<bool> stackDisableUsage_{};
std::vector<bool> outputUnitStack_{true};
std::vector<bool> outputIdStack_{true};
std::vector<UnitOfMeasureNNPtr> axisLinearUnitStack_{
Expand Down Expand Up @@ -272,6 +273,11 @@ const std::string &WKTFormatter::toString() const {
if (d->outputUnitStack_.size() != 1)
throw FormattingException(
"Unbalanced pushOutputUnit() / popOutputUnit()");
if (d->stackHasId_.size() != 1)
throw FormattingException("Unbalanced pushHasId() / popHasId()");
if (!d->stackDisableUsage_.empty())
throw FormattingException(
"Unbalanced pushDisableUsage() / popDisableUsage()");

return d->result_;
}
Expand Down Expand Up @@ -556,6 +562,28 @@ bool WKTFormatter::outputId() const {

// ---------------------------------------------------------------------------

void WKTFormatter::pushHasId(bool hasId) { d->stackHasId_.push_back(hasId); }

// ---------------------------------------------------------------------------

void WKTFormatter::popHasId() { d->stackHasId_.pop_back(); }

// ---------------------------------------------------------------------------

void WKTFormatter::pushDisableUsage() { d->stackDisableUsage_.push_back(true); }

// ---------------------------------------------------------------------------

void WKTFormatter::popDisableUsage() { d->stackDisableUsage_.pop_back(); }

// ---------------------------------------------------------------------------

bool WKTFormatter::outputUsage() const {
return outputId() && d->stackDisableUsage_.empty();
}

// ---------------------------------------------------------------------------

void WKTFormatter::pushAxisLinearUnit(const UnitOfMeasureNNPtr &unit) {
d->axisLinearUnitStack_.push_back(unit);
}
Expand Down Expand Up @@ -634,6 +662,18 @@ bool WKTFormatter::primeMeridianInDegree() const {

// ---------------------------------------------------------------------------

bool WKTFormatter::idOnTopLevelOnly() const {
return d->params_.idOnTopLevelOnly_;
}

// ---------------------------------------------------------------------------

bool WKTFormatter::topLevelHasId() const {
return d->stackHasId_.size() >= 2 && d->stackHasId_[1];
}

// ---------------------------------------------------------------------------

WKTFormatter::Version WKTFormatter::version() const {
return d->params_.version_;
}
Expand Down

0 comments on commit d19107a

Please sign in to comment.