diff options
Diffstat (limited to 'test/unit/test_c_api.cpp')
| -rw-r--r-- | test/unit/test_c_api.cpp | 191 |
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 |
