diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-03-06 18:28:30 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-06 18:28:30 +0100 |
| commit | 93da0bcaa0880b183b312e1ce7834c74357e5b0e (patch) | |
| tree | 2d6f318b8f1700ebcb35dbfd7791c038d7b2a212 /src/iso19111 | |
| parent | 2dbca196a0c73972a0cc70856a42f01765868145 (diff) | |
| parent | 6512ef2427ed6b303ae1c03b91907020cb5366d8 (diff) | |
| download | PROJ-93da0bcaa0880b183b312e1ce7834c74357e5b0e.tar.gz PROJ-93da0bcaa0880b183b312e1ce7834c74357e5b0e.zip | |
Merge pull request #2024 from rouault/add_support_for_WKT1_ESRI_VERTCS
WKT import/export: add support for WKT1_ESRI VERTCS syntax
Diffstat (limited to 'src/iso19111')
| -rw-r--r-- | src/iso19111/crs.cpp | 19 | ||||
| -rw-r--r-- | src/iso19111/datum.cpp | 6 | ||||
| -rw-r--r-- | src/iso19111/io.cpp | 49 | ||||
| -rw-r--r-- | src/iso19111/static.cpp | 1 |
4 files changed, 70 insertions, 5 deletions
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index 45e2309c..e1181d43 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -2548,12 +2548,29 @@ const cs::VerticalCSNNPtr VerticalCRS::coordinateSystem() const { void VerticalCRS::_exportToWKT(io::WKTFormatter *formatter) const { const bool isWKT2 = formatter->version() == io::WKTFormatter::Version::WKT2; formatter->startNode(isWKT2 ? io::WKTConstants::VERTCRS - : io::WKTConstants::VERT_CS, + : formatter->useESRIDialect() + ? io::WKTConstants::VERTCS + : io::WKTConstants::VERT_CS, !identifiers().empty()); formatter->addQuotedString(nameStr()); exportDatumOrDatumEnsembleToWkt(formatter); const auto &cs = SingleCRS::getPrivate()->coordinateSystem; const auto &axisList = cs->axisList(); + + if (formatter->useESRIDialect()) { + // Seems to be a constant value... + formatter->startNode(io::WKTConstants::PARAMETER, false); + formatter->addQuotedString("Vertical_Shift"); + formatter->add(0.0); + formatter->endNode(); + + formatter->startNode(io::WKTConstants::PARAMETER, false); + formatter->addQuotedString("Direction"); + formatter->add( + axisList[0]->direction() == cs::AxisDirection::UP ? 1.0 : -1.0); + formatter->endNode(); + } + if (!isWKT2) { axisList[0]->unit()._exportToWKT(formatter); } diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp index d9d9c261..ad287e73 100644 --- a/src/iso19111/datum.cpp +++ b/src/iso19111/datum.cpp @@ -1846,7 +1846,9 @@ void VerticalReferenceFrame::_exportToWKT( { const bool isWKT2 = formatter->version() == io::WKTFormatter::Version::WKT2; formatter->startNode(isWKT2 ? io::WKTConstants::VDATUM - : io::WKTConstants::VERT_DATUM, + : formatter->useESRIDialect() + ? io::WKTConstants::VDATUM + : io::WKTConstants::VERT_DATUM, !identifiers().empty()); const auto &l_name = nameStr(); if (!l_name.empty()) { @@ -1856,7 +1858,7 @@ void VerticalReferenceFrame::_exportToWKT( } if (isWKT2) { Datum::getPrivate()->exportAnchorDefinition(formatter); - } else { + } else if (!formatter->useESRIDialect()) { formatter->add(2005); // CS_VD_GeoidModelDerived from OGC 01-009 const auto &extension = formatter->getVDatumExtension(); if (!extension.empty()) { diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 861aadbf..c57014d9 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -2463,18 +2463,57 @@ WKTParser::Private::buildCS(const WKTNodeNNPtr &node, /* maybe null */ return CartesianCS::createEastingNorthing(unit); } } else if (ci_equal(parentNodeName, WKTConstants::VERT_CS) || + ci_equal(parentNodeName, WKTConstants::VERTCS) || ci_equal(parentNodeName, WKTConstants::BASEVERTCRS)) { csTypeCStr = "vertical"; + + bool downDirection = false; + if (ci_equal(parentNodeName, WKTConstants::VERTCS)) // ESRI + { + for (const auto &childNode : parentNode->GP()->children()) { + const auto &childNodeChildren = childNode->GP()->children(); + if (childNodeChildren.size() == 2 && + ci_equal(childNode->GP()->value(), + WKTConstants::PARAMETER) && + childNodeChildren[0]->GP()->value() == + "\"Direction\"") { + const auto ¶mValue = + childNodeChildren[1]->GP()->value(); + try { + double val = asDouble(childNodeChildren[1]); + if (val == 1.0) { + // ok + } else if (val == -1.0) { + downDirection = true; + } + } catch (const std::exception &) { + throw ParsingException( + concat("unhandled parameter value type : ", + paramValue)); + } + } + } + } + if (axisCount == 0) { auto unit = buildUnitInSubNode(parentNode, UnitOfMeasure::Type::LINEAR); if (unit == UnitOfMeasure::NONE) { - if (ci_equal(parentNodeName, WKTConstants::VERT_CS)) { + if (ci_equal(parentNodeName, WKTConstants::VERT_CS) || + ci_equal(parentNodeName, WKTConstants::VERTCS)) { ThrowParsingExceptionMissingUNIT(); } else { unit = UnitOfMeasure::METRE; } } + if (downDirection) { + return VerticalCS::create( + util::PropertyMap(), + CoordinateSystemAxis::create( + util::PropertyMap().set(IdentifiedObject::NAME_KEY, + "depth"), + "D", AxisDirection::DOWN, unit)); + } return VerticalCS::createGravityRelatedHeight(unit); } } else if (ci_equal(parentNodeName, WKTConstants::LOCAL_CS)) { @@ -3890,6 +3929,7 @@ CRSNNPtr WKTParser::Private::buildVerticalCRS(const WKTNodeNNPtr &node) { auto &csNode = nodeP->lookForChild(WKTConstants::CS_); const auto &nodeValue = nodeP->value(); if (isNull(csNode) && !ci_equal(nodeValue, WKTConstants::VERT_CS) && + !ci_equal(nodeValue, WKTConstants::VERTCS) && !ci_equal(nodeValue, WKTConstants::BASEVERTCRS)) { ThrowMissing(WKTConstants::CS_); } @@ -3905,7 +3945,8 @@ CRSNNPtr WKTParser::Private::buildVerticalCRS(const WKTNodeNNPtr &node) { // following conventions from // https://pubs.usgs.gov/tm/11b4/pdf/tm11-B4.pdf // page 9 - if (ci_equal(nodeValue, WKTConstants::VERT_CS)) { + if (ci_equal(nodeValue, WKTConstants::VERT_CS) || + ci_equal(nodeValue, WKTConstants::VERTCS)) { std::string name; if (props.getStringValue(IdentifiedObject::NAME_KEY, name)) { std::string geoidName; @@ -4404,6 +4445,7 @@ CRSPtr WKTParser::Private::buildCRS(const WKTNodeNNPtr &node) { } if (ci_equal(name, WKTConstants::VERT_CS) || + ci_equal(name, WKTConstants::VERTCS) || ci_equal(name, WKTConstants::VERTCRS) || ci_equal(name, WKTConstants::VERTICALCRS)) { if (!isNull(nodeP->lookForChild(WKTConstants::BASEVERTCRS))) { @@ -6165,6 +6207,9 @@ WKTParser::attachDatabaseContext(const DatabaseContextPtr &dbContext) { */ WKTParser::WKTGuessedDialect WKTParser::guessDialect(const std::string &wkt) noexcept { + if (ci_starts_with(wkt, WKTConstants::VERTCS)) { + return WKTGuessedDialect::WKT1_ESRI; + } const std::string *const wkt1_keywords[] = { &WKTConstants::GEOCCS, &WKTConstants::GEOGCS, &WKTConstants::COMPD_CS, &WKTConstants::PROJCS, &WKTConstants::VERT_CS, &WKTConstants::LOCAL_CS}; diff --git a/src/iso19111/static.cpp b/src/iso19111/static.cpp index da399288..11306e35 100644 --- a/src/iso19111/static.cpp +++ b/src/iso19111/static.cpp @@ -204,6 +204,7 @@ DEFINE_WKT_CONSTANT(PROJCS); DEFINE_WKT_CONSTANT(PROJECTION); DEFINE_WKT_CONSTANT(PARAMETER); DEFINE_WKT_CONSTANT(VERT_CS); +DEFINE_WKT_CONSTANT(VERTCS); DEFINE_WKT_CONSTANT(VERT_DATUM); DEFINE_WKT_CONSTANT(COMPD_CS); DEFINE_WKT_CONSTANT(TOWGS84); |
