diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2018-12-13 15:32:24 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2018-12-13 15:32:24 +0100 |
| commit | 6cac8e03056db41a8314756c16507ef39bd78e0a (patch) | |
| tree | 289ef385e8679bec6bd3ffa95926bdf28fab08d4 | |
| parent | 990d88b09839876598c954230ca66fb2604f7545 (diff) | |
| download | PROJ-6cac8e03056db41a8314756c16507ef39bd78e0a.tar.gz PROJ-6cac8e03056db41a8314756c16507ef39bd78e0a.zip | |
Add helpers to create polar cartesian CS
| -rw-r--r-- | include/proj/coordinatesystem.hpp | 6 | ||||
| -rw-r--r-- | src/c_api.cpp | 10 | ||||
| -rw-r--r-- | src/coordinatesystem.cpp | 48 | ||||
| -rw-r--r-- | src/io.cpp | 50 | ||||
| -rw-r--r-- | src/proj_experimental.h | 4 | ||||
| -rw-r--r-- | test/unit/test_c_api.cpp | 31 |
6 files changed, 115 insertions, 34 deletions
diff --git a/include/proj/coordinatesystem.hpp b/include/proj/coordinatesystem.hpp index a301adab..12c3e487 100644 --- a/include/proj/coordinatesystem.hpp +++ b/include/proj/coordinatesystem.hpp @@ -485,6 +485,12 @@ class PROJ_GCC_DLL CartesianCS final : public CoordinateSystem { createNorthingEasting(const common::UnitOfMeasure &unit); PROJ_DLL static CartesianCSNNPtr + createNorthPoleEastingSouthNorthingSouth(const common::UnitOfMeasure &unit); + + PROJ_DLL static CartesianCSNNPtr + createSouthPoleEastingNorthNorthingNorth(const common::UnitOfMeasure &unit); + + PROJ_DLL static CartesianCSNNPtr createGeocentric(const common::UnitOfMeasure &unit); PROJ_PRIVATE : diff --git a/src/c_api.cpp b/src/c_api.cpp index d3aae5ac..a11d5a9b 100644 --- a/src/c_api.cpp +++ b/src/c_api.cpp @@ -2979,6 +2979,16 @@ PJ_OBJ *proj_obj_create_cartesian_2D_cs(PJ_CONTEXT *ctx, case PJ_CART2D_NORTHING_EASTING: return PJ_OBJ::create(CartesianCS::createNorthingEasting( createLinearUnit(unit_name, unit_conv_factor))); + + case PJ_CART2D_NORTH_POLE_EASTING_SOUTH_NORTHING_SOUTH: + return PJ_OBJ::create( + CartesianCS::createNorthPoleEastingSouthNorthingSouth( + createLinearUnit(unit_name, unit_conv_factor))); + + case PJ_CART2D_SOUTH_POLE_EASTING_NORTH_NORTHING_NORTH: + return PJ_OBJ::create( + CartesianCS::createSouthPoleEastingNorthNorthingNorth( + createLinearUnit(unit_name, unit_conv_factor))); } } catch (const std::exception &e) { proj_log_error(ctx, __FUNCTION__, e.what()); diff --git a/src/coordinatesystem.cpp b/src/coordinatesystem.cpp index 2305e6c4..b274f583 100644 --- a/src/coordinatesystem.cpp +++ b/src/coordinatesystem.cpp @@ -947,6 +947,54 @@ CartesianCS::createNorthingEasting(const common::UnitOfMeasure &unit) { // --------------------------------------------------------------------------- +/** \brief Instanciate a CartesianCS, north-pole centered, + * with a Easting (first) South-Oriented and + * Northing (second) South-Oriented axis. + * + * @param unit Linear unit of the axes. + * @return a new CartesianCS. + */ +CartesianCSNNPtr CartesianCS::createNorthPoleEastingSouthNorthingSouth( + const common::UnitOfMeasure &unit) { + return create(util::PropertyMap(), + CoordinateSystemAxis::create( + util::PropertyMap().set(IdentifiedObject::NAME_KEY, + AxisName::Easting), + AxisAbbreviation::E, AxisDirection::SOUTH, unit, + Meridian::create(common::Angle(90))), + CoordinateSystemAxis::create( + util::PropertyMap().set(IdentifiedObject::NAME_KEY, + AxisName::Northing), + AxisAbbreviation::N, AxisDirection::SOUTH, unit, + Meridian::create(common::Angle(180)))); +} + +// --------------------------------------------------------------------------- + +/** \brief Instanciate a CartesianCS, south-pole centered, + * with a Easting (first) North-Oriented and + * Northing (second) North-Oriented axis. + * + * @param unit Linear unit of the axes. + * @return a new CartesianCS. + */ +CartesianCSNNPtr CartesianCS::createSouthPoleEastingNorthNorthingNorth( + const common::UnitOfMeasure &unit) { + return create(util::PropertyMap(), + CoordinateSystemAxis::create( + util::PropertyMap().set(IdentifiedObject::NAME_KEY, + AxisName::Easting), + AxisAbbreviation::E, AxisDirection::NORTH, unit, + Meridian::create(common::Angle(90))), + CoordinateSystemAxis::create( + util::PropertyMap().set(IdentifiedObject::NAME_KEY, + AxisName::Northing), + AxisAbbreviation::N, AxisDirection::NORTH, unit, + Meridian::create(common::Angle(0)))); +} + +// --------------------------------------------------------------------------- + /** \brief Instanciate a CartesianCS with the three geocentric axes. * * @param unit Liinear unit of the axes. @@ -3461,36 +3461,6 @@ WKTParser::Private::buildProjectedCRS(const WKTNodeNNPtr &node) { if (isNull(csNode) && node->countChildrenOfName(WKTConstants::AXIS) == 0) { - const auto createEastingSouthNorthingSouth = [&linearUnit]() { - return CartesianCS::create( - PropertyMap(), - CoordinateSystemAxis::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - AxisName::Easting), - AxisAbbreviation::E, AxisDirection::SOUTH, linearUnit, - Meridian::create(Angle(90, UnitOfMeasure::DEGREE))), - CoordinateSystemAxis::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - AxisName::Northing), - AxisAbbreviation::N, AxisDirection::SOUTH, linearUnit, - Meridian::create(Angle(180, UnitOfMeasure::DEGREE)))); - }; - - const auto createEastingNorthNorthingNorth = [&linearUnit]() { - return CartesianCS::create( - PropertyMap(), - CoordinateSystemAxis::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - AxisName::Easting), - AxisAbbreviation::E, AxisDirection::NORTH, linearUnit, - Meridian::create(Angle(90, UnitOfMeasure::DEGREE))), - CoordinateSystemAxis::create( - util::PropertyMap().set(IdentifiedObject::NAME_KEY, - AxisName::Northing), - AxisAbbreviation::N, AxisDirection::NORTH, linearUnit, - Meridian::create(Angle(0, UnitOfMeasure::DEGREE)))); - }; - const auto methodCode = conversion->method()->getEPSGCode(); // Krovak south oriented ? if (methodCode == EPSG_CODE_METHOD_KROVAK) { @@ -3516,9 +3486,15 @@ WKTParser::Private::buildProjectedCRS(const WKTNodeNNPtr &node) { EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN, common::UnitOfMeasure::DEGREE); if (std::fabs(lat0 - 90) < 1e-10) { - cartesianCS = createEastingSouthNorthingSouth().as_nullable(); + cartesianCS = + CartesianCS::createNorthPoleEastingSouthNorthingSouth( + linearUnit) + .as_nullable(); } else if (std::fabs(lat0 - -90) < 1e-10) { - cartesianCS = createEastingNorthNorthingNorth().as_nullable(); + cartesianCS = + CartesianCS::createSouthPoleEastingNorthNorthingNorth( + linearUnit) + .as_nullable(); } } else if (methodCode == EPSG_CODE_METHOD_POLAR_STEREOGRAPHIC_VARIANT_B) { @@ -3526,9 +3502,15 @@ WKTParser::Private::buildProjectedCRS(const WKTNodeNNPtr &node) { EPSG_CODE_PARAMETER_LATITUDE_STD_PARALLEL, common::UnitOfMeasure::DEGREE); if (lat_ts > 0) { - cartesianCS = createEastingSouthNorthingSouth().as_nullable(); + cartesianCS = + CartesianCS::createNorthPoleEastingSouthNorthingSouth( + linearUnit) + .as_nullable(); } else if (lat_ts < 0) { - cartesianCS = createEastingNorthNorthingNorth().as_nullable(); + cartesianCS = + CartesianCS::createSouthPoleEastingNorthNorthingNorth( + linearUnit) + .as_nullable(); } } } diff --git a/src/proj_experimental.h b/src/proj_experimental.h index c24372af..aeee4e5b 100644 --- a/src/proj_experimental.h +++ b/src/proj_experimental.h @@ -101,6 +101,10 @@ typedef enum PJ_CART2D_EASTING_NORTHING, /* Northing-Easting */ PJ_CART2D_NORTHING_EASTING, + /* North Pole Easting/SOUTH-Norting/SOUTH */ + PJ_CART2D_NORTH_POLE_EASTING_SOUTH_NORTHING_SOUTH, + /* South Pole Easting/NORTH-Norting/NORTH */ + PJ_CART2D_SOUTH_POLE_EASTING_NORTH_NORTHING_NORTH, } PJ_CARTESIAN_CS_2D_TYPE; PJ_OBJ PROJ_DLL *proj_obj_create_cartesian_2D_cs(PJ_CONTEXT *ctx, diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp index 394e87ca..d53f38fd 100644 --- a/test/unit/test_c_api.cpp +++ b/test/unit/test_c_api.cpp @@ -2666,4 +2666,35 @@ TEST_F(CApi, proj_uom_get_info_from_database) { } } +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_obj_create_cartesian_2D_cs) { + { + auto cs = proj_obj_create_cartesian_2D_cs( + m_ctxt, PJ_CART2D_EASTING_NORTHING, nullptr, 0); + ObjectKeeper keeper_cs(cs); + ASSERT_NE(cs, nullptr); + } + { + auto cs = proj_obj_create_cartesian_2D_cs( + m_ctxt, PJ_CART2D_NORTHING_EASTING, nullptr, 0); + ObjectKeeper keeper_cs(cs); + ASSERT_NE(cs, nullptr); + } + { + auto cs = proj_obj_create_cartesian_2D_cs( + m_ctxt, PJ_CART2D_NORTH_POLE_EASTING_SOUTH_NORTHING_SOUTH, nullptr, + 0); + ObjectKeeper keeper_cs(cs); + ASSERT_NE(cs, nullptr); + } + { + auto cs = proj_obj_create_cartesian_2D_cs( + m_ctxt, PJ_CART2D_SOUTH_POLE_EASTING_NORTH_NORTHING_NORTH, nullptr, + 0); + ObjectKeeper keeper_cs(cs); + ASSERT_NE(cs, nullptr); + } +} + } // namespace |
