aboutsummaryrefslogtreecommitdiff
path: root/test/unit
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-10-04 11:45:43 +0200
committerGitHub <noreply@github.com>2019-10-04 11:45:43 +0200
commit2bac8760df976adb3e112f98cfcbfc5d9d90e22a (patch)
tree72a481a5887fec8401e4b825c38d3747d2b23911 /test/unit
parent7bfef6a9c94482826a41687f795b1a991e17ed35 (diff)
parentae779eaa8264914a401f585f747a0f87fd5350e9 (diff)
downloadPROJ-2bac8760df976adb3e112f98cfcbfc5d9d90e22a.tar.gz
PROJ-2bac8760df976adb3e112f98cfcbfc5d9d90e22a.zip
Merge pull request #1656 from rouault/demote_to_2D
Add a proj_crs_demote_to_2D(). Useful if forced to export a 3D CRS to a best approximate as WKT1 that doesn't support it
Diffstat (limited to 'test/unit')
-rw-r--r--test/unit/test_c_api.cpp25
-rw-r--r--test/unit/test_crs.cpp44
2 files changed, 64 insertions, 5 deletions
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index 40122cb2..d5475346 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -3949,6 +3949,31 @@ TEST_F(CApi, proj_crs_promote_to_3D) {
// ---------------------------------------------------------------------------
+TEST_F(CApi, proj_crs_demote_to_2D) {
+
+ auto crs3D =
+ proj_create(m_ctxt, GeographicCRS::EPSG_4979
+ ->exportToWKT(WKTFormatter::create().get())
+ .c_str());
+ ObjectKeeper keeper_crs3D(crs3D);
+ EXPECT_NE(crs3D, nullptr);
+
+ auto crs2D = proj_crs_demote_to_2D(m_ctxt, nullptr, crs3D);
+ ObjectKeeper keeper_crs2D(crs2D);
+ EXPECT_NE(crs2D, nullptr);
+
+ auto cs = proj_crs_get_coordinate_system(m_ctxt, crs2D);
+ ASSERT_NE(cs, nullptr);
+ ObjectKeeper keeperCs(cs);
+ EXPECT_EQ(proj_cs_get_axis_count(m_ctxt, cs), 2);
+
+ auto code = proj_get_id_code(crs2D, 0);
+ ASSERT_TRUE(code != nullptr);
+ EXPECT_EQ(code, std::string("4326"));
+}
+
+// ---------------------------------------------------------------------------
+
TEST_F(CApi, proj_crs_create_projected_3D_crs_from_2D) {
auto projCRS = proj_create_from_database(m_ctxt, "EPSG", "32631",
diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp
index aee4dd73..24f4ba52 100644
--- a/test/unit/test_crs.cpp
+++ b/test/unit/test_crs.cpp
@@ -5232,7 +5232,7 @@ TEST(crs, getNonDeprecated) {
// ---------------------------------------------------------------------------
-TEST(crs, promoteTo3D) {
+TEST(crs, promoteTo3D_and_demoteTo2D) {
auto dbContext = DatabaseContext::create();
{
auto crs = GeographicCRS::EPSG_4326;
@@ -5250,6 +5250,10 @@ TEST(crs, promoteTo3D) {
ASSERT_TRUE(crs3DAsGeog != nullptr);
EXPECT_EQ(crs3DAsGeog->coordinateSystem()->axisList().size(), 3U);
EXPECT_TRUE(!crs3DAsGeog->identifiers().empty());
+
+ auto demoted = crs3DAsGeog->demoteTo2D(std::string(), dbContext);
+ EXPECT_EQ(demoted->coordinateSystem()->axisList().size(), 2U);
+ EXPECT_TRUE(!demoted->identifiers().empty());
}
{
auto crs = createProjected();
@@ -5262,6 +5266,11 @@ TEST(crs, promoteTo3D) {
3U);
EXPECT_TRUE(crs3D->promoteTo3D(std::string(), nullptr)
->isEquivalentTo(crs3D.get()));
+
+ auto demoted = crs3DAsProjected->demoteTo2D(std::string(), nullptr);
+ EXPECT_EQ(demoted->coordinateSystem()->axisList().size(), 2U);
+ EXPECT_EQ(demoted->baseCRS()->coordinateSystem()->axisList().size(),
+ 2U);
}
{
auto crs = createProjected();
@@ -5273,6 +5282,12 @@ TEST(crs, promoteTo3D) {
crs3DAsProjected->baseCRS()->coordinateSystem()->axisList().size(),
3U);
EXPECT_TRUE(!crs3DAsProjected->baseCRS()->identifiers().empty());
+
+ auto demoted = crs3DAsProjected->demoteTo2D(std::string(), dbContext);
+ EXPECT_EQ(demoted->coordinateSystem()->axisList().size(), 2U);
+ EXPECT_EQ(demoted->baseCRS()->coordinateSystem()->axisList().size(),
+ 2U);
+ EXPECT_TRUE(!demoted->baseCRS()->identifiers().empty());
}
{
auto crs = BoundCRS::createFromTOWGS84(
@@ -5280,9 +5295,28 @@ TEST(crs, promoteTo3D) {
auto crs3D = crs->promoteTo3D(std::string(), dbContext);
auto crs3DAsBound = nn_dynamic_pointer_cast<BoundCRS>(crs3D);
ASSERT_TRUE(crs3DAsBound != nullptr);
- auto baseCRS =
- nn_dynamic_pointer_cast<ProjectedCRS>(crs3DAsBound->baseCRS());
- ASSERT_TRUE(baseCRS != nullptr);
- EXPECT_EQ(baseCRS->coordinateSystem()->axisList().size(), 3U);
+ {
+ auto baseCRS =
+ nn_dynamic_pointer_cast<ProjectedCRS>(crs3DAsBound->baseCRS());
+ ASSERT_TRUE(baseCRS != nullptr);
+ EXPECT_EQ(baseCRS->coordinateSystem()->axisList().size(), 3U);
+ }
+
+ auto demoted = crs3DAsBound->demoteTo2D(std::string(), nullptr);
+ auto crs2DAsBound = nn_dynamic_pointer_cast<BoundCRS>(demoted);
+ ASSERT_TRUE(crs2DAsBound != nullptr);
+ {
+ auto baseCRS =
+ nn_dynamic_pointer_cast<ProjectedCRS>(crs2DAsBound->baseCRS());
+ ASSERT_TRUE(baseCRS != nullptr);
+ EXPECT_EQ(baseCRS->coordinateSystem()->axisList().size(), 2U);
+ }
+ }
+
+ {
+ auto compoundCRS = createCompoundCRS();
+ auto demoted = compoundCRS->demoteTo2D(std::string(), nullptr);
+ EXPECT_TRUE(dynamic_cast<const ProjectedCRS *>(demoted.get()) !=
+ nullptr);
}
}