diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/common.cpp | 90 | ||||
| -rw-r--r-- | src/iso19111/coordinateoperation.cpp | 98 | ||||
| -rw-r--r-- | src/iso19111/coordinatesystem.cpp | 32 | ||||
| -rw-r--r-- | src/iso19111/crs.cpp | 135 | ||||
| -rw-r--r-- | src/iso19111/datum.cpp | 144 | ||||
| -rw-r--r-- | src/iso19111/io.cpp | 2 | ||||
| -rw-r--r-- | src/iso19111/metadata.cpp | 14 |
7 files changed, 263 insertions, 252 deletions
diff --git a/src/iso19111/common.cpp b/src/iso19111/common.cpp index e3c747b9..b5e393b3 100644 --- a/src/iso19111/common.cpp +++ b/src/iso19111/common.cpp @@ -41,6 +41,8 @@ #include "proj.h" #include "proj_internal.h" +#include "proj_json_streaming_writer.hpp" + #include <cmath> // M_PI #include <cstdlib> #include <memory> @@ -243,45 +245,45 @@ void UnitOfMeasure::_exportToWKT( void UnitOfMeasure::_exportToJSON( JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); const auto &l_codeSpace = codeSpace(); auto objContext( formatter->MakeObjectContext(nullptr, !l_codeSpace.empty())); - writer.AddObjKey("type"); + writer->AddObjKey("type"); const auto l_type = type(); if (l_type == Type::LINEAR) { - writer.Add("LinearUnit"); + writer->Add("LinearUnit"); } else if (l_type == Type::ANGULAR) { - writer.Add("AngularUnit"); + writer->Add("AngularUnit"); } else if (l_type == Type::SCALE) { - writer.Add("ScaleUnit"); + writer->Add("ScaleUnit"); } else if (l_type == Type::TIME) { - writer.Add("TimeUnit"); + writer->Add("TimeUnit"); } else if (l_type == Type::PARAMETRIC) { - writer.Add("ParametricUnit"); + writer->Add("ParametricUnit"); } else { - writer.Add("Unit"); + writer->Add("Unit"); } - writer.AddObjKey("name"); + writer->AddObjKey("name"); const auto &l_name = name(); - writer.Add(l_name); + writer->Add(l_name); const auto &factor = conversionToSI(); - writer.AddObjKey("conversion_factor"); - writer.Add(factor, 15); + writer->AddObjKey("conversion_factor"); + writer->Add(factor, 15); if (!l_codeSpace.empty() && formatter->outputId()) { - writer.AddObjKey("id"); + writer->AddObjKey("id"); auto idContext(formatter->MakeObjectContext(nullptr, false)); - writer.AddObjKey("authority"); - writer.Add(l_codeSpace); - writer.AddObjKey("code"); + writer->AddObjKey("authority"); + writer->Add(l_codeSpace); + writer->AddObjKey("code"); const auto &l_code = code(); try { - writer.Add(std::stoi(l_code)); + writer->Add(std::stoi(l_code)); } catch (const std::exception &) { - writer.Add(l_code); + writer->Add(l_code); } } } @@ -876,13 +878,13 @@ void IdentifiedObject::formatRemarks(WKTFormatter *formatter) const { void IdentifiedObject::formatID(JSONFormatter *formatter) const { const auto &ids(identifiers()); - auto &writer = formatter->writer(); + auto writer = formatter->writer(); if (ids.size() == 1) { - writer.AddObjKey("id"); + writer->AddObjKey("id"); ids.front()->_exportToJSON(formatter); } else if (!ids.empty()) { - writer.AddObjKey("ids"); - auto arrayContext(writer.MakeArrayContext()); + writer->AddObjKey("ids"); + auto arrayContext(writer->MakeArrayContext()); for (const auto &id : ids) { id->_exportToJSON(formatter); } @@ -893,9 +895,9 @@ void IdentifiedObject::formatID(JSONFormatter *formatter) const { void IdentifiedObject::formatRemarks(JSONFormatter *formatter) const { if (!remarks().empty()) { - auto &writer = formatter->writer(); - writer.AddObjKey("remarks"); - writer.Add(remarks()); + auto writer = formatter->writer(); + writer->AddObjKey("remarks"); + writer->Add(remarks()); } } @@ -1060,30 +1062,30 @@ void ObjectDomain::_exportToWKT(WKTFormatter *formatter) const { //! @cond Doxygen_Suppress void ObjectDomain::_exportToJSON(JSONFormatter *formatter) const { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); if (d->scope_.has_value()) { - writer.AddObjKey("scope"); - writer.Add(*(d->scope_)); + writer->AddObjKey("scope"); + writer->Add(*(d->scope_)); } if (d->domainOfValidity_) { if (d->domainOfValidity_->description().has_value()) { - writer.AddObjKey("area"); - writer.Add(*(d->domainOfValidity_->description())); + writer->AddObjKey("area"); + writer->Add(*(d->domainOfValidity_->description())); } if (d->domainOfValidity_->geographicElements().size() == 1) { const auto bbox = dynamic_cast<const GeographicBoundingBox *>( d->domainOfValidity_->geographicElements()[0].get()); if (bbox) { - writer.AddObjKey("bbox"); - auto bboxContext(writer.MakeObjectContext()); - writer.AddObjKey("south_latitude"); - writer.Add(bbox->southBoundLatitude(), 15); - writer.AddObjKey("west_longitude"); - writer.Add(bbox->westBoundLongitude(), 15); - writer.AddObjKey("north_latitude"); - writer.Add(bbox->northBoundLatitude(), 15); - writer.AddObjKey("east_longitude"); - writer.Add(bbox->eastBoundLongitude(), 15); + writer->AddObjKey("bbox"); + auto bboxContext(writer->MakeObjectContext()); + writer->AddObjKey("south_latitude"); + writer->Add(bbox->southBoundLatitude(), 15); + writer->AddObjKey("west_longitude"); + writer->Add(bbox->westBoundLongitude(), 15); + writer->AddObjKey("north_latitude"); + writer->Add(bbox->northBoundLatitude(), 15); + writer->AddObjKey("east_longitude"); + writer->Add(bbox->eastBoundLongitude(), 15); } } if (d->domainOfValidity_->verticalElements().size() == 1) { @@ -1232,16 +1234,16 @@ void ObjectUsage::baseExportToWKT(WKTFormatter *formatter) const { void ObjectUsage::baseExportToJSON(JSONFormatter *formatter) const { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); if (formatter->outputUsage()) { const auto &l_domains = domains(); if (l_domains.size() == 1) { l_domains[0]->_exportToJSON(formatter); } else if (!l_domains.empty()) { - writer.AddObjKey("usages"); - auto arrayContext(writer.MakeArrayContext(false)); + writer->AddObjKey("usages"); + auto arrayContext(writer->MakeArrayContext(false)); for (const auto &domain : l_domains) { - auto objContext(writer.MakeObjectContext()); + auto objContext(writer->MakeObjectContext()); domain->_exportToJSON(formatter); } } diff --git a/src/iso19111/coordinateoperation.cpp b/src/iso19111/coordinateoperation.cpp index ab954ee2..4ae5f8a6 100644 --- a/src/iso19111/coordinateoperation.cpp +++ b/src/iso19111/coordinateoperation.cpp @@ -48,6 +48,8 @@ #include "proj_internal.h" // M_PI // clang-format on +#include "proj_json_streaming_writer.hpp" + #include <algorithm> #include <cassert> #include <cmath> @@ -1055,12 +1057,12 @@ void OperationMethod::_exportToWKT(io::WKTFormatter *formatter) const { void OperationMethod::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext(formatter->MakeObjectContext("OperationMethod", !identifiers().empty())); - writer.AddObjKey("name"); - writer.Add(nameStr()); + writer->AddObjKey("name"); + writer->Add(nameStr()); if (formatter->outputId()) { formatID(formatter); @@ -1250,29 +1252,29 @@ void OperationParameterValue::_exportToWKT(io::WKTFormatter *formatter, //! @cond Doxygen_Suppress void OperationParameterValue::_exportToJSON( io::JSONFormatter *formatter) const { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext(formatter->MakeObjectContext( "ParameterValue", !parameter()->identifiers().empty())); - writer.AddObjKey("name"); - writer.Add(parameter()->nameStr()); + writer->AddObjKey("name"); + writer->Add(parameter()->nameStr()); const auto &l_value(parameterValue()); if (l_value->type() == ParameterValue::Type::MEASURE) { - writer.AddObjKey("value"); - writer.Add(l_value->value().value(), 15); - writer.AddObjKey("unit"); + writer->AddObjKey("value"); + writer->Add(l_value->value().value(), 15); + writer->AddObjKey("unit"); 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()); + 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()); + writer->AddObjKey("value"); + writer->Add(l_value->valueFile()); } if (formatter->outputId()) { @@ -5767,28 +5769,28 @@ void Conversion::_exportToWKT(io::WKTFormatter *formatter) const { void Conversion::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("Conversion", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("method"); + writer->AddObjKey("method"); formatter->setOmitTypeInImmediateChild(); formatter->setAllowIDInImmediateChild(); method()->_exportToJSON(formatter); const auto &l_parameterValues = parameterValues(); if (!l_parameterValues.empty()) { - writer.AddObjKey("parameters"); + writer->AddObjKey("parameters"); { - auto parametersContext(writer.MakeArrayContext(false)); + auto parametersContext(writer->MakeArrayContext(false)); for (const auto &genOpParamvalue : l_parameterValues) { formatter->setAllowIDInImmediateChild(); formatter->setOmitTypeInImmediateChild(); @@ -8270,45 +8272,45 @@ void Transformation::_exportToWKT(io::WKTFormatter *formatter) const { void Transformation::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext(formatter->MakeObjectContext( formatter->abridgedTransformation() ? "AbridgedTransformation" : "Transformation", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } if (!formatter->abridgedTransformation()) { - writer.AddObjKey("source_crs"); + writer->AddObjKey("source_crs"); formatter->setAllowIDInImmediateChild(); sourceCRS()->_exportToJSON(formatter); - writer.AddObjKey("target_crs"); + writer->AddObjKey("target_crs"); formatter->setAllowIDInImmediateChild(); targetCRS()->_exportToJSON(formatter); const auto &l_interpolationCRS = interpolationCRS(); if (l_interpolationCRS) { - writer.AddObjKey("interpolation_crs"); + writer->AddObjKey("interpolation_crs"); formatter->setAllowIDInImmediateChild(); l_interpolationCRS->_exportToJSON(formatter); } } - writer.AddObjKey("method"); + writer->AddObjKey("method"); formatter->setOmitTypeInImmediateChild(); formatter->setAllowIDInImmediateChild(); method()->_exportToJSON(formatter); - writer.AddObjKey("parameters"); + writer->AddObjKey("parameters"); { - auto parametersContext(writer.MakeArrayContext(false)); + auto parametersContext(writer->MakeArrayContext(false)); for (const auto &genOpParamvalue : parameterValues()) { formatter->setAllowIDInImmediateChild(); formatter->setOmitTypeInImmediateChild(); @@ -8318,8 +8320,8 @@ void Transformation::_exportToJSON( if (!formatter->abridgedTransformation()) { if (!coordinateOperationAccuracies().empty()) { - writer.AddObjKey("accuracy"); - writer.Add(coordinateOperationAccuracies()[0]->value()); + writer->AddObjKey("accuracy"); + writer->Add(coordinateOperationAccuracies()[0]->value()); } } @@ -10403,29 +10405,29 @@ void ConcatenatedOperation::_exportToWKT(io::WKTFormatter *formatter) const { void ConcatenatedOperation::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext(formatter->MakeObjectContext("ConcatenatedOperation", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("source_crs"); + writer->AddObjKey("source_crs"); formatter->setAllowIDInImmediateChild(); sourceCRS()->_exportToJSON(formatter); - writer.AddObjKey("target_crs"); + writer->AddObjKey("target_crs"); formatter->setAllowIDInImmediateChild(); targetCRS()->_exportToJSON(formatter); - writer.AddObjKey("steps"); + writer->AddObjKey("steps"); { - auto parametersContext(writer.MakeArrayContext(false)); + auto parametersContext(writer->MakeArrayContext(false)); for (const auto &operation : operations()) { formatter->setAllowIDInImmediateChild(); operation->_exportToJSON(formatter); @@ -15462,39 +15464,39 @@ void PROJBasedOperation::_exportToWKT(io::WKTFormatter *formatter) const { void PROJBasedOperation::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext(formatter->MakeObjectContext( (sourceCRS() && targetCRS()) ? "Transformation" : "Conversion", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } if (sourceCRS() && targetCRS()) { - writer.AddObjKey("source_crs"); + writer->AddObjKey("source_crs"); formatter->setAllowIDInImmediateChild(); sourceCRS()->_exportToJSON(formatter); - writer.AddObjKey("target_crs"); + writer->AddObjKey("target_crs"); formatter->setAllowIDInImmediateChild(); targetCRS()->_exportToJSON(formatter); } - writer.AddObjKey("method"); + writer->AddObjKey("method"); formatter->setOmitTypeInImmediateChild(); formatter->setAllowIDInImmediateChild(); method()->_exportToJSON(formatter); const auto &l_parameterValues = parameterValues(); if (!l_parameterValues.empty()) { - writer.AddObjKey("parameters"); + writer->AddObjKey("parameters"); { - auto parametersContext(writer.MakeArrayContext(false)); + auto parametersContext(writer->MakeArrayContext(false)); for (const auto &genOpParamvalue : l_parameterValues) { formatter->setAllowIDInImmediateChild(); formatter->setOmitTypeInImmediateChild(); diff --git a/src/iso19111/coordinatesystem.cpp b/src/iso19111/coordinatesystem.cpp index fc4b7492..2bfe30e6 100644 --- a/src/iso19111/coordinatesystem.cpp +++ b/src/iso19111/coordinatesystem.cpp @@ -40,6 +40,8 @@ #include "proj/internal/internal.hpp" #include "proj/internal/io_internal.hpp" +#include "proj_json_streaming_writer.hpp" + #include <map> #include <memory> #include <set> @@ -396,26 +398,26 @@ void CoordinateSystemAxis::_exportToWKT(io::WKTFormatter *formatter, int order, void CoordinateSystemAxis::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("Axis", !identifiers().empty())); - writer.AddObjKey("name"); - writer.Add(nameStr()); + writer->AddObjKey("name"); + writer->Add(nameStr()); - writer.AddObjKey("abbreviation"); - writer.Add(abbreviation()); + writer->AddObjKey("abbreviation"); + writer->Add(abbreviation()); - writer.AddObjKey("direction"); - writer.Add(direction().toString()); + writer->AddObjKey("direction"); + writer->Add(direction().toString()); const auto &l_unit(unit()); if (l_unit == common::UnitOfMeasure::METRE || l_unit == common::UnitOfMeasure::DEGREE) { - writer.AddObjKey("unit"); - writer.Add(l_unit.name()); + writer->AddObjKey("unit"); + writer->Add(l_unit.name()); } else if (l_unit.type() != common::UnitOfMeasure::Type::NONE) { - writer.AddObjKey("unit"); + writer->AddObjKey("unit"); l_unit._exportToJSON(formatter); } @@ -573,16 +575,16 @@ void CoordinateSystem::_exportToWKT( void CoordinateSystem::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext(formatter->MakeObjectContext("CoordinateSystem", !identifiers().empty())); - writer.AddObjKey("subtype"); - writer.Add(getWKT2Type(true)); + writer->AddObjKey("subtype"); + writer->Add(getWKT2Type(true)); - writer.AddObjKey("axis"); + writer->AddObjKey("axis"); { - auto axisContext(writer.MakeArrayContext(false)); + auto axisContext(writer->MakeArrayContext(false)); const auto &l_axisList = axisList(); for (auto &axis : l_axisList) { formatter->setOmitTypeInImmediateChild(); diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index 77261211..de02eb35 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -46,6 +46,7 @@ #include "proj/internal/io_internal.hpp" #include "proj_constants.h" +#include "proj_json_streaming_writer.hpp" #include <algorithm> #include <cassert> @@ -1564,29 +1565,29 @@ void GeodeticCRS::addDatumInfoToPROJString( void GeodeticCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("GeodeticCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } const auto &l_datum(datum()); if (l_datum) { - writer.AddObjKey("datum"); + writer->AddObjKey("datum"); l_datum->_exportToJSON(formatter); } else { - writer.AddObjKey("datum_ensemble"); + writer->AddObjKey("datum_ensemble"); formatter->setOmitTypeInImmediateChild(); datumEnsemble()->_exportToJSON(formatter); } - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); @@ -2427,29 +2428,29 @@ void GeographicCRS::_exportToPROJString( void GeographicCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("GeographicCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } const auto &l_datum(datum()); if (l_datum) { - writer.AddObjKey("datum"); + writer->AddObjKey("datum"); l_datum->_exportToJSON(formatter); } else { - writer.AddObjKey("datum_ensemble"); + writer->AddObjKey("datum_ensemble"); formatter->setOmitTypeInImmediateChild(); datumEnsemble()->_exportToJSON(formatter); } - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); @@ -2651,43 +2652,43 @@ void VerticalCRS::_exportToPROJString( void VerticalCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("VerticalCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } const auto &l_datum(datum()); if (l_datum) { - writer.AddObjKey("datum"); + writer->AddObjKey("datum"); l_datum->_exportToJSON(formatter); } else { - writer.AddObjKey("datum_ensemble"); + writer->AddObjKey("datum_ensemble"); formatter->setOmitTypeInImmediateChild(); datumEnsemble()->_exportToJSON(formatter); } - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); if (!d->geoidModel.empty()) { const auto &model = d->geoidModel[0]; - writer.AddObjKey("geoid_model"); + writer->AddObjKey("geoid_model"); auto objectContext2(formatter->MakeObjectContext(nullptr, false)); - writer.AddObjKey("name"); - writer.Add(model->nameStr()); + writer->AddObjKey("name"); + writer->Add(model->nameStr()); if (model->identifiers().empty()) { const auto &interpCRS = model->interpolationCRS(); if (interpCRS) { - writer.AddObjKey("interpolation_crs"); + writer->AddObjKey("interpolation_crs"); interpCRS->_exportToJSON(formatter); } } @@ -3083,26 +3084,26 @@ void DerivedCRS::baseExportToWKT(io::WKTFormatter *formatter, void DerivedCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext(className(), !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("base_crs"); + writer->AddObjKey("base_crs"); baseCRS()->_exportToJSON(formatter); - writer.AddObjKey("conversion"); + writer->AddObjKey("conversion"); formatter->setOmitTypeInImmediateChild(); derivingConversionRef()->_exportToJSON(formatter); - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); @@ -3414,28 +3415,28 @@ void ProjectedCRS::_exportToWKT(io::WKTFormatter *formatter) const { void ProjectedCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("ProjectedCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("base_crs"); + writer->AddObjKey("base_crs"); formatter->setAllowIDInImmediateChild(); formatter->setOmitTypeInImmediateChild(); baseCRS()->_exportToJSON(formatter); - writer.AddObjKey("conversion"); + writer->AddObjKey("conversion"); formatter->setOmitTypeInImmediateChild(); derivingConversionRef()->_exportToJSON(formatter); - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); @@ -4209,21 +4210,21 @@ void CompoundCRS::_exportToWKT(io::WKTFormatter *formatter) const { void CompoundCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("CompoundCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("components"); + writer->AddObjKey("components"); { - auto componentsContext(writer.MakeArrayContext(false)); + auto componentsContext(writer->MakeArrayContext(false)); for (const auto &crs : componentReferenceSystems()) { crs->_exportToJSON(formatter); } @@ -4753,17 +4754,17 @@ void BoundCRS::_exportToWKT(io::WKTFormatter *formatter) const { void BoundCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("BoundCRS", !identifiers().empty())); - writer.AddObjKey("source_crs"); + writer->AddObjKey("source_crs"); d->baseCRS()->_exportToJSON(formatter); - writer.AddObjKey("target_crs"); + writer->AddObjKey("target_crs"); d->hubCRS()->_exportToJSON(formatter); - writer.AddObjKey("transformation"); + writer->AddObjKey("transformation"); formatter->setOmitTypeInImmediateChild(); formatter->setAbridgedTransformation(true); d->transformation()->_exportToJSON(formatter); @@ -5493,23 +5494,23 @@ void TemporalCRS::_exportToWKT(io::WKTFormatter *formatter) const { void TemporalCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("TemporalCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("datum"); + writer->AddObjKey("datum"); formatter->setOmitTypeInImmediateChild(); datum()->_exportToJSON(formatter); - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); @@ -5623,23 +5624,23 @@ void EngineeringCRS::_exportToWKT(io::WKTFormatter *formatter) const { void EngineeringCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("EngineeringCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("datum"); + writer->AddObjKey("datum"); formatter->setOmitTypeInImmediateChild(); datum()->_exportToJSON(formatter); - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); @@ -5755,23 +5756,23 @@ void ParametricCRS::_exportToWKT(io::WKTFormatter *formatter) const { void ParametricCRS::_exportToJSON( io::JSONFormatter *formatter) const // throw(io::FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("ParametricCRS", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } - writer.AddObjKey("datum"); + writer->AddObjKey("datum"); formatter->setOmitTypeInImmediateChild(); datum()->_exportToJSON(formatter); - writer.AddObjKey("coordinate_system"); + writer->AddObjKey("coordinate_system"); formatter->setOmitTypeInImmediateChild(); coordinateSystem()->_exportToJSON(formatter); diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp index 337b74a8..03abb0d7 100644 --- a/src/iso19111/datum.cpp +++ b/src/iso19111/datum.cpp @@ -46,6 +46,8 @@ #include "proj_api.h" // clang-format on +#include "proj_json_streaming_writer.hpp" + #include <cmath> #include <cstdlib> #include <memory> @@ -113,9 +115,9 @@ void Datum::Private::exportAnchorDefinition(io::WKTFormatter *formatter) const { void Datum::Private::exportAnchorDefinition( io::JSONFormatter *formatter) const { if (anchorDefinition) { - auto &writer = formatter->writer(); - writer.AddObjKey("anchor"); - writer.Add(*anchorDefinition); + auto writer = formatter->writer(); + writer->AddObjKey("anchor"); + writer->Add(*anchorDefinition); } } @@ -381,25 +383,25 @@ void PrimeMeridian::_exportToWKT( void PrimeMeridian::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("PrimeMeridian", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); std::string l_name = name()->description().has_value() ? nameStr() : "Greenwich"; - writer.Add(l_name); + writer->Add(l_name); const auto &l_long = longitude(); - writer.AddObjKey("longitude"); + writer->AddObjKey("longitude"); const auto &unit = l_long.unit(); if (unit == common::UnitOfMeasure::DEGREE) { - writer.Add(l_long.value(), 15); + writer->Add(l_long.value(), 15); } else { auto longitudeContext(formatter->MakeObjectContext(nullptr, false)); - writer.AddObjKey("value"); - writer.Add(l_long.value(), 15); - writer.AddObjKey("unit"); + writer->AddObjKey("value"); + writer->Add(l_long.value(), 15); + writer->AddObjKey("unit"); unit._exportToJSON(formatter); } @@ -836,49 +838,49 @@ void Ellipsoid::_exportToWKT( void Ellipsoid::_exportToJSON( io::JSONFormatter *formatter) const // throw(FormattingException) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objectContext( formatter->MakeObjectContext("Ellipsoid", !identifiers().empty())); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } const auto &semiMajor = semiMajorAxis(); const auto &semiMajorUnit = semiMajor.unit(); - writer.AddObjKey(isSphere() ? "radius" : "semi_major_axis"); + writer->AddObjKey(isSphere() ? "radius" : "semi_major_axis"); if (semiMajorUnit == common::UnitOfMeasure::METRE) { - writer.Add(semiMajor.value(), 15); + writer->Add(semiMajor.value(), 15); } else { auto objContext(formatter->MakeObjectContext(nullptr, false)); - writer.AddObjKey("value"); - writer.Add(semiMajor.value(), 15); + writer->AddObjKey("value"); + writer->Add(semiMajor.value(), 15); - writer.AddObjKey("unit"); + writer->AddObjKey("unit"); semiMajorUnit._exportToJSON(formatter); } if (!isSphere()) { const auto &l_inverseFlattening = inverseFlattening(); if (l_inverseFlattening.has_value()) { - writer.AddObjKey("inverse_flattening"); - writer.Add(l_inverseFlattening->getSIValue(), 15); + writer->AddObjKey("inverse_flattening"); + writer->Add(l_inverseFlattening->getSIValue(), 15); } else { - writer.AddObjKey("semi_minor_axis"); + 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); + writer->Add(l_semiMinorAxis->value(), 15); } else { auto objContext(formatter->MakeObjectContext(nullptr, false)); - writer.AddObjKey("value"); - writer.Add(l_semiMinorAxis->value(), 15); + writer->AddObjKey("value"); + writer->Add(l_semiMinorAxis->value(), 15); - writer.AddObjKey("unit"); + writer->AddObjKey("unit"); semiMinorAxisUnit._exportToJSON(formatter); } } @@ -1312,36 +1314,36 @@ void GeodeticReferenceFrame::_exportToJSON( auto objectContext(formatter->MakeObjectContext( dynamicGRF ? "DynamicGeodeticReferenceFrame" : "GeodeticReferenceFrame", !identifiers().empty())); - auto &writer = formatter->writer(); + auto writer = formatter->writer(); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } Datum::getPrivate()->exportAnchorDefinition(formatter); if (dynamicGRF) { - writer.AddObjKey("frame_reference_epoch"); - writer.Add(dynamicGRF->frameReferenceEpoch().value()); + writer->AddObjKey("frame_reference_epoch"); + writer->Add(dynamicGRF->frameReferenceEpoch().value()); const auto &deformationModel = dynamicGRF->deformationModelName(); if (deformationModel.has_value()) { - writer.AddObjKey("deformation_model"); - writer.Add(*deformationModel); + writer->AddObjKey("deformation_model"); + writer->Add(*deformationModel); } } - writer.AddObjKey("ellipsoid"); + writer->AddObjKey("ellipsoid"); formatter->setOmitTypeInImmediateChild(); ellipsoid()->_exportToJSON(formatter); const auto &l_primeMeridian(primeMeridian()); if (l_primeMeridian->nameStr() != "Greenwich") { - writer.AddObjKey("prime_meridian"); + writer->AddObjKey("prime_meridian"); formatter->setOmitTypeInImmediateChild(); primeMeridian()->_exportToJSON(formatter); } @@ -1668,28 +1670,28 @@ void DatumEnsemble::_exportToJSON( { auto objectContext( formatter->MakeObjectContext("DatumEnsemble", !identifiers().empty())); - auto &writer = formatter->writer(); + auto writer = formatter->writer(); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } auto l_datums = datums(); - writer.AddObjKey("members"); + writer->AddObjKey("members"); { - auto membersContext(writer.MakeArrayContext(false)); + auto membersContext(writer->MakeArrayContext(false)); for (const auto &datum : l_datums) { - auto memberContext(writer.MakeObjectContext()); - writer.AddObjKey("name"); + auto memberContext(writer->MakeObjectContext()); + writer->AddObjKey("name"); const auto &l_datum_name = datum->nameStr(); if (!l_datum_name.empty()) { - writer.Add(l_datum_name); + writer->Add(l_datum_name); } else { - writer.Add("unnamed"); + writer->Add("unnamed"); } datum->formatID(formatter); } @@ -1698,13 +1700,13 @@ void DatumEnsemble::_exportToJSON( auto grfFirst = std::dynamic_pointer_cast<GeodeticReferenceFrame>( l_datums[0].as_nullable()); if (grfFirst) { - writer.AddObjKey("ellipsoid"); + writer->AddObjKey("ellipsoid"); formatter->setOmitTypeInImmediateChild(); grfFirst->ellipsoid()->_exportToJSON(formatter); } - writer.AddObjKey("accuracy"); - writer.Add(positionalAccuracy()->value()); + writer->AddObjKey("accuracy"); + writer->Add(positionalAccuracy()->value()); formatID(formatter); } @@ -1886,26 +1888,26 @@ void VerticalReferenceFrame::_exportToJSON( auto objectContext(formatter->MakeObjectContext( dynamicGRF ? "DynamicVerticalReferenceFrame" : "VerticalReferenceFrame", !identifiers().empty())); - auto &writer = formatter->writer(); + auto writer = formatter->writer(); - writer.AddObjKey("name"); + writer->AddObjKey("name"); auto l_name = nameStr(); if (l_name.empty()) { - writer.Add("unnamed"); + writer->Add("unnamed"); } else { - writer.Add(l_name); + writer->Add(l_name); } Datum::getPrivate()->exportAnchorDefinition(formatter); if (dynamicGRF) { - writer.AddObjKey("frame_reference_epoch"); - writer.Add(dynamicGRF->frameReferenceEpoch().value()); + writer->AddObjKey("frame_reference_epoch"); + writer->Add(dynamicGRF->frameReferenceEpoch().value()); const auto &deformationModel = dynamicGRF->deformationModelName(); if (deformationModel.has_value()) { - writer.AddObjKey("deformation_model"); - writer.Add(*deformationModel); + writer->AddObjKey("deformation_model"); + writer->Add(*deformationModel); } } @@ -2185,18 +2187,18 @@ void TemporalDatum::_exportToJSON( { auto objectContext( formatter->MakeObjectContext("TemporalDatum", !identifiers().empty())); - auto &writer = formatter->writer(); + auto writer = formatter->writer(); - writer.AddObjKey("name"); - writer.Add(nameStr()); + writer->AddObjKey("name"); + writer->Add(nameStr()); - writer.AddObjKey("calendar"); - writer.Add(calendar()); + writer->AddObjKey("calendar"); + writer->Add(calendar()); const auto &timeOriginStr = temporalOrigin().toString(); if (!timeOriginStr.empty()) { - writer.AddObjKey("time_origin"); - writer.Add(timeOriginStr); + writer->AddObjKey("time_origin"); + writer->Add(timeOriginStr); } ObjectUsage::baseExportToJSON(formatter); @@ -2285,10 +2287,10 @@ void EngineeringDatum::_exportToJSON( { auto objectContext(formatter->MakeObjectContext("EngineeringDatum", !identifiers().empty())); - auto &writer = formatter->writer(); + auto writer = formatter->writer(); - writer.AddObjKey("name"); - writer.Add(nameStr()); + writer->AddObjKey("name"); + writer->Add(nameStr()); Datum::getPrivate()->exportAnchorDefinition(formatter); @@ -2371,10 +2373,10 @@ void ParametricDatum::_exportToJSON( { auto objectContext(formatter->MakeObjectContext("ParametricDatum", !identifiers().empty())); - auto &writer = formatter->writer(); + auto writer = formatter->writer(); - writer.AddObjKey("name"); - writer.Add(nameStr()); + writer->AddObjKey("name"); + writer->Add(nameStr()); Datum::getPrivate()->exportAnchorDefinition(formatter); diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index 3a7be2b0..260cf1c7 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -9731,7 +9731,7 @@ JSONFormatter::~JSONFormatter() = default; // --------------------------------------------------------------------------- -CPLJSonStreamingWriter &JSONFormatter::writer() const { return d->writer_; } +CPLJSonStreamingWriter *JSONFormatter::writer() const { return &(d->writer_); } // --------------------------------------------------------------------------- diff --git a/src/iso19111/metadata.cpp b/src/iso19111/metadata.cpp index 6266a86d..8f2601e0 100644 --- a/src/iso19111/metadata.cpp +++ b/src/iso19111/metadata.cpp @@ -38,6 +38,8 @@ #include "proj/internal/internal.hpp" #include "proj/internal/io_internal.hpp" +#include "proj_json_streaming_writer.hpp" + #include <algorithm> #include <memory> #include <string> @@ -1102,15 +1104,15 @@ void Identifier::_exportToJSON(JSONFormatter *formatter) const { const std::string &l_code = code(); const std::string &l_codeSpace = *codeSpace(); if (!l_codeSpace.empty() && !l_code.empty()) { - auto &writer = formatter->writer(); + auto writer = formatter->writer(); auto objContext(formatter->MakeObjectContext(nullptr, false)); - writer.AddObjKey("authority"); - writer.Add(l_codeSpace); - writer.AddObjKey("code"); + writer->AddObjKey("authority"); + writer->Add(l_codeSpace); + writer->AddObjKey("code"); try { - writer.Add(std::stoi(l_code)); + writer->Add(std::stoi(l_code)); } catch (const std::exception &) { - writer.Add(l_code); + writer->Add(l_code); } } } |
