aboutsummaryrefslogtreecommitdiff
path: root/src/coordinatesystem.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-11-28 14:52:56 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-11-29 12:10:13 +0100
commitcf855b24d2b901054bee90309cdc5df00dfb3085 (patch)
treecfed6be67bd51c6e8cd198def30d840fe9f67a89 /src/coordinatesystem.cpp
parent6d9a1a909886762cc99e1d8f289e2b60ea787bf7 (diff)
downloadPROJ-cf855b24d2b901054bee90309cdc5df00dfb3085.tar.gz
PROJ-cf855b24d2b901054bee90309cdc5df00dfb3085.zip
C API extensions and renaming
- proj_obj_create_projected_XXXXX() are renamed to proj_obj_create_conversion_snake_case() and just instanciate a Conversion object - Advanced manipulation functions are moved to a dedicated section at bottom of proj.h - New C API needed for GDAL OGRSpatialReference
Diffstat (limited to 'src/coordinatesystem.cpp')
-rw-r--r--src/coordinatesystem.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/coordinatesystem.cpp b/src/coordinatesystem.cpp
index f8d2d2b3..f1220878 100644
--- a/src/coordinatesystem.cpp
+++ b/src/coordinatesystem.cpp
@@ -416,6 +416,16 @@ bool CoordinateSystemAxis::_isEquivalentTo(
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
+CoordinateSystemAxisNNPtr
+CoordinateSystemAxis::alterUnit(const common::UnitOfMeasure &newUnit) const {
+ return create(util::PropertyMap().set(IdentifiedObject::NAME_KEY, name()),
+ abbreviation(), direction(), newUnit, meridian());
+}
+//! @endcond
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
struct CoordinateSystem::Private {
std::vector<CoordinateSystemAxisNNPtr> axisList{};
@@ -738,6 +748,43 @@ EllipsoidalCS::AxisOrder EllipsoidalCS::axisOrder() const {
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
+EllipsoidalCSNNPtr EllipsoidalCS::alterAngularUnit(
+ const common::UnitOfMeasure &angularUnit) const {
+ const auto &l_axisList = CoordinateSystem::getPrivate()->axisList;
+ if (l_axisList.size() == 2) {
+ return EllipsoidalCS::create(util::PropertyMap(),
+ l_axisList[0]->alterUnit(angularUnit),
+ l_axisList[1]->alterUnit(angularUnit));
+ } else {
+ assert(l_axisList.size() == 3);
+ return EllipsoidalCS::create(
+ util::PropertyMap(), l_axisList[0]->alterUnit(angularUnit),
+ l_axisList[1]->alterUnit(angularUnit), l_axisList[2]);
+ }
+}
+//! @endcond
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
+EllipsoidalCSNNPtr
+EllipsoidalCS::alterLinearUnit(const common::UnitOfMeasure &linearUnit) const {
+ const auto &l_axisList = CoordinateSystem::getPrivate()->axisList;
+ if (l_axisList.size() == 2) {
+ return EllipsoidalCS::create(util::PropertyMap(), l_axisList[0],
+ l_axisList[1]);
+ } else {
+ assert(l_axisList.size() == 3);
+ return EllipsoidalCS::create(util::PropertyMap(), l_axisList[0],
+ l_axisList[1],
+ l_axisList[2]->alterUnit(linearUnit));
+ }
+}
+//! @endcond
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
VerticalCS::~VerticalCS() = default;
//! @endcond
@@ -788,6 +835,16 @@ VerticalCS::createGravityRelatedHeight(const common::UnitOfMeasure &unit) {
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
+VerticalCSNNPtr VerticalCS::alterUnit(const common::UnitOfMeasure &unit) const {
+ const auto &l_axisList = CoordinateSystem::getPrivate()->axisList;
+ return VerticalCS::nn_make_shared<VerticalCS>(
+ l_axisList[0]->alterUnit(unit));
+}
+//! @endcond
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
CartesianCS::~CartesianCS() = default;
//! @endcond
@@ -863,6 +920,27 @@ CartesianCS::createEastingNorthing(const common::UnitOfMeasure &unit) {
// ---------------------------------------------------------------------------
+/** \brief Instanciate a CartesianCS with a Northing (first) and Easting
+ * (second) axis.
+ *
+ * @param unit Linear unit of the axes.
+ * @return a new CartesianCS.
+ */
+CartesianCSNNPtr
+CartesianCS::createNorthingEasting(const common::UnitOfMeasure &unit) {
+ return create(util::PropertyMap(),
+ CoordinateSystemAxis::create(
+ util::PropertyMap().set(IdentifiedObject::NAME_KEY,
+ AxisName::Northing),
+ AxisAbbreviation::N, AxisDirection::NORTH, unit),
+ CoordinateSystemAxis::create(
+ util::PropertyMap().set(IdentifiedObject::NAME_KEY,
+ AxisName::Easting),
+ AxisAbbreviation::E, AxisDirection::EAST, unit));
+}
+
+// ---------------------------------------------------------------------------
+
/** \brief Instanciate a CartesianCS with the three geocentric axes.
*
* @param unit Liinear unit of the axes.
@@ -888,6 +966,25 @@ CartesianCS::createGeocentric(const common::UnitOfMeasure &unit) {
// ---------------------------------------------------------------------------
//! @cond Doxygen_Suppress
+CartesianCSNNPtr
+CartesianCS::alterUnit(const common::UnitOfMeasure &unit) const {
+ const auto &l_axisList = CoordinateSystem::getPrivate()->axisList;
+ if (l_axisList.size() == 2) {
+ return CartesianCS::create(util::PropertyMap(),
+ l_axisList[0]->alterUnit(unit),
+ l_axisList[1]->alterUnit(unit));
+ } else {
+ assert(l_axisList.size() == 3);
+ return CartesianCS::create(
+ util::PropertyMap(), l_axisList[0]->alterUnit(unit),
+ l_axisList[1]->alterUnit(unit), l_axisList[2]->alterUnit(unit));
+ }
+}
+//! @endcond
+
+// ---------------------------------------------------------------------------
+
+//! @cond Doxygen_Suppress
OrdinalCS::~OrdinalCS() = default;
//! @endcond