diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/coordinateoperation.cpp | 11 | ||||
| -rw-r--r-- | src/iso19111/coordinatesystem.cpp | 9 | ||||
| -rw-r--r-- | src/iso19111/crs.cpp | 7 | ||||
| -rw-r--r-- | src/iso19111/datum.cpp | 30 | ||||
| -rw-r--r-- | src/iso19111/io.cpp | 10 |
5 files changed, 55 insertions, 12 deletions
diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index a2a31edd..f4e90fe8 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -1200,7 +1200,14 @@ void OperationParameterValue::_exportToJSON( writer.AddObjKey("value"); writer.Add(l_value->value().value(), 15); writer.AddObjKey("unit"); - l_value->value().unit()._exportToJSON(formatter); + const auto &l_unit(l_value->value().unit()); + if (l_unit == common::UnitOfMeasure::METRE || + l_unit == common::UnitOfMeasure::DEGREE || + l_unit == common::UnitOfMeasure::SCALE_UNITY) { + writer.Add(l_unit.name()); + } else { + l_unit._exportToJSON(formatter); + } } else if (l_value->type() == ParameterValue::Type::FILENAME) { writer.AddObjKey("value"); writer.Add(l_value->valueFile()); @@ -5473,6 +5480,7 @@ void Conversion::_exportToJSON( } writer.AddObjKey("method"); + formatter->setOmitTypeInImmediateChild(); formatter->setAllowIDInImmediateChild(); method()->_exportToJSON(formatter); @@ -5481,6 +5489,7 @@ void Conversion::_exportToJSON( auto parametersContext(writer.MakeArrayContext(false)); for (const auto &genOpParamvalue : parameterValues()) { formatter->setAllowIDInImmediateChild(); + formatter->setOmitTypeInImmediateChild(); genOpParamvalue->_exportToJSON(formatter); } } diff --git a/src/iso19111/coordinatesystem.cpp b/src/iso19111/coordinatesystem.cpp index f96a962f..ef53dd57 100644 --- a/src/iso19111/coordinatesystem.cpp +++ b/src/iso19111/coordinatesystem.cpp @@ -410,7 +410,13 @@ void CoordinateSystemAxis::_exportToJSON( writer.Add(direction().toString()); writer.AddObjKey("unit"); - unit()._exportToJSON(formatter); + const auto &l_unit(unit()); + if (l_unit == common::UnitOfMeasure::METRE || + l_unit == common::UnitOfMeasure::DEGREE) { + writer.Add(l_unit.name()); + } else { + l_unit._exportToJSON(formatter); + } if (formatter->outputId()) { formatID(formatter); @@ -577,6 +583,7 @@ void CoordinateSystem::_exportToJSON( auto axisContext(writer.MakeArrayContext(false)); const auto &l_axisList = axisList(); for (auto &axis : l_axisList) { + formatter->setOmitTypeInImmediateChild(); axis->_exportToJSON(formatter); } diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index 2ca2786d..670d0c1a 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -1366,6 +1366,7 @@ void GeodeticCRS::_exportToJSON( } writer.AddObjKey("coordinate_system"); + formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); ObjectUsage::baseExportToJSON(formatter); @@ -2116,6 +2117,7 @@ void GeographicCRS::_exportToJSON( } writer.AddObjKey("coordinate_system"); + formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); ObjectUsage::baseExportToJSON(formatter); @@ -2940,12 +2942,15 @@ void ProjectedCRS::_exportToJSON( writer.AddObjKey("base_crs"); formatter->setAllowIDInImmediateChild(); + formatter->setOmitTypeInImmediateChild(); baseCRS()->_exportToJSON(formatter); writer.AddObjKey("conversion"); + formatter->setOmitTypeInImmediateChild(); derivingConversionRef()->_exportToJSON(formatter); writer.AddObjKey("coordinate_system"); + formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); ObjectUsage::baseExportToJSON(formatter); @@ -4316,6 +4321,7 @@ void DerivedGeodeticCRS::_exportToJSON( derivingConversionRef()->_exportToJSON(formatter); writer.AddObjKey("coordinate_system"); + formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); ObjectUsage::baseExportToJSON(formatter); @@ -4485,6 +4491,7 @@ void DerivedGeographicCRS::_exportToJSON( derivingConversionRef()->_exportToJSON(formatter); writer.AddObjKey("coordinate_system"); + formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); ObjectUsage::baseExportToJSON(formatter); diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp index 89ecc755..2944da1e 100644 --- a/src/iso19111/datum.cpp +++ b/src/iso19111/datum.cpp @@ -376,12 +376,13 @@ void PrimeMeridian::_exportToJSON( const auto &l_long = longitude(); writer.AddObjKey("longitude"); - { + const auto &unit = l_long.unit(); + if (unit == common::UnitOfMeasure::DEGREE) { + writer.Add(l_long.value(), 15); + } else { auto longitudeContext(formatter->MakeObjectContext(nullptr, false)); writer.AddObjKey("value"); writer.Add(l_long.value(), 15); - - const auto &unit = l_long.unit(); writer.AddObjKey("unit"); unit._exportToJSON(formatter); } @@ -834,7 +835,9 @@ void Ellipsoid::_exportToJSON( const auto &semiMajor = semiMajorAxis(); const auto &semiMajorUnit = semiMajor.unit(); writer.AddObjKey(isSphere() ? "radius" : "semi_major_axis"); - { + if (semiMajorUnit == common::UnitOfMeasure::METRE) { + writer.Add(semiMajor.value(), 15); + } else { auto objContext(formatter->MakeObjectContext(nullptr, false)); writer.AddObjKey("value"); writer.Add(semiMajor.value(), 15); @@ -850,13 +853,17 @@ void Ellipsoid::_exportToJSON( writer.Add(l_inverseFlattening->getSIValue(), 15); } else { writer.AddObjKey("semi_minor_axis"); - { + const auto &l_semiMinorAxis(semiMinorAxis()); + const auto &semiMinorAxisUnit(l_semiMinorAxis->unit()); + if (semiMinorAxisUnit == common::UnitOfMeasure::METRE) { + writer.Add(l_semiMinorAxis->value(), 15); + } else { auto objContext(formatter->MakeObjectContext(nullptr, false)); writer.AddObjKey("value"); - writer.Add(semiMinorAxis()->value(), 15); + writer.Add(l_semiMinorAxis->value(), 15); writer.AddObjKey("unit"); - semiMinorAxis()->unit()._exportToJSON(formatter); + semiMinorAxisUnit._exportToJSON(formatter); } } } @@ -1272,10 +1279,15 @@ void GeodeticReferenceFrame::_exportToJSON( Datum::getPrivate()->exportAnchorDefinition(formatter); writer.AddObjKey("ellipsoid"); + formatter->setOmitTypeInImmediateChild(); ellipsoid()->_exportToJSON(formatter); - writer.AddObjKey("prime_meridian"); - primeMeridian()->_exportToJSON(formatter); + const auto &l_primeMeridian(primeMeridian()); + if (l_primeMeridian->nameStr() != "Greenwich") { + writer.AddObjKey("prime_meridian"); + formatter->setOmitTypeInImmediateChild(); + primeMeridian()->_exportToJSON(formatter); + } ObjectUsage::baseExportToJSON(formatter); } diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 35798d9d..bb15c80a 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -8027,6 +8027,7 @@ struct JSONFormatter::Private { std::vector<bool> stackHasId_{false}; std::vector<bool> outputIdStack_{true}; bool allowIDInImmediateChild_ = false; + bool omitTypeInImmediateChild_ = false; std::string result_{}; @@ -8102,14 +8103,21 @@ void JSONFormatter::setAllowIDInImmediateChild() { // --------------------------------------------------------------------------- +void JSONFormatter::setOmitTypeInImmediateChild() { + d->omitTypeInImmediateChild_ = true; +} + +// --------------------------------------------------------------------------- + JSONFormatter::ObjectContext::ObjectContext(JSONFormatter &formatter, const char *objectType, bool hasId) : m_formatter(formatter) { m_formatter.d->writer_.StartObj(); - if (objectType) { + if (objectType && !m_formatter.d->omitTypeInImmediateChild_) { m_formatter.d->writer_.AddObjKey("type"); m_formatter.d->writer_.Add(objectType); } + m_formatter.d->omitTypeInImmediateChild_ = false; // All intermediate nodes shouldn't have ID if a parent has an ID // unless explicitly enabled. if (m_formatter.d->allowIDInImmediateChild_) { |
