aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>2020-04-03 08:06:26 +0000
committergithub-actions[bot] <github-actions[bot]@users.noreply.github.com>2020-04-03 08:06:26 +0000
commit09a936a29c68dc66c2f92221d52d469ca8a98c1e (patch)
treecee9a4725fbf0715cb7371e7c7076c9fa8a56508
parent5bb88a1d8c4ac71a4c702ab877e4bc7aa9dc261c (diff)
downloadPROJ-09a936a29c68dc66c2f92221d52d469ca8a98c1e.tar.gz
PROJ-09a936a29c68dc66c2f92221d52d469ca8a98c1e.zip
Make sure that importing a Projected 3D CRS from WKT:2019 keeps the base geographic CRS as 3D (fixes #2122)
-rw-r--r--src/iso19111/io.cpp6
-rw-r--r--test/unit/test_crs.cpp16
2 files changed, 22 insertions, 0 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index d5d0d1c0..e358fc10 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -3773,6 +3773,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<GeodeticCRS>(
+ 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 2498c533..6c334000 100644
--- a/test/unit/test_crs.cpp
+++ b/test/unit/test_crs.cpp
@@ -5559,6 +5559,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<ProjectedCRS>(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()));