aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/crs.cpp12
-rw-r--r--src/iso19111/io.cpp32
-rw-r--r--src/iso19111/operation/conversion.cpp2
3 files changed, 42 insertions, 4 deletions
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp
index 598cedad..a12c6aa0 100644
--- a/src/iso19111/crs.cpp
+++ b/src/iso19111/crs.cpp
@@ -2073,8 +2073,16 @@ void GeodeticCRS::_exportToPROJString(
addGeocentricUnitConversionIntoPROJString(formatter);
} else if (isSphericalPlanetocentric()) {
if (!formatter->getCRSExport()) {
- formatter->addStep("geoc");
- addDatumInfoToPROJString(formatter);
+
+ if (!formatter->omitProjLongLatIfPossible() ||
+ primeMeridian()->longitude().getSIValue() != 0.0 ||
+ !ellipsoid()->isSphere() ||
+ !formatter->getTOWGS84Parameters().empty() ||
+ !formatter->getHDatumExtension().empty()) {
+ formatter->addStep("geoc");
+ addDatumInfoToPROJString(formatter);
+ }
+
addAngularUnitConvertAndAxisSwap(formatter);
} else {
io::FormattingException::Throw(
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index d3928a86..b317213a 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -7509,13 +7509,22 @@ const std::string &PROJStringFormatter::toString() const {
const auto paramCount = step.paramValues.size();
- // axisswap order=2,1 is its own inverse
+ // axisswap order=2,1 (or 1,-2) is its own inverse
if (step.name == "axisswap" && paramCount == 1 &&
- step.paramValues[0].equals("order", "2,1")) {
+ (step.paramValues[0].equals("order", "2,1") ||
+ step.paramValues[0].equals("order", "1,-2"))) {
step.inverted = false;
continue;
}
+ // axisswap inv order=2,-1 ==> axisswap order -2,1
+ if (step.name == "axisswap" && paramCount == 1 &&
+ step.paramValues[0].equals("order", "2,-1")) {
+ step.inverted = false;
+ step.paramValues[0] = Step::KeyValue("order", "-2,1");
+ continue;
+ }
+
// handle unitconvert inverse
if (step.name == "unitconvert" && paramCount == 2 &&
step.paramValues[0].keyEquals("xy_in") &&
@@ -7790,6 +7799,25 @@ const std::string &PROJStringFormatter::toString() const {
continue;
}
+ // axisswap order=2,1 followed by axisswap order=2,-1 is
+ // equivalent to axisswap order=1,-2
+ // Same for axisswap order=-2,1 followed by axisswap order=2,1
+ if (curStep.name == "axisswap" && prevStep.name == "axisswap" &&
+ curStepParamCount == 1 && prevStepParamCount == 1 &&
+ ((prevStep.paramValues[0].equals("order", "2,1") &&
+ !curStep.inverted &&
+ curStep.paramValues[0].equals("order", "2,-1")) ||
+ (prevStep.paramValues[0].equals("order", "-2,1") &&
+ !prevStep.inverted &&
+ curStep.paramValues[0].equals("order", "2,1")))) {
+
+ prevStep.inverted = false;
+ prevStep.paramValues[0] = Step::KeyValue("order", "1,-2");
+ // Delete this iter
+ iterCur = steps.erase(iterCur);
+ continue;
+ }
+
// axisswap order=2,1, unitconvert, axisswap order=2,1 -> can
// suppress axisswap
if (std::next(iterCur) != steps.end() &&
diff --git a/src/iso19111/operation/conversion.cpp b/src/iso19111/operation/conversion.cpp
index f7bb8ec8..3db62a7d 100644
--- a/src/iso19111/operation/conversion.cpp
+++ b/src/iso19111/operation/conversion.cpp
@@ -3534,11 +3534,13 @@ void Conversion::_exportToPROJString(
if ((isSrcGeocentricLat && isTargetGeographic) ||
(isSrcGeographic && isTargetGeocentricLat)) {
+ formatter->setOmitProjLongLatIfPossible(true);
formatter->startInversion();
sourceCRSGeod->_exportToPROJString(formatter);
formatter->stopInversion();
targetCRSGeod->_exportToPROJString(formatter);
+ formatter->setOmitProjLongLatIfPossible(false);
return;
}