aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-13 15:32:24 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-13 15:32:24 +0100
commit6cac8e03056db41a8314756c16507ef39bd78e0a (patch)
tree289ef385e8679bec6bd3ffa95926bdf28fab08d4 /src
parent990d88b09839876598c954230ca66fb2604f7545 (diff)
downloadPROJ-6cac8e03056db41a8314756c16507ef39bd78e0a.tar.gz
PROJ-6cac8e03056db41a8314756c16507ef39bd78e0a.zip
Add helpers to create polar cartesian CS
Diffstat (limited to 'src')
-rw-r--r--src/c_api.cpp10
-rw-r--r--src/coordinatesystem.cpp48
-rw-r--r--src/io.cpp50
-rw-r--r--src/proj_experimental.h4
4 files changed, 78 insertions, 34 deletions
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.
diff --git a/src/io.cpp b/src/io.cpp
index f25ece48..1700b1e3 100644
--- a/src/io.cpp
+++ b/src/io.cpp
@@ -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,