aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-01-10 18:31:31 +0100
committerEven Rouault <even.rouault@spatialys.com>2020-01-11 11:59:21 +0100
commit6a2ee6fbc8a9ce915df8da36df8b041ee6573e05 (patch)
tree6c558199d61e5da46b4b1db4eb0475fc5d432683 /src
parent7d46771382e394586477b0edd7833a89369bb248 (diff)
downloadPROJ-6a2ee6fbc8a9ce915df8da36df8b041ee6573e05.tar.gz
PROJ-6a2ee6fbc8a9ce915df8da36df8b041ee6573e05.zip
createOperations(): fix dealing with projected 3D CRS whose Z units != metre
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/crs.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp
index cf90c388..76fbc4bd 100644
--- a/src/iso19111/crs.cpp
+++ b/src/iso19111/crs.cpp
@@ -3444,23 +3444,33 @@ void ProjectedCRS::addUnitConvertAndAxisSwap(io::PROJStringFormatter *formatter,
bool axisSpecFound) const {
const auto &axisList = d->coordinateSystem()->axisList();
const auto &unit = axisList[0]->unit();
+ const auto *zUnit = axisList.size() == 3 ? &(axisList[2]->unit()) : nullptr;
if (!unit._isEquivalentTo(common::UnitOfMeasure::METRE,
- util::IComparable::Criterion::EQUIVALENT)) {
+ util::IComparable::Criterion::EQUIVALENT) ||
+ (zUnit &&
+ !zUnit->_isEquivalentTo(common::UnitOfMeasure::METRE,
+ util::IComparable::Criterion::EQUIVALENT))) {
auto projUnit = unit.exportToPROJString();
const double toSI = unit.conversionToSI();
if (!formatter->getCRSExport()) {
formatter->addStep("unitconvert");
formatter->addParam("xy_in", "m");
- if (!formatter->omitZUnitConversion())
+ if (zUnit)
formatter->addParam("z_in", "m");
+
if (projUnit.empty()) {
formatter->addParam("xy_out", toSI);
- if (!formatter->omitZUnitConversion())
- formatter->addParam("z_out", toSI);
} else {
formatter->addParam("xy_out", projUnit);
- if (!formatter->omitZUnitConversion())
- formatter->addParam("z_out", projUnit);
+ }
+ if (zUnit) {
+ auto projZUnit = zUnit->exportToPROJString();
+ const double zToSI = zUnit->conversionToSI();
+ if (projZUnit.empty()) {
+ formatter->addParam("z_out", zToSI);
+ } else {
+ formatter->addParam("z_out", projZUnit);
+ }
}
} else {
if (projUnit.empty()) {