From 4d9027a3e2a9e130e61ad764cfa4be09539d70d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 3 Apr 2020 08:06:33 +0000 Subject: Make sure that importing a Projected 3D CRS from WKT:2019 keeps the base geographic CRS as 3D (fixes #2122) --- src/iso19111/io.cpp | 6 ++++++ test/unit/test_crs.cpp | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index b6aadb8b..84f2ba76 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -3797,6 +3797,12 @@ WKTParser::Private::buildProjectedCRS(const WKTNodeNNPtr &node) { ThrowNotExpectedCSType("Cartesian"); } + if (cartesianCS->axisList().size() == 3 && + baseGeodCRS->coordinateSystem()->axisList().size() == 2) { + baseGeodCRS = NN_NO_CHECK(util::nn_dynamic_pointer_cast( + baseGeodCRS->promoteTo3D(std::string(), dbContext_))); + } + addExtensionProj4ToProp(nodeP, props); return ProjectedCRS::create(props, baseGeodCRS, conversion, diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp index c2e97003..ed6fb7d2 100644 --- a/test/unit/test_crs.cpp +++ b/test/unit/test_crs.cpp @@ -5644,6 +5644,22 @@ TEST(crs, promoteTo3D_and_demoteTo2D) { EXPECT_EQ( crs3DAsProjected->baseCRS()->coordinateSystem()->axisList().size(), 3U); + + // Check that importing an exported Projected 3D CRS as WKT keeps + // the 3D aspect of the baseCRS (see #2122) + { + WKTFormatterNNPtr f( + WKTFormatter::create(WKTFormatter::Convention::WKT2_2019)); + crs3DAsProjected->exportToWKT(f.get()); + auto obj = WKTParser().createFromWKT(f->toString()); + auto crsFromWkt = nn_dynamic_pointer_cast(obj); + ASSERT_TRUE(crsFromWkt != nullptr); + EXPECT_EQ(crsFromWkt->coordinateSystem()->axisList().size(), 3U); + EXPECT_EQ( + crsFromWkt->baseCRS()->coordinateSystem()->axisList().size(), + 3U); + } + EXPECT_TRUE(crs3D->promoteTo3D(std::string(), nullptr) ->isEquivalentTo(crs3D.get())); -- cgit v1.2.3