diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2018-12-14 15:39:54 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2018-12-14 15:39:54 +0100 |
| commit | 1762d1c93c77415e737cbcded2371ad5e22df751 (patch) | |
| tree | 16b4c3190650cd8e287efeeb664cf1dd037e3aad | |
| parent | ba313759523d6d24f7e027f5ddae230656141b3b (diff) | |
| download | PROJ-1762d1c93c77415e737cbcded2371ad5e22df751.tar.gz PROJ-1762d1c93c77415e737cbcded2371ad5e22df751.zip | |
proj_obj_crs_alter_cs_XXX: add new parameters to set unit id
| -rw-r--r-- | src/c_api.cpp | 55 | ||||
| -rw-r--r-- | src/proj_experimental.h | 17 | ||||
| -rw-r--r-- | test/unit/test_c_api.cpp | 124 |
3 files changed, 138 insertions, 58 deletions
diff --git a/src/c_api.cpp b/src/c_api.cpp index aa9d7e70..d4e5c5db 100644 --- a/src/c_api.cpp +++ b/src/c_api.cpp @@ -2019,21 +2019,30 @@ static PropertyMap createPropertyMapName(const char *c_name) { // --------------------------------------------------------------------------- -static UnitOfMeasure createLinearUnit(const char *name, double convFactor) { +static UnitOfMeasure createLinearUnit(const char *name, double convFactor, + const char *unit_auth_name = nullptr, + const char *unit_code = nullptr) { return name == nullptr ? UnitOfMeasure::METRE - : UnitOfMeasure(name, convFactor, UnitOfMeasure::Type::LINEAR); + : UnitOfMeasure(name, convFactor, UnitOfMeasure::Type::LINEAR, + unit_auth_name ? unit_auth_name : "", + unit_code ? unit_code : ""); } // --------------------------------------------------------------------------- -static UnitOfMeasure createAngularUnit(const char *name, double convFactor) { +static UnitOfMeasure createAngularUnit(const char *name, double convFactor, + const char *unit_auth_name = nullptr, + const char *unit_code = nullptr) { return name ? (ci_equal(name, "degree") ? UnitOfMeasure::DEGREE : ci_equal(name, "grad") ? UnitOfMeasure::GRAD : UnitOfMeasure(name, convFactor, - UnitOfMeasure::Type::ANGULAR)) + UnitOfMeasure::Type::ANGULAR, + unit_auth_name ? unit_auth_name + : "", + unit_code ? unit_code : "")) : UnitOfMeasure::DEGREE; } @@ -2506,15 +2515,18 @@ PJ_OBJ *proj_obj_crs_alter_geodetic_crs(PJ_CONTEXT *ctx, const PJ_OBJ *obj, * @param obj Object of type CRS. Must not be NULL * @param angular_units Name of the angular units. Or NULL for Degree * @param angular_units_conv Conversion factor from the angular unit to radian. - * Or - * 0 for Degree if angular_units == NULL. Otherwise should be not NULL + * Or 0 for Degree if angular_units == NULL. Otherwise should be not NULL + * @param unit_auth_name Unit authority name. Or NULL. + * @param unit_code Unit code. Or NULL. * * @return Object that must be unreferenced with * proj_obj_destroy(), or NULL in case of error. */ PJ_OBJ *proj_obj_crs_alter_cs_angular_unit(PJ_CONTEXT *ctx, const PJ_OBJ *obj, const char *angular_units, - double angular_units_conv) { + double angular_units_conv, + const char *unit_auth_name, + const char *unit_code) { SANITIZE_CTX(ctx); auto geodCRS = proj_obj_crs_get_geodetic_crs(ctx, obj); @@ -2529,8 +2541,8 @@ PJ_OBJ *proj_obj_crs_alter_cs_angular_unit(PJ_CONTEXT *ctx, const PJ_OBJ *obj, PJ_OBJ *geogCRSAltered = nullptr; try { - const UnitOfMeasure angUnit( - createAngularUnit(angular_units, angular_units_conv)); + const UnitOfMeasure angUnit(createAngularUnit( + angular_units, angular_units_conv, unit_auth_name, unit_code)); geogCRSAltered = PJ_OBJ::create(GeographicCRS::create( createPropertyMapName(proj_obj_get_name(geodCRS)), geogCRS->datum(), geogCRS->datumEnsemble(), @@ -2563,13 +2575,17 @@ PJ_OBJ *proj_obj_crs_alter_cs_angular_unit(PJ_CONTEXT *ctx, const PJ_OBJ *obj, * @param linear_units Name of the linear units. Or NULL for Metre * @param linear_units_conv Conversion factor from the linear unit to metre. Or * 0 for Metre if linear_units == NULL. Otherwise should be not NULL + * @param unit_auth_name Unit authority name. Or NULL. + * @param unit_code Unit code. Or NULL. * * @return Object that must be unreferenced with * proj_obj_destroy(), or NULL in case of error. */ PJ_OBJ *proj_obj_crs_alter_cs_linear_unit(PJ_CONTEXT *ctx, const PJ_OBJ *obj, const char *linear_units, - double linear_units_conv) { + double linear_units_conv, + const char *unit_auth_name, + const char *unit_code) { SANITIZE_CTX(ctx); auto crs = dynamic_cast<const CRS *>(obj->obj.get()); if (!crs) { @@ -2577,8 +2593,8 @@ PJ_OBJ *proj_obj_crs_alter_cs_linear_unit(PJ_CONTEXT *ctx, const PJ_OBJ *obj, } try { - const UnitOfMeasure linearUnit( - createLinearUnit(linear_units, linear_units_conv)); + const UnitOfMeasure linearUnit(createLinearUnit( + linear_units, linear_units_conv, unit_auth_name, unit_code)); return PJ_OBJ::create(crs->alterCSLinearUnit(linearUnit)); } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); @@ -2602,6 +2618,8 @@ PJ_OBJ *proj_obj_crs_alter_cs_linear_unit(PJ_CONTEXT *ctx, const PJ_OBJ *obj, * @param linear_units Name of the linear units. Or NULL for Metre * @param linear_units_conv Conversion factor from the linear unit to metre. Or * 0 for Metre if linear_units == NULL. Otherwise should be not NULL + * @param unit_auth_name Unit authority name. Or NULL. + * @param unit_code Unit code. Or NULL. * @param convert_to_new_unit TRUE if exisiting values should be converted from * their current unit to the new unit. If FALSE, their value will be left * unchanged and the unit overriden (so the resulting CRS will not be @@ -2610,11 +2628,10 @@ PJ_OBJ *proj_obj_crs_alter_cs_linear_unit(PJ_CONTEXT *ctx, const PJ_OBJ *obj, * @return Object that must be unreferenced with * proj_obj_destroy(), or NULL in case of error. */ -PJ_OBJ *proj_obj_crs_alter_parameters_linear_unit(PJ_CONTEXT *ctx, - const PJ_OBJ *obj, - const char *linear_units, - double linear_units_conv, - int convert_to_new_unit) { +PJ_OBJ *proj_obj_crs_alter_parameters_linear_unit( + PJ_CONTEXT *ctx, const PJ_OBJ *obj, const char *linear_units, + double linear_units_conv, const char *unit_auth_name, const char *unit_code, + int convert_to_new_unit) { SANITIZE_CTX(ctx); auto crs = dynamic_cast<const ProjectedCRS *>(obj->obj.get()); if (!crs) { @@ -2622,8 +2639,8 @@ PJ_OBJ *proj_obj_crs_alter_parameters_linear_unit(PJ_CONTEXT *ctx, } try { - const UnitOfMeasure linearUnit( - createLinearUnit(linear_units, linear_units_conv)); + const UnitOfMeasure linearUnit(createLinearUnit( + linear_units, linear_units_conv, unit_auth_name, unit_code)); return PJ_OBJ::create(crs->alterParametersLinearUnit( linearUnit, convert_to_new_unit == TRUE)); } catch (const std::exception &e) { diff --git a/src/proj_experimental.h b/src/proj_experimental.h index f3f5c529..9c72dbfe 100644 --- a/src/proj_experimental.h +++ b/src/proj_experimental.h @@ -189,17 +189,24 @@ PJ_OBJ PROJ_DLL *proj_obj_crs_alter_geodetic_crs(PJ_CONTEXT *ctx, PJ_OBJ PROJ_DLL *proj_obj_crs_alter_cs_angular_unit(PJ_CONTEXT *ctx, const PJ_OBJ* obj, const char *angular_units, - double angular_units_conv); + double angular_units_conv, + const char *unit_auth_name, + const char *unit_code); PJ_OBJ PROJ_DLL *proj_obj_crs_alter_cs_linear_unit(PJ_CONTEXT *ctx, const PJ_OBJ* obj, - const char *linear_units, - double linear_units_conv); + const char *linear_units, + double linear_units_conv, + const char *unit_auth_name, + const char *unit_code); -PJ_OBJ PROJ_DLL *proj_obj_crs_alter_parameters_linear_unit(PJ_CONTEXT *ctx, - const PJ_OBJ* obj, +PJ_OBJ PROJ_DLL *proj_obj_crs_alter_parameters_linear_unit( + PJ_CONTEXT *ctx, + const PJ_OBJ* obj, const char *linear_units, double linear_units_conv, + const char *unit_auth_name, + const char *unit_code, int convert_to_new_unit); PJ_OBJ PROJ_DLL *proj_obj_create_engineering_crs(PJ_CONTEXT *ctx, diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp index 4c1faf87..7df7442a 100644 --- a/test/unit/test_c_api.cpp +++ b/test/unit/test_c_api.cpp @@ -2310,23 +2310,51 @@ TEST_F(CApi, proj_obj_crs_alter_cs_angular_unit) { ObjectKeeper keeper(crs); ASSERT_NE(crs, nullptr); - auto alteredCRS = - proj_obj_crs_alter_cs_angular_unit(m_ctxt, crs, "my unit", 2); - ObjectKeeper keeper_alteredCRS(alteredCRS); - ASSERT_NE(alteredCRS, nullptr); + { + auto alteredCRS = proj_obj_crs_alter_cs_angular_unit( + m_ctxt, crs, "my unit", 2, nullptr, nullptr); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); - auto cs = proj_obj_crs_get_coordinate_system(m_ctxt, alteredCRS); - ASSERT_NE(cs, nullptr); - ObjectKeeper keeperCs(cs); - double unitConvFactor = 0.0; - const char *unitName = nullptr; - - EXPECT_TRUE(proj_obj_cs_get_axis_info(m_ctxt, cs, 0, nullptr, nullptr, - nullptr, &unitConvFactor, &unitName, - nullptr, nullptr)); - ASSERT_NE(unitName, nullptr); - EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; - EXPECT_EQ(std::string(unitName), "my unit"); + auto cs = proj_obj_crs_get_coordinate_system(m_ctxt, alteredCRS); + ASSERT_NE(cs, nullptr); + ObjectKeeper keeperCs(cs); + double unitConvFactor = 0.0; + const char *unitName = nullptr; + + EXPECT_TRUE(proj_obj_cs_get_axis_info(m_ctxt, cs, 0, nullptr, nullptr, + nullptr, &unitConvFactor, + &unitName, nullptr, nullptr)); + ASSERT_NE(unitName, nullptr); + EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; + EXPECT_EQ(std::string(unitName), "my unit"); + } + + { + auto alteredCRS = proj_obj_crs_alter_cs_angular_unit( + m_ctxt, crs, "my unit", 2, "my auth", "my code"); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); + + auto cs = proj_obj_crs_get_coordinate_system(m_ctxt, alteredCRS); + ASSERT_NE(cs, nullptr); + ObjectKeeper keeperCs(cs); + double unitConvFactor = 0.0; + const char *unitName = nullptr; + const char *unitAuthName = nullptr; + const char *unitCode = nullptr; + + EXPECT_TRUE(proj_obj_cs_get_axis_info( + m_ctxt, cs, 0, nullptr, nullptr, nullptr, &unitConvFactor, + &unitName, &unitAuthName, &unitCode)); + ASSERT_NE(unitName, nullptr); + EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; + EXPECT_EQ(std::string(unitName), "my unit"); + ASSERT_NE(unitAuthName, nullptr); + EXPECT_EQ(std::string(unitAuthName), "my auth"); + ASSERT_NE(unitCode, nullptr); + EXPECT_EQ(std::string(unitCode), "my code"); + } } // --------------------------------------------------------------------------- @@ -2339,23 +2367,51 @@ TEST_F(CApi, proj_obj_crs_alter_cs_linear_unit) { ObjectKeeper keeper(crs); ASSERT_NE(crs, nullptr); - auto alteredCRS = - proj_obj_crs_alter_cs_linear_unit(m_ctxt, crs, "my unit", 2); - ObjectKeeper keeper_alteredCRS(alteredCRS); - ASSERT_NE(alteredCRS, nullptr); + { + auto alteredCRS = proj_obj_crs_alter_cs_linear_unit( + m_ctxt, crs, "my unit", 2, nullptr, nullptr); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); - auto cs = proj_obj_crs_get_coordinate_system(m_ctxt, alteredCRS); - ASSERT_NE(cs, nullptr); - ObjectKeeper keeperCs(cs); - double unitConvFactor = 0.0; - const char *unitName = nullptr; - - EXPECT_TRUE(proj_obj_cs_get_axis_info(m_ctxt, cs, 0, nullptr, nullptr, - nullptr, &unitConvFactor, &unitName, - nullptr, nullptr)); - ASSERT_NE(unitName, nullptr); - EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; - EXPECT_EQ(std::string(unitName), "my unit"); + auto cs = proj_obj_crs_get_coordinate_system(m_ctxt, alteredCRS); + ASSERT_NE(cs, nullptr); + ObjectKeeper keeperCs(cs); + double unitConvFactor = 0.0; + const char *unitName = nullptr; + + EXPECT_TRUE(proj_obj_cs_get_axis_info(m_ctxt, cs, 0, nullptr, nullptr, + nullptr, &unitConvFactor, + &unitName, nullptr, nullptr)); + ASSERT_NE(unitName, nullptr); + EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; + EXPECT_EQ(std::string(unitName), "my unit"); + } + + { + auto alteredCRS = proj_obj_crs_alter_cs_linear_unit( + m_ctxt, crs, "my unit", 2, "my auth", "my code"); + ObjectKeeper keeper_alteredCRS(alteredCRS); + ASSERT_NE(alteredCRS, nullptr); + + auto cs = proj_obj_crs_get_coordinate_system(m_ctxt, alteredCRS); + ASSERT_NE(cs, nullptr); + ObjectKeeper keeperCs(cs); + double unitConvFactor = 0.0; + const char *unitName = nullptr; + const char *unitAuthName = nullptr; + const char *unitCode = nullptr; + + EXPECT_TRUE(proj_obj_cs_get_axis_info( + m_ctxt, cs, 0, nullptr, nullptr, nullptr, &unitConvFactor, + &unitName, &unitAuthName, &unitCode)); + ASSERT_NE(unitName, nullptr); + EXPECT_EQ(unitConvFactor, 2) << unitConvFactor; + EXPECT_EQ(std::string(unitName), "my unit"); + ASSERT_NE(unitAuthName, nullptr); + EXPECT_EQ(std::string(unitAuthName), "my auth"); + ASSERT_NE(unitCode, nullptr); + EXPECT_EQ(std::string(unitCode), "my code"); + } } // --------------------------------------------------------------------------- @@ -2370,7 +2426,7 @@ TEST_F(CApi, proj_obj_crs_alter_parameters_linear_unit) { { auto alteredCRS = proj_obj_crs_alter_parameters_linear_unit( - m_ctxt, crs, "my unit", 2, false); + m_ctxt, crs, "my unit", 2, nullptr, nullptr, false); ObjectKeeper keeper_alteredCRS(alteredCRS); ASSERT_NE(alteredCRS, nullptr); @@ -2384,7 +2440,7 @@ TEST_F(CApi, proj_obj_crs_alter_parameters_linear_unit) { { auto alteredCRS = proj_obj_crs_alter_parameters_linear_unit( - m_ctxt, crs, "my unit", 2, true); + m_ctxt, crs, "my unit", 2, nullptr, nullptr, true); ObjectKeeper keeper_alteredCRS(alteredCRS); ASSERT_NE(alteredCRS, nullptr); |
