aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-14 15:39:54 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-14 15:39:54 +0100
commit1762d1c93c77415e737cbcded2371ad5e22df751 (patch)
tree16b4c3190650cd8e287efeeb664cf1dd037e3aad
parentba313759523d6d24f7e027f5ddae230656141b3b (diff)
downloadPROJ-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.cpp55
-rw-r--r--src/proj_experimental.h17
-rw-r--r--test/unit/test_c_api.cpp124
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);