aboutsummaryrefslogtreecommitdiff
path: root/src/io.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-13 13:00:47 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-13 13:00:47 +0100
commit37c7893bb460bb13673752673ece3f3d6933807d (patch)
tree3a205af32601de0992a35213a2b63385ff1170c9 /src/io.cpp
parentfdbbe7da6de1a464172a644f92753ea435019b78 (diff)
downloadPROJ-37c7893bb460bb13673752673ece3f3d6933807d.tar.gz
PROJ-37c7893bb460bb13673752673ece3f3d6933807d.zip
import from WKT1: fix axis direction when importing from Polar Stereographic variant B
Diffstat (limited to 'src/io.cpp')
-rw-r--r--src/io.cpp81
1 files changed, 46 insertions, 35 deletions
diff --git a/src/io.cpp b/src/io.cpp
index b5da2b8c..f25ece48 100644
--- a/src/io.cpp
+++ b/src/io.cpp
@@ -3460,6 +3460,37 @@ 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) {
@@ -3475,49 +3506,29 @@ WKTParser::Private::buildProjectedCRS(const WKTNodeNNPtr &node) {
AxisName::Westing),
emptyString, AxisDirection::WEST, linearUnit))
.as_nullable();
- } else if (esriStyle_ &&
- methodCode ==
- EPSG_CODE_METHOD_POLAR_STEREOGRAPHIC_VARIANT_A) {
+ } else if (methodCode ==
+ EPSG_CODE_METHOD_POLAR_STEREOGRAPHIC_VARIANT_A) {
// It is likely that the ESRI definition of EPSG:32661 (UPS North) &
// EPSG:32761 (UPS South) uses the easting-northing order, instead
// of the EPSG northing-easting order.
+ // Same for WKT1_GDAL
const double lat0 = conversion->parameterValueNumeric(
EPSG_CODE_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN,
common::UnitOfMeasure::DEGREE);
if (std::fabs(lat0 - 90) < 1e-10) {
- cartesianCS =
- 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))))
- .as_nullable();
+ cartesianCS = createEastingSouthNorthingSouth().as_nullable();
} else if (std::fabs(lat0 - -90) < 1e-10) {
- cartesianCS =
- 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))))
- .as_nullable();
+ cartesianCS = createEastingNorthNorthingNorth().as_nullable();
+ }
+ } else if (methodCode ==
+ EPSG_CODE_METHOD_POLAR_STEREOGRAPHIC_VARIANT_B) {
+ const double lat_ts = conversion->parameterValueNumeric(
+ EPSG_CODE_PARAMETER_LATITUDE_STD_PARALLEL,
+ common::UnitOfMeasure::DEGREE);
+ if (lat_ts > 0) {
+ cartesianCS = createEastingSouthNorthingSouth().as_nullable();
+ } else if (lat_ts < 0) {
+ cartesianCS = createEastingNorthNorthingNorth().as_nullable();
}
}
}