aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2021-04-18 16:12:50 +0200
committerEven Rouault <even.rouault@spatialys.com>2021-04-18 16:12:50 +0200
commit16c50fbe3333adcc900c13a9350069ff2e2b4f69 (patch)
tree3a21973091d2f8532fc2ce085eb63e6edf7f085a
parenta850aac5e0de3f86f2e4cf29f211e88744db5133 (diff)
downloadPROJ-16c50fbe3333adcc900c13a9350069ff2e2b4f69.tar.gz
PROJ-16c50fbe3333adcc900c13a9350069ff2e2b4f69.zip
createFromUserInput(): change name of CRS built from URN combined references to match the convention of EPSG projected CRS
-rw-r--r--src/iso19111/io.cpp119
-rw-r--r--test/unit/test_io.cpp2
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<GeographicCRS *>(baseCRS.get()) &&
- dynamic_cast<Conversion *>(op.get()) &&
- dynamic_cast<CartesianCS *>(cs.get())) {
- auto geogCRS = NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<GeographicCRS>(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<GeographicCRS>(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<Conversion>(op)) {
+ auto convNN = NN_NO_CHECK(conv);
+ if (geogCRS != nullptr) {
+ auto geogCRSNN = NN_NO_CHECK(geogCRS);
+ if (CartesianCSPtr ccs =
+ util::nn_dynamic_pointer_cast<CartesianCS>(cs)) {
+ return ProjectedCRS::create(props, geogCRSNN, convNN,
+ NN_NO_CHECK(ccs));
+ }
+ if (EllipsoidalCSPtr ecs =
+ util::nn_dynamic_pointer_cast<EllipsoidalCS>(cs)) {
+ return DerivedGeographicCRS::create(
+ props, geogCRSNN, convNN, NN_NO_CHECK(ecs));
+ }
+ } else if (dynamic_cast<GeodeticCRS *>(baseCRS.get()) &&
+ dynamic_cast<CartesianCS *>(cs.get())) {
+ return DerivedGeodeticCRS::create(
+ props,
+ NN_NO_CHECK(util::nn_dynamic_pointer_cast<GeodeticCRS>(
+ baseCRS)),
+ convNN,
+ NN_NO_CHECK(
+ util::nn_dynamic_pointer_cast<CartesianCS>(cs)));
+ } else if (auto pcrs =
+ util::nn_dynamic_pointer_cast<ProjectedCRS>(
+ baseCRS)) {
+ return DerivedProjectedCRS::create(props, NN_NO_CHECK(pcrs),
+ convNN, cs);
+ } else if (dynamic_cast<VerticalCRS *>(baseCRS.get()) &&
+ dynamic_cast<VerticalCS *>(cs.get())) {
+ return DerivedVerticalCRS::create(
+ props,
+ NN_NO_CHECK(util::nn_dynamic_pointer_cast<VerticalCRS>(
+ baseCRS)),
+ convNN,
+ NN_NO_CHECK(
+ util::nn_dynamic_pointer_cast<VerticalCS>(cs)));
}
- return ProjectedCRS::create(
- util::PropertyMap().set(IdentifiedObject::NAME_KEY, name),
- geogCRS,
- NN_NO_CHECK(util::nn_dynamic_pointer_cast<Conversion>(op)),
- NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<CartesianCS>(cs)));
- } else if (dynamic_cast<GeodeticCRS *>(baseCRS.get()) &&
- !dynamic_cast<GeographicCRS *>(baseCRS.get()) &&
- dynamic_cast<Conversion *>(op.get()) &&
- dynamic_cast<CartesianCS *>(cs.get())) {
- return DerivedGeodeticCRS::create(
- util::PropertyMap().set(IdentifiedObject::NAME_KEY,
- op->nameStr() + " / " +
- baseCRS->nameStr()),
- NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<GeodeticCRS>(baseCRS)),
- NN_NO_CHECK(util::nn_dynamic_pointer_cast<Conversion>(op)),
- NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<CartesianCS>(cs)));
- } else if (dynamic_cast<GeographicCRS *>(baseCRS.get()) &&
- dynamic_cast<Conversion *>(op.get()) &&
- dynamic_cast<EllipsoidalCS *>(cs.get())) {
- return DerivedGeographicCRS::create(
- util::PropertyMap().set(IdentifiedObject::NAME_KEY,
- op->nameStr() + " / " +
- baseCRS->nameStr()),
- NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<GeodeticCRS>(baseCRS)),
- NN_NO_CHECK(util::nn_dynamic_pointer_cast<Conversion>(op)),
- NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<EllipsoidalCS>(cs)));
- } else if (dynamic_cast<ProjectedCRS *>(baseCRS.get()) &&
- dynamic_cast<Conversion *>(op.get())) {
- return DerivedProjectedCRS::create(
- util::PropertyMap().set(IdentifiedObject::NAME_KEY,
- op->nameStr() + " / " +
- baseCRS->nameStr()),
- NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<ProjectedCRS>(baseCRS)),
- NN_NO_CHECK(util::nn_dynamic_pointer_cast<Conversion>(op)),
- cs);
- } else if (dynamic_cast<VerticalCRS *>(baseCRS.get()) &&
- dynamic_cast<Conversion *>(op.get()) &&
- dynamic_cast<VerticalCS *>(cs.get())) {
- return DerivedVerticalCRS::create(
- util::PropertyMap().set(IdentifiedObject::NAME_KEY,
- op->nameStr() + " / " +
- baseCRS->nameStr()),
- NN_NO_CHECK(
- util::nn_dynamic_pointer_cast<VerticalCRS>(baseCRS)),
- NN_NO_CHECK(util::nn_dynamic_pointer_cast<Conversion>(op)),
- NN_NO_CHECK(util::nn_dynamic_pointer_cast<VerticalCS>(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<ProjectedCRS>(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);