aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/common.cpp90
-rw-r--r--src/iso19111/coordinateoperation.cpp98
-rw-r--r--src/iso19111/coordinatesystem.cpp32
-rw-r--r--src/iso19111/crs.cpp135
-rw-r--r--src/iso19111/datum.cpp144
-rw-r--r--src/iso19111/io.cpp2
-rw-r--r--src/iso19111/metadata.cpp14
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);
}
}
}