aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-09-11 10:46:38 +0200
committerGitHub <noreply@github.com>2019-09-11 10:46:38 +0200
commitbd39128c3e278331980adf02377e9347269cb820 (patch)
tree0bf702d43582bdb9bf2672bb093b131fbbfb3faf /test
parent13c715af550fbcbb1d412780b107f4e3fc5841e0 (diff)
parenta6e1d72890615b42f54edad9b17acff8e7623844 (diff)
downloadPROJ-bd39128c3e278331980adf02377e9347269cb820.tar.gz
PROJ-bd39128c3e278331980adf02377e9347269cb820.zip
Merge pull request #1596 from rouault/promote_to_3d
API: add CRS::promoteTo3D(), proj_crs_promote_to_3D() and proj_crs_create_projected_3D_crs_from_2D() (fixes #1587)
Diffstat (limited to 'test')
-rwxr-xr-xtest/cli/testprojinfo8
-rw-r--r--test/cli/testprojinfo_out.dist9
-rw-r--r--test/unit/test_c_api.cpp74
-rw-r--r--test/unit/test_crs.cpp57
4 files changed, 148 insertions, 0 deletions
diff --git a/test/cli/testprojinfo b/test/cli/testprojinfo
index f070c999..2b3432a9 100755
--- a/test/cli/testprojinfo
+++ b/test/cli/testprojinfo
@@ -115,6 +115,14 @@ echo "Testing NGF IGN69 height to RGF93: projinfo -s EPSG:5720 -t EPSG:4965 -o P
$EXE -s EPSG:5720 -t EPSG:4965 -o PROJ >>${OUT} 2>&1
echo "" >>${OUT}
+echo "Testing -s EPSG:32631 -t EPSG:4326+3855 --summary" >> ${OUT}
+$EXE -s EPSG:32631 -t EPSG:4326+3855 --summary 2>>${OUT}
+echo "" >>${OUT}
+
+echo "Testing -s EPSG:32631 -t EPSG:4326+3855 --3d --summary" >> ${OUT}
+$EXE -s EPSG:32631 -t EPSG:4326+3855 --3d --summary >>${OUT} 2>&1
+echo "" >>${OUT}
+
# do 'diff' with distribution results
echo "diff ${OUT} with testprojinfo_out.dist"
diff -u ${OUT} ${TEST_CLI_DIR}/testprojinfo_out.dist
diff --git a/test/cli/testprojinfo_out.dist b/test/cli/testprojinfo_out.dist
index 8cb37cf7..9ec74fde 100644
--- a/test/cli/testprojinfo_out.dist
+++ b/test/cli/testprojinfo_out.dist
@@ -821,3 +821,12 @@ INVERSE(EPSG):10000, Inverse of RGF93 to NGF IGN69 height (1), 0.5 m, France - m
PROJ string:
+proj=pipeline +step +inv +proj=vgridshift +grids=ggf97a.txt +multiplier=1
+Testing -s EPSG:32631 -t EPSG:4326+3855 --summary
+Warning: mix of 2D and 3D CRS. Vertical transformations, if available, will not be applied. Consider using 3D version of the CRS, or the --3d switch
+
+Testing -s EPSG:32631 -t EPSG:4326+3855 --3d --summary
+Candidate operations found: 3
+unknown id, Inverse of UTM zone 31N + WGS 84 to EGM2008 height (1), 1 m, World
+unknown id, Inverse of UTM zone 31N + WGS 84 to EGM2008 height (2), 0.5 m, World
+unknown id, Inverse of UTM zone 31N + Inverse of Transformation from EGM2008 height to WGS 84 (ballpark vertical transformation, without ellipsoid height to vertical height correction), unknown accuracy, World, has ballpark transformation
+
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index fd129c80..b8dde430 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -3892,4 +3892,78 @@ TEST_F(CApi, proj_create_ellipsoidal_3D_cs) {
}
}
+// ---------------------------------------------------------------------------
+
+TEST_F(CApi, proj_crs_promote_to_3D) {
+
+ auto crs2D =
+ proj_create(m_ctxt, GeographicCRS::EPSG_4326
+ ->exportToWKT(WKTFormatter::create().get())
+ .c_str());
+ ObjectKeeper keeper_crs2D(crs2D);
+ EXPECT_NE(crs2D, nullptr);
+
+ auto crs3D = proj_crs_promote_to_3D(m_ctxt, nullptr, crs2D);
+ ObjectKeeper keeper_crs3D(crs3D);
+ EXPECT_NE(crs3D, nullptr);
+
+ auto cs = proj_crs_get_coordinate_system(m_ctxt, crs3D);
+ ASSERT_NE(cs, nullptr);
+ ObjectKeeper keeperCs(cs);
+ EXPECT_EQ(proj_cs_get_axis_count(m_ctxt, cs), 3);
+
+ auto code = proj_get_id_code(crs3D, 0);
+ ASSERT_TRUE(code != nullptr);
+ EXPECT_EQ(code, std::string("4979"));
+}
+
+// ---------------------------------------------------------------------------
+
+TEST_F(CApi, proj_crs_create_projected_3D_crs_from_2D) {
+
+ auto projCRS = proj_create_from_database(m_ctxt, "EPSG", "32631",
+ PJ_CATEGORY_CRS, false, nullptr);
+ ASSERT_NE(projCRS, nullptr);
+ ObjectKeeper keeper_projCRS(projCRS);
+
+ {
+ auto geog3DCRS = proj_create_from_database(
+ m_ctxt, "EPSG", "4979", PJ_CATEGORY_CRS, false, nullptr);
+ ASSERT_NE(geog3DCRS, nullptr);
+ ObjectKeeper keeper_geog3DCRS(geog3DCRS);
+
+ auto crs3D = proj_crs_create_projected_3D_crs_from_2D(
+ m_ctxt, nullptr, projCRS, geog3DCRS);
+ ObjectKeeper keeper_crs3D(crs3D);
+ EXPECT_NE(crs3D, nullptr);
+
+ EXPECT_EQ(proj_get_type(crs3D), PJ_TYPE_PROJECTED_CRS);
+
+ EXPECT_EQ(std::string(proj_get_name(crs3D)),
+ std::string(proj_get_name(projCRS)));
+
+ auto cs = proj_crs_get_coordinate_system(m_ctxt, crs3D);
+ ASSERT_NE(cs, nullptr);
+ ObjectKeeper keeperCs(cs);
+ EXPECT_EQ(proj_cs_get_axis_count(m_ctxt, cs), 3);
+ }
+
+ {
+ auto crs3D = proj_crs_create_projected_3D_crs_from_2D(m_ctxt, nullptr,
+ projCRS, nullptr);
+ ObjectKeeper keeper_crs3D(crs3D);
+ EXPECT_NE(crs3D, nullptr);
+
+ EXPECT_EQ(proj_get_type(crs3D), PJ_TYPE_PROJECTED_CRS);
+
+ EXPECT_EQ(std::string(proj_get_name(crs3D)),
+ std::string(proj_get_name(projCRS)));
+
+ auto cs = proj_crs_get_coordinate_system(m_ctxt, crs3D);
+ ASSERT_NE(cs, nullptr);
+ ObjectKeeper keeperCs(cs);
+ EXPECT_EQ(proj_cs_get_axis_count(m_ctxt, cs), 3);
+ }
+}
+
} // namespace
diff --git a/test/unit/test_crs.cpp b/test/unit/test_crs.cpp
index 5ee62ce4..605df714 100644
--- a/test/unit/test_crs.cpp
+++ b/test/unit/test_crs.cpp
@@ -5224,3 +5224,60 @@ TEST(crs, getNonDeprecated) {
ASSERT_EQ(list.size(), 1U);
}
}
+
+// ---------------------------------------------------------------------------
+
+TEST(crs, promoteTo3D) {
+ auto dbContext = DatabaseContext::create();
+ {
+ auto crs = GeographicCRS::EPSG_4326;
+ auto crs3D = crs->promoteTo3D(std::string(), nullptr);
+ auto crs3DAsGeog = nn_dynamic_pointer_cast<GeographicCRS>(crs3D);
+ ASSERT_TRUE(crs3DAsGeog != nullptr);
+ EXPECT_EQ(crs3DAsGeog->coordinateSystem()->axisList().size(), 3U);
+ EXPECT_TRUE(crs3D->promoteTo3D(std::string(), nullptr)
+ ->isEquivalentTo(crs3D.get()));
+ }
+ {
+ auto crs = GeographicCRS::EPSG_4326;
+ auto crs3D = crs->promoteTo3D(std::string(), dbContext);
+ auto crs3DAsGeog = nn_dynamic_pointer_cast<GeographicCRS>(crs3D);
+ ASSERT_TRUE(crs3DAsGeog != nullptr);
+ EXPECT_EQ(crs3DAsGeog->coordinateSystem()->axisList().size(), 3U);
+ EXPECT_TRUE(!crs3DAsGeog->identifiers().empty());
+ }
+ {
+ auto crs = createProjected();
+ auto crs3D = crs->promoteTo3D(std::string(), nullptr);
+ auto crs3DAsProjected = nn_dynamic_pointer_cast<ProjectedCRS>(crs3D);
+ ASSERT_TRUE(crs3DAsProjected != nullptr);
+ EXPECT_EQ(crs3DAsProjected->coordinateSystem()->axisList().size(), 3U);
+ EXPECT_EQ(
+ crs3DAsProjected->baseCRS()->coordinateSystem()->axisList().size(),
+ 3U);
+ EXPECT_TRUE(crs3D->promoteTo3D(std::string(), nullptr)
+ ->isEquivalentTo(crs3D.get()));
+ }
+ {
+ auto crs = createProjected();
+ auto crs3D = crs->promoteTo3D(std::string(), dbContext);
+ auto crs3DAsProjected = nn_dynamic_pointer_cast<ProjectedCRS>(crs3D);
+ ASSERT_TRUE(crs3DAsProjected != nullptr);
+ EXPECT_EQ(crs3DAsProjected->coordinateSystem()->axisList().size(), 3U);
+ EXPECT_EQ(
+ crs3DAsProjected->baseCRS()->coordinateSystem()->axisList().size(),
+ 3U);
+ EXPECT_TRUE(!crs3DAsProjected->baseCRS()->identifiers().empty());
+ }
+ {
+ auto crs = BoundCRS::createFromTOWGS84(
+ createProjected(), std::vector<double>{1, 2, 3, 4, 5, 6, 7});
+ 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);
+ }
+}