aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/io.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/iso19111/io.cpp')
-rw-r--r--src/iso19111/io.cpp46
1 files changed, 37 insertions, 9 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index 16ab22f7..c464b724 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -388,6 +388,12 @@ void WKTFormatter::leave() {
// ---------------------------------------------------------------------------
+bool WKTFormatter::isAtTopLevel() const {
+ return d->level_ == 0 && d->indentLevel_ == 0;
+}
+
+// ---------------------------------------------------------------------------
+
void WKTFormatter::startNode(const std::string &keyword, bool hasId) {
if (!d->stackHasChild_.empty()) {
d->startNewChild();
@@ -4733,13 +4739,7 @@ BaseObjectNNPtr WKTParser::Private::build(const WKTNodeNNPtr &node) {
return util::nn_static_pointer_cast<BaseObject>(NN_NO_CHECK(crs));
}
- if (ci_equal(name, WKTConstants::DATUM) ||
- ci_equal(name, WKTConstants::GEODETICDATUM) ||
- ci_equal(name, WKTConstants::TRF)) {
- return util::nn_static_pointer_cast<BaseObject>(
- buildGeodeticReferenceFrame(node, PrimeMeridian::GREENWICH,
- null_node));
- }
+ // Datum handled by caller code WKTParser::createFromWKT()
if (ci_equal(name, WKTConstants::ENSEMBLE)) {
return util::nn_static_pointer_cast<BaseObject>(buildDatumEnsemble(
@@ -6441,8 +6441,36 @@ BaseObjectNNPtr createFromUserInput(const std::string &text, PJ_CONTEXT *ctx) {
* @throw ParsingException
*/
BaseObjectNNPtr WKTParser::createFromWKT(const std::string &wkt) {
- WKTNodeNNPtr root = WKTNode::createFrom(wkt);
- auto obj = d->build(root);
+ const auto build = [this, &wkt]() -> BaseObjectNNPtr {
+ size_t indexEnd;
+ WKTNodeNNPtr root = WKTNode::createFrom(wkt, 0, 0, indexEnd);
+ const std::string &name(root->GP()->value());
+ if (ci_equal(name, WKTConstants::DATUM) ||
+ ci_equal(name, WKTConstants::GEODETICDATUM) ||
+ ci_equal(name, WKTConstants::TRF)) {
+
+ auto primeMeridian = PrimeMeridian::GREENWICH;
+ if (indexEnd < wkt.size()) {
+ indexEnd = skipSpace(wkt, indexEnd);
+ if (indexEnd < wkt.size() && wkt[indexEnd] == ',') {
+ ++indexEnd;
+ indexEnd = skipSpace(wkt, indexEnd);
+ if (indexEnd < wkt.size() &&
+ ci_starts_with(wkt.c_str() + indexEnd,
+ WKTConstants::PRIMEM.c_str())) {
+ primeMeridian = d->buildPrimeMeridian(
+ WKTNode::createFrom(wkt, indexEnd + 1, 0, indexEnd),
+ UnitOfMeasure::DEGREE);
+ }
+ }
+ }
+ return d->buildGeodeticReferenceFrame(root, primeMeridian,
+ null_node);
+ }
+ return d->build(root);
+ };
+
+ auto obj = build();
const auto dialect = guessDialect(wkt);
if (dialect == WKTGuessedDialect::WKT1_GDAL ||