aboutsummaryrefslogtreecommitdiff
path: root/test/unit/test_c_api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/test_c_api.cpp')
-rw-r--r--test/unit/test_c_api.cpp191
1 files changed, 175 insertions, 16 deletions
diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp
index 564833db..a176a542 100644
--- a/test/unit/test_c_api.cpp
+++ b/test/unit/test_c_api.cpp
@@ -845,6 +845,28 @@ TEST_F(CApi, proj_create_from_database) {
EXPECT_EQ(proj_get_type(datum), PJ_TYPE_GEODETIC_REFERENCE_FRAME);
}
{
+ // International Terrestrial Reference Frame 2008
+ auto datum = proj_create_from_database(
+ m_ctxt, "EPSG", "1061", PJ_CATEGORY_DATUM, false, nullptr);
+ ASSERT_NE(datum, nullptr);
+ ObjectKeeper keeper(datum);
+ EXPECT_EQ(proj_get_type(datum),
+ PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME);
+ EXPECT_EQ(proj_dynamic_datum_get_frame_reference_epoch(m_ctxt, datum),
+ 2005.0);
+ }
+ {
+ // Norway Normal Null 2000
+ auto datum = proj_create_from_database(
+ m_ctxt, "EPSG", "1096", PJ_CATEGORY_DATUM, false, nullptr);
+ ASSERT_NE(datum, nullptr);
+ ObjectKeeper keeper(datum);
+ EXPECT_EQ(proj_get_type(datum),
+ PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME);
+ EXPECT_EQ(proj_dynamic_datum_get_frame_reference_epoch(m_ctxt, datum),
+ 2000.0);
+ }
+ {
auto op = proj_create_from_database(m_ctxt, "EPSG", "16031",
PJ_CATEGORY_COORDINATE_OPERATION,
false, nullptr);
@@ -1197,6 +1219,14 @@ TEST_F(CApi, proj_get_codes_from_database) {
} else {
ASSERT_NE(list, nullptr) << type;
ASSERT_NE(list[0], nullptr) << type;
+ if (type == PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME ||
+ type == PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME) {
+ auto obj = proj_create_from_database(
+ m_ctxt, "EPSG", list[0], PJ_CATEGORY_DATUM, false, nullptr);
+ ASSERT_NE(obj, nullptr);
+ ObjectKeeper keeper(obj);
+ EXPECT_EQ(proj_get_type(obj), type) << type << " " << list[0];
+ }
}
}
}
@@ -1929,7 +1959,7 @@ TEST_F(CApi, proj_get_area_of_use) {
EXPECT_EQ(e, 180);
EXPECT_EQ(n, 90);
ASSERT_TRUE(name != nullptr);
- EXPECT_EQ(std::string(name), "World");
+ EXPECT_EQ(std::string(name), "World.");
}
{
auto obj = proj_create(m_ctxt, "+proj=longlat +type=crs");
@@ -3397,7 +3427,7 @@ TEST_F(CApi, proj_get_crs_info_list_from_database) {
EXPECT_EQ(list[i]->south_lat_degree, -90.0);
EXPECT_EQ(list[i]->east_lon_degree, 180.0);
EXPECT_EQ(list[i]->north_lat_degree, 90.0);
- EXPECT_EQ(std::string(list[i]->area_name), "World");
+ EXPECT_EQ(std::string(list[i]->area_name), "World.");
EXPECT_EQ(list[i]->projection_method_name, nullptr);
} else if (code == "4978") {
found4978 = true;
@@ -3734,16 +3764,26 @@ TEST_F(CApi, proj_coordoperation_create_inverse) {
ObjectKeeper keeper_Pinversed(Pinversed);
ASSERT_NE(Pinversed, nullptr);
- auto projstr = proj_as_proj_string(m_ctxt, Pinversed, PJ_PROJ_5, nullptr);
+ const char *options[] = {"MULTILINE=YES", "INDENTATION_WIDTH=4",
+ "MAX_LINE_LENGTH=40", nullptr};
+ auto projstr = proj_as_proj_string(m_ctxt, Pinversed, PJ_PROJ_5, options);
ASSERT_NE(projstr, nullptr);
- EXPECT_EQ(std::string(projstr),
- "+proj=pipeline +step +proj=axisswap +order=2,1 +step "
- "+proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=push +v_3 "
- "+step +proj=cart +ellps=WGS84 +step +inv +proj=helmert +x=293 "
- "+y=836 +z=318 +rx=0.5 +ry=1.6 +rz=-2.8 +s=2.1 "
- "+convention=position_vector +step +inv +proj=cart "
- "+ellps=evrst30 +step +proj=pop +v_3 +step +proj=unitconvert "
- "+xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1");
+ const char *expected_projstr = "+proj=pipeline\n"
+ " +step +proj=axisswap +order=2,1\n"
+ " +step +proj=unitconvert +xy_in=deg\n"
+ " +xy_out=rad\n"
+ " +step +proj=push +v_3\n"
+ " +step +proj=cart +ellps=WGS84\n"
+ " +step +inv +proj=helmert +x=293\n"
+ " +y=836 +z=318 +rx=0.5 +ry=1.6\n"
+ " +rz=-2.8 +s=2.1\n"
+ " +convention=position_vector\n"
+ " +step +inv +proj=cart +ellps=evrst30\n"
+ " +step +proj=pop +v_3\n"
+ " +step +proj=unitconvert +xy_in=rad\n"
+ " +xy_out=deg\n"
+ " +step +proj=axisswap +order=2,1";
+ EXPECT_EQ(std::string(projstr), expected_projstr);
}
// ---------------------------------------------------------------------------
@@ -3792,8 +3832,8 @@ TEST_F(CApi, proj_get_scope) {
auto scope = proj_get_scope(co);
ASSERT_NE(scope, nullptr);
EXPECT_EQ(scope,
- std::string("Conformal transformation of GDA94 coordinates "
- "that have been derived through GNSS CORS."));
+ std::string("Transformation of GDA94 coordinates that have "
+ "been derived through GNSS CORS."));
}
// Conversion
@@ -3807,8 +3847,7 @@ TEST_F(CApi, proj_get_scope) {
auto scope = proj_get_scope(co);
ASSERT_NE(scope, nullptr);
EXPECT_EQ(scope,
- std::string("Large and medium scale topographic mapping "
- "and engineering survey."));
+ std::string("Engineering survey, topographic mapping."));
}
{
@@ -4044,7 +4083,7 @@ TEST_F(Fixture_proj_context_set_autoclose_database,
// ---------------------------------------------------------------------------
-TEST_F(CApi, proj_context_clone) {
+TEST_F(CApi, proj_context_copy_from_default) {
auto c_path = proj_context_get_database_path(m_ctxt);
ASSERT_TRUE(c_path != nullptr);
std::string path(c_path);
@@ -4094,6 +4133,28 @@ TEST_F(CApi, proj_context_clone) {
ASSERT_EQ(new_db_path, tmp_filename);
}
+
+// ---------------------------------------------------------------------------
+
+TEST_F(CApi, proj_context_clone) {
+ int new_init_rules = proj_context_get_use_proj4_init_rules(NULL, 0) > 0 ? 0 : 1;
+ PJ_CONTEXT *new_ctx = proj_context_create();
+ EXPECT_NE(new_ctx, nullptr);
+ PjContextKeeper keeper_ctxt(new_ctx);
+ proj_context_use_proj4_init_rules(new_ctx, new_init_rules);
+ PJ_CONTEXT *clone_ctx = proj_context_clone(new_ctx);
+ EXPECT_NE(clone_ctx, nullptr);
+ PjContextKeeper keeper_clone_ctxt(clone_ctx);
+ ASSERT_EQ(
+ proj_context_get_use_proj4_init_rules(new_ctx, 0),
+ proj_context_get_use_proj4_init_rules(clone_ctx, 0)
+ );
+ EXPECT_NE(
+ proj_context_get_use_proj4_init_rules(NULL, 0),
+ proj_context_get_use_proj4_init_rules(clone_ctx, 0)
+ );
+}
+
// ---------------------------------------------------------------------------
TEST_F(CApi, proj_create_crs_to_crs_from_pj) {
@@ -4918,4 +4979,102 @@ TEST_F(CApi, proj_is_equivalent_to_with_ctx) {
PJ_COMP_EQUIVALENT));
}
+// ---------------------------------------------------------------------------
+
+TEST_F(CApi, datum_ensemble) {
+ auto wkt =
+ "GEOGCRS[\"ETRS89\","
+ " ENSEMBLE[\"European Terrestrial Reference System 1989 ensemble\","
+ " MEMBER[\"European Terrestrial Reference Frame 1989\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 1990\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 1991\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 1992\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 1993\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 1994\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 1996\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 1997\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 2000\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 2005\"],"
+ " MEMBER[\"European Terrestrial Reference Frame 2014\"],"
+ " ELLIPSOID[\"GRS 1980\",6378137,298.257222101,"
+ " LENGTHUNIT[\"metre\",1]],"
+ " ENSEMBLEACCURACY[0.1]],"
+ " PRIMEM[\"Greenwich\",0,"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]],"
+ " CS[ellipsoidal,2],"
+ " AXIS[\"geodetic latitude (Lat)\",north,"
+ " ORDER[1],"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]],"
+ " AXIS[\"geodetic longitude (Lon)\",east,"
+ " ORDER[2],"
+ " ANGLEUNIT[\"degree\",0.0174532925199433]]]";
+ auto from_wkt =
+ proj_create_from_wkt(m_ctxt, wkt, nullptr, nullptr, nullptr);
+ ObjectKeeper keeper_from_wkt(from_wkt);
+ EXPECT_NE(from_wkt, nullptr);
+
+ auto datum = proj_crs_get_datum(m_ctxt, from_wkt);
+ ObjectKeeper keeper_datum(datum);
+ ASSERT_EQ(datum, nullptr);
+
+ auto datum_ensemble = proj_crs_get_datum_ensemble(m_ctxt, from_wkt);
+ ObjectKeeper keeper_datum_ensemble(datum_ensemble);
+ ASSERT_NE(datum_ensemble, nullptr);
+
+ ASSERT_EQ(proj_datum_ensemble_get_member_count(m_ctxt, datum_ensemble), 11);
+ ASSERT_EQ(proj_datum_ensemble_get_member(m_ctxt, datum_ensemble, -1),
+ nullptr);
+ ASSERT_EQ(proj_datum_ensemble_get_member(m_ctxt, datum_ensemble, 11),
+ nullptr);
+
+ {
+ auto member = proj_datum_ensemble_get_member(m_ctxt, datum_ensemble, 0);
+ ObjectKeeper keeper_member(member);
+ ASSERT_NE(member, nullptr);
+
+ EXPECT_EQ(proj_get_name(member),
+ std::string("European Terrestrial Reference Frame 1989"));
+ }
+
+ {
+ auto member =
+ proj_datum_ensemble_get_member(m_ctxt, datum_ensemble, 10);
+ ObjectKeeper keeper_member(member);
+ ASSERT_NE(member, nullptr);
+
+ EXPECT_EQ(proj_get_name(member),
+ std::string("European Terrestrial Reference Frame 2014"));
+ }
+
+ ASSERT_EQ(proj_datum_ensemble_get_accuracy(m_ctxt, datum_ensemble), 0.1);
+
+ auto datum_forced = proj_crs_get_datum_forced(m_ctxt, from_wkt);
+ ObjectKeeper keeper_datum_forced(datum_forced);
+ ASSERT_NE(datum_forced, nullptr);
+
+ EXPECT_EQ(proj_get_name(datum_forced),
+ std::string("European Terrestrial Reference System 1989"));
+
+ auto cs = proj_crs_get_coordinate_system(m_ctxt, from_wkt);
+ ObjectKeeper keeper_cs(cs);
+ EXPECT_NE(cs, nullptr);
+
+ {
+ auto built_crs = proj_create_geographic_crs_from_datum(
+ m_ctxt, proj_get_name(from_wkt), datum_ensemble, cs);
+ ObjectKeeper keeper_built_crs(built_crs);
+ EXPECT_NE(built_crs, nullptr);
+
+ EXPECT_TRUE(proj_is_equivalent_to_with_ctx(m_ctxt, built_crs, from_wkt,
+ PJ_COMP_EQUIVALENT));
+ }
+
+ {
+ auto built_crs = proj_create_geocentric_crs_from_datum(
+ m_ctxt, proj_get_name(from_wkt), datum_ensemble, "metre", 1.0);
+ ObjectKeeper keeper_built_crs(built_crs);
+ EXPECT_NE(built_crs, nullptr);
+ }
+}
+
} // namespace