aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-01-11 11:59:04 +0100
committerGitHub <noreply@github.com>2020-01-11 11:59:04 +0100
commit921541789ce1203875b36e2ac4726c0447b17a18 (patch)
treeecd4b6571e44518227a4e0d61be66b48454fa59c /src
parente2ee15eb8abd6c5592d8dcb6dc09f7d25415fe33 (diff)
parent863d118c6d49783ed60792b4fd021a59988adbe4 (diff)
downloadPROJ-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.cpp22
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()) {