From 16c50fbe3333adcc900c13a9350069ff2e2b4f69 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sun, 18 Apr 2021 16:12:50 +0200 Subject: createFromUserInput(): change name of CRS built from URN combined references to match the convention of EPSG projected CRS --- src/iso19111/io.cpp | 119 +++++++++++++++++++++++--------------------------- test/unit/test_io.cpp | 2 +- 2 files changed, 55 insertions(+), 66 deletions(-) diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index c59e21f4..e3da80e0 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -6491,73 +6491,62 @@ static BaseObjectNNPtr createFromUserInput(const std::string &text, AuthorityFactory::create(NN_NO_CHECK(dbContext), tokensOp[1]); auto op = factoryOp->createCoordinateOperation(tokensOp[3], true); - if (dynamic_cast(baseCRS.get()) && - dynamic_cast(op.get()) && - dynamic_cast(cs.get())) { - auto geogCRS = NN_NO_CHECK( - util::nn_dynamic_pointer_cast(baseCRS)); - auto name = op->nameStr() + " / " + baseCRS->nameStr(); - if (geogCRS->coordinateSystem()->axisList().size() == 3 && - baseCRS->nameStr().find("3D") == std::string::npos) { - name += " (3D)"; + std::string name(baseCRS->nameStr()); + auto geogCRS = + util::nn_dynamic_pointer_cast(baseCRS); + if (geogCRS && + geogCRS->coordinateSystem()->axisList().size() == 3 && + baseCRS->nameStr().find("3D") == std::string::npos) { + name += " (3D)"; + } + name += " / "; + name += op->nameStr(); + auto props = + util::PropertyMap().set(IdentifiedObject::NAME_KEY, name); + + if (auto conv = util::nn_dynamic_pointer_cast(op)) { + auto convNN = NN_NO_CHECK(conv); + if (geogCRS != nullptr) { + auto geogCRSNN = NN_NO_CHECK(geogCRS); + if (CartesianCSPtr ccs = + util::nn_dynamic_pointer_cast(cs)) { + return ProjectedCRS::create(props, geogCRSNN, convNN, + NN_NO_CHECK(ccs)); + } + if (EllipsoidalCSPtr ecs = + util::nn_dynamic_pointer_cast(cs)) { + return DerivedGeographicCRS::create( + props, geogCRSNN, convNN, NN_NO_CHECK(ecs)); + } + } else if (dynamic_cast(baseCRS.get()) && + dynamic_cast(cs.get())) { + return DerivedGeodeticCRS::create( + props, + NN_NO_CHECK(util::nn_dynamic_pointer_cast( + baseCRS)), + convNN, + NN_NO_CHECK( + util::nn_dynamic_pointer_cast(cs))); + } else if (auto pcrs = + util::nn_dynamic_pointer_cast( + baseCRS)) { + return DerivedProjectedCRS::create(props, NN_NO_CHECK(pcrs), + convNN, cs); + } else if (dynamic_cast(baseCRS.get()) && + dynamic_cast(cs.get())) { + return DerivedVerticalCRS::create( + props, + NN_NO_CHECK(util::nn_dynamic_pointer_cast( + baseCRS)), + convNN, + NN_NO_CHECK( + util::nn_dynamic_pointer_cast(cs))); } - return ProjectedCRS::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, name), - geogCRS, - NN_NO_CHECK(util::nn_dynamic_pointer_cast(op)), - NN_NO_CHECK( - util::nn_dynamic_pointer_cast(cs))); - } else if (dynamic_cast(baseCRS.get()) && - !dynamic_cast(baseCRS.get()) && - dynamic_cast(op.get()) && - dynamic_cast(cs.get())) { - return DerivedGeodeticCRS::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - op->nameStr() + " / " + - baseCRS->nameStr()), - NN_NO_CHECK( - util::nn_dynamic_pointer_cast(baseCRS)), - NN_NO_CHECK(util::nn_dynamic_pointer_cast(op)), - NN_NO_CHECK( - util::nn_dynamic_pointer_cast(cs))); - } else if (dynamic_cast(baseCRS.get()) && - dynamic_cast(op.get()) && - dynamic_cast(cs.get())) { - return DerivedGeographicCRS::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - op->nameStr() + " / " + - baseCRS->nameStr()), - NN_NO_CHECK( - util::nn_dynamic_pointer_cast(baseCRS)), - NN_NO_CHECK(util::nn_dynamic_pointer_cast(op)), - NN_NO_CHECK( - util::nn_dynamic_pointer_cast(cs))); - } else if (dynamic_cast(baseCRS.get()) && - dynamic_cast(op.get())) { - return DerivedProjectedCRS::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - op->nameStr() + " / " + - baseCRS->nameStr()), - NN_NO_CHECK( - util::nn_dynamic_pointer_cast(baseCRS)), - NN_NO_CHECK(util::nn_dynamic_pointer_cast(op)), - cs); - } else if (dynamic_cast(baseCRS.get()) && - dynamic_cast(op.get()) && - dynamic_cast(cs.get())) { - return DerivedVerticalCRS::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - op->nameStr() + " / " + - baseCRS->nameStr()), - NN_NO_CHECK( - util::nn_dynamic_pointer_cast(baseCRS)), - NN_NO_CHECK(util::nn_dynamic_pointer_cast(op)), - NN_NO_CHECK(util::nn_dynamic_pointer_cast(cs))); - } else { - throw ParsingException("unsupported combination of baseCRS, CS " - "and coordinateOperation for a " - "DerivedCRS"); } + + throw ParsingException("unsupported combination of baseCRS, CS " + "and coordinateOperation for a " + "DerivedCRS"); } // OGC 07-092r2: para 7.5.2 diff --git a/test/unit/test_io.cpp b/test/unit/test_io.cpp index b7081c21..bfe863a3 100644 --- a/test/unit/test_io.cpp +++ b/test/unit/test_io.cpp @@ -10424,7 +10424,7 @@ TEST(io, createFromUserInput) { dbContext); auto crs = nn_dynamic_pointer_cast(obj); ASSERT_TRUE(crs != nullptr); - EXPECT_EQ(crs->nameStr(), "UTM zone 31N / WGS 84 (3D)"); + EXPECT_EQ(crs->nameStr(), "WGS 84 (3D) / UTM zone 31N"); EXPECT_EQ(crs->baseCRS()->getEPSGCode(), 4979); EXPECT_EQ(crs->coordinateSystem()->axisList().size(), 3U); EXPECT_EQ(crs->derivingConversion()->getEPSGCode(), 16031); -- cgit v1.2.3