diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2018-11-22 21:32:51 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2018-11-22 21:32:51 +0100 |
| commit | b9d50247190e7b9ecd849ab260eb45edca3236cb (patch) | |
| tree | 1a82cbecf9a1d6e66b6f5f36a41cac6208bdb494 /src/coordinateoperation.cpp | |
| parent | 85a4e9149152dd97463651496854f9ecbd720b84 (diff) | |
| download | PROJ-b9d50247190e7b9ecd849ab260eb45edca3236cb.tar.gz PROJ-b9d50247190e7b9ecd849ab260eb45edca3236cb.zip | |
Fix transformation between geographic CRS that differ by axis order and units
Diffstat (limited to 'src/coordinateoperation.cpp')
| -rw-r--r-- | src/coordinateoperation.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/coordinateoperation.cpp b/src/coordinateoperation.cpp index 42cc806e..e0e02931 100644 --- a/src/coordinateoperation.cpp +++ b/src/coordinateoperation.cpp @@ -8220,6 +8220,32 @@ bool SingleOperation::exportToPROJStringGeneric( if (isAxisOrderReversal(methodEPSGCode)) { formatter->addStep("axisswap"); formatter->addParam("order", "2,1"); + auto sourceCRSGeog = + dynamic_cast<const crs::GeographicCRS *>(sourceCRS().get()); + auto targetCRSGeog = + dynamic_cast<const crs::GeographicCRS *>(targetCRS().get()); + if (sourceCRSGeog && targetCRSGeog) { + const auto &unitSrc = + sourceCRSGeog->coordinateSystem()->axisList()[0]->unit(); + const auto &unitDst = + targetCRSGeog->coordinateSystem()->axisList()[0]->unit(); + if (!unitSrc._isEquivalentTo( + unitDst, util::IComparable::Criterion::EQUIVALENT)) { + formatter->addStep("unitconvert"); + auto projUnit = unitSrc.exportToPROJString(); + if (projUnit.empty()) { + formatter->addParam("xy_in", unitSrc.conversionToSI()); + } else { + formatter->addParam("xy_in", projUnit); + } + projUnit = unitDst.exportToPROJString(); + if (projUnit.empty()) { + formatter->addParam("xy_out", unitDst.conversionToSI()); + } else { + formatter->addParam("xy_out", projUnit); + } + } + } return true; } |
