aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/coordinateoperation.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-01-08 16:22:15 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-01-08 21:25:07 +0100
commitf5e5435fd5071d550e0d13f7a5d71e09c1fab2c0 (patch)
treef569d5270f7cb34adf056d04c84a23db6b4f6ed0 /src/iso19111/coordinateoperation.cpp
parentfdee4277efb45b07db2dcc4d93376cbd01cfbd0a (diff)
downloadPROJ-f5e5435fd5071d550e0d13f7a5d71e09c1fab2c0.tar.gz
PROJ-f5e5435fd5071d550e0d13f7a5d71e09c1fab2c0.zip
ISO19111: remove PROJ.5 specific format for CRS (refs #1214)
As discussed in https://github.com/OSGeo/proj.4/issues/1214#issuecomment-452084720, the introduction of a new PROJ.5 format to export CRS using pipeline/unitconvert/axisswap as an attempt of improving the PROJ.4 format used by GDAL and other products is likely a dead-end since it is still lossy in many aspects and can cause confusion with coodinate operations. Consequently the PROJ_5 convention will be identical to PROJ_4 for CRS export. Note: on the import side, I've kept the code that could parse unitconvert and axisswap when building a CRS definition from a pipeline. It is there as a hidden feature as it was kind of a tear to remove that code in case it might still be useful...
Diffstat (limited to 'src/iso19111/coordinateoperation.cpp')
-rw-r--r--src/iso19111/coordinateoperation.cpp64
1 files changed, 27 insertions, 37 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp
index d00be93f..47f10392 100644
--- a/src/iso19111/coordinateoperation.cpp
+++ b/src/iso19111/coordinateoperation.cpp
@@ -5377,8 +5377,8 @@ bool Conversion::addWKTExtensionNode(io::WKTFormatter *formatter) const {
bool north = true;
if (l_method->getPrivate()->projMethodOverride_ == "etmerc" &&
!isUTM(zone, north)) {
- auto projFormatter = io::PROJStringFormatter::create(
- io::PROJStringFormatter::Convention::PROJ_4);
+ auto projFormatter = io::PROJStringFormatter::create();
+ projFormatter->setCRSExport(true);
projFormatter->setUseETMercForTMerc(true);
formatter->startNode(io::WKTConstants::EXTENSION, false);
formatter->addQuotedString("PROJ4");
@@ -5391,8 +5391,8 @@ bool Conversion::addWKTExtensionNode(io::WKTFormatter *formatter) const {
EPSG_CODE_METHOD_POPULAR_VISUALISATION_PSEUDO_MERCATOR ||
nameStr() == "Popular Visualisation Mercator") {
- auto projFormatter = io::PROJStringFormatter::create(
- io::PROJStringFormatter::Convention::PROJ_4);
+ auto projFormatter = io::PROJStringFormatter::create();
+ projFormatter->setCRSExport(true);
if (createPROJ4WebMercator(this, projFormatter.get())) {
formatter->startNode(io::WKTConstants::EXTENSION, false);
formatter->addQuotedString("PROJ4");
@@ -5401,8 +5401,8 @@ bool Conversion::addWKTExtensionNode(io::WKTFormatter *formatter) const {
return true;
}
} else if (starts_with(methodName, "PROJ ")) {
- auto projFormatter = io::PROJStringFormatter::create(
- io::PROJStringFormatter::Convention::PROJ_4);
+ auto projFormatter = io::PROJStringFormatter::create();
+ projFormatter->setCRSExport(true);
if (createPROJExtensionFromCustomProj(this, projFormatter.get(),
true)) {
formatter->startNode(io::WKTConstants::EXTENSION, false);
@@ -5413,8 +5413,8 @@ bool Conversion::addWKTExtensionNode(io::WKTFormatter *formatter) const {
}
} else if (methodName ==
PROJ_WKT2_NAME_METHOD_GEOSTATIONARY_SATELLITE_SWEEP_X) {
- auto projFormatter = io::PROJStringFormatter::create(
- io::PROJStringFormatter::Convention::PROJ_4);
+ auto projFormatter = io::PROJStringFormatter::create();
+ projFormatter->setCRSExport(true);
formatter->startNode(io::WKTConstants::EXTENSION, false);
formatter->addQuotedString("PROJ4");
_exportToPROJString(projFormatter.get());
@@ -5445,12 +5445,10 @@ void Conversion::_exportToPROJString(
const bool applySourceCRSModifiers =
!isZUnitConversion && !isAffineParametric &&
!isAxisOrderReversal(methodEPSGCode) && !isGeographicGeocentric;
- const bool applyTargetCRSModifiers = applySourceCRSModifiers;
+ bool applyTargetCRSModifiers = applySourceCRSModifiers;
auto l_sourceCRS = sourceCRS();
- if (l_sourceCRS && applySourceCRSModifiers &&
- formatter->convention() ==
- io::PROJStringFormatter::Convention::PROJ_5) {
+ if (!formatter->getCRSExport() && l_sourceCRS && applySourceCRSModifiers) {
auto geogCRS =
dynamic_cast<const crs::GeographicCRS *>(l_sourceCRS.get());
if (geogCRS) {
@@ -5593,8 +5591,7 @@ void Conversion::_exportToPROJString(
EPSG_NAME_PARAMETER_LATITUDE_OF_NATURAL_ORIGIN);
}
// PROJ.4 specific hack for webmercator
- } else if (formatter->convention() ==
- io::PROJStringFormatter::Convention::PROJ_4 &&
+ } else if (formatter->getCRSExport() &&
methodEPSGCode ==
EPSG_CODE_METHOD_POPULAR_VISUALISATION_PSEUDO_MERCATOR) {
if (!createPROJ4WebMercator(this, formatter)) {
@@ -5605,14 +5602,15 @@ void Conversion::_exportToPROJString(
}
bConversionDone = true;
bEllipsoidParametersDone = true;
+ applyTargetCRSModifiers = false;
} else if (ci_equal(convName, "Popular Visualisation Mercator")) {
- if (formatter->convention() ==
- io::PROJStringFormatter::Convention::PROJ_4) {
+ if (formatter->getCRSExport()) {
if (!createPROJ4WebMercator(this, formatter)) {
throw io::FormattingException(concat(
"Cannot export ", convName,
" as PROJ.4 string outside of a ProjectedCRS context"));
}
+ applyTargetCRSModifiers = false;
} else {
formatter->addStep("webmerc");
if (l_sourceCRS) {
@@ -5717,8 +5715,7 @@ void Conversion::_exportToPROJString(
if (!bEllipsoidParametersDone) {
auto targetGeogCRS = l_targetCRS->extractGeographicCRS();
if (targetGeogCRS) {
- if (formatter->convention() ==
- io::PROJStringFormatter::Convention::PROJ_4) {
+ if (formatter->getCRSExport()) {
targetGeogCRS->addDatumInfoToPROJString(formatter);
} else {
targetGeogCRS->ellipsoid()->_exportToPROJString(formatter);
@@ -5737,13 +5734,10 @@ void Conversion::_exportToPROJString(
auto derivedGeographicCRS =
dynamic_cast<const crs::DerivedGeographicCRS *>(l_targetCRS.get());
if (derivedGeographicCRS) {
- if (formatter->convention() ==
- io::PROJStringFormatter::Convention::PROJ_5) {
- auto geogCRS = derivedGeographicCRS->baseCRS();
- formatter->setOmitProjLongLatIfPossible(true);
- geogCRS->_exportToPROJString(formatter);
- formatter->setOmitProjLongLatIfPossible(false);
- }
+ auto baseGeodCRS = derivedGeographicCRS->baseCRS();
+ formatter->setOmitProjLongLatIfPossible(true);
+ baseGeodCRS->_exportToPROJString(formatter);
+ formatter->setOmitProjLongLatIfPossible(false);
}
}
}
@@ -11104,31 +11098,27 @@ CoordinateOperationFactory::Private::createOperations(
if (!targetProjExportable) {
throw InvalidOperation("Target CRS is not PROJ exportable");
}
- auto projFormatter = io::PROJStringFormatter::create(
- io::PROJStringFormatter::Convention::PROJ_4);
+ auto projFormatter = io::PROJStringFormatter::create();
+ projFormatter->setCRSExport(true);
projFormatter->startInversion();
sourceProjExportable->_exportToPROJString(projFormatter.get());
-
auto geogSrc =
dynamic_cast<const crs::GeographicCRS *>(sourceCRS.get());
if (geogSrc) {
- auto proj5Formatter = io::PROJStringFormatter::create(
- io::PROJStringFormatter::Convention::PROJ_5);
- geogSrc->addAngularUnitConvertAndAxisSwap(proj5Formatter.get());
- projFormatter->ingestPROJString(proj5Formatter->toString());
+ auto tmpFormatter = io::PROJStringFormatter::create();
+ geogSrc->addAngularUnitConvertAndAxisSwap(tmpFormatter.get());
+ projFormatter->ingestPROJString(tmpFormatter->toString());
}
projFormatter->stopInversion();
targetProjExportable->_exportToPROJString(projFormatter.get());
-
auto geogDst =
dynamic_cast<const crs::GeographicCRS *>(targetCRS.get());
if (geogDst) {
- auto proj5Formatter = io::PROJStringFormatter::create(
- io::PROJStringFormatter::Convention::PROJ_5);
- geogDst->addAngularUnitConvertAndAxisSwap(proj5Formatter.get());
- projFormatter->ingestPROJString(proj5Formatter->toString());
+ auto tmpFormatter = io::PROJStringFormatter::create();
+ geogDst->addAngularUnitConvertAndAxisSwap(tmpFormatter.get());
+ projFormatter->ingestPROJString(tmpFormatter->toString());
}
const auto PROJString = projFormatter->toString();