diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2020-01-11 11:59:04 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-11 11:59:04 +0100 |
| commit | 921541789ce1203875b36e2ac4726c0447b17a18 (patch) | |
| tree | ecd4b6571e44518227a4e0d61be66b48454fa59c /src | |
| parent | e2ee15eb8abd6c5592d8dcb6dc09f7d25415fe33 (diff) | |
| parent | 863d118c6d49783ed60792b4fd021a59988adbe4 (diff) | |
| download | PROJ-921541789ce1203875b36e2ac4726c0447b17a18.tar.gz PROJ-921541789ce1203875b36e2ac4726c0447b17a18.zip | |
Merge pull request #1836 from rouault/fix_projcrs3D_with_non_metre_z_unit
createOperations(): fix dealing with projected 3D CRS whose Z units != metre
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/crs.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index a24508d4..d71d527e 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -3456,23 +3456,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()) { |
