aboutsummaryrefslogtreecommitdiff
path: root/src/iso19111/datum.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-08-10 15:15:44 +0200
committerEven Rouault <even.rouault@spatialys.com>2019-08-10 15:27:59 +0200
commit63981af418d84749cd4d70752f83fd551100389f (patch)
tree10ddaceb884aa02ea1f3a75334853766cce958d9 /src/iso19111/datum.cpp
parent17dc5eb1b6d09d436c80470497dd2abfb902cf6d (diff)
downloadPROJ-63981af418d84749cd4d70752f83fd551100389f.tar.gz
PROJ-63981af418d84749cd4d70752f83fd551100389f.zip
PROJJSON: add support for DatumEnsemble and Dynamic[Geodetic|Vertical]ReferenceFrame
Diffstat (limited to 'src/iso19111/datum.cpp')
-rw-r--r--src/iso19111/datum.cpp94
1 files changed, 86 insertions, 8 deletions
diff --git a/src/iso19111/datum.cpp b/src/iso19111/datum.cpp
index d6e6bc21..65905ca9 100644
--- a/src/iso19111/datum.cpp
+++ b/src/iso19111/datum.cpp
@@ -1264,8 +1264,11 @@ void GeodeticReferenceFrame::_exportToWKT(
void GeodeticReferenceFrame::_exportToJSON(
io::JSONFormatter *formatter) const // throw(FormattingException)
{
- auto objectContext(formatter->MakeObjectContext("GeodeticReferenceFrame",
- !identifiers().empty()));
+ auto dynamicGRF = dynamic_cast<const DynamicGeodeticReferenceFrame *>(this);
+
+ auto objectContext(formatter->MakeObjectContext(
+ dynamicGRF ? "DynamicGeodeticReferenceFrame" : "GeodeticReferenceFrame",
+ !identifiers().empty()));
auto &writer = formatter->writer();
writer.AddObjKey("name");
@@ -1278,6 +1281,17 @@ void GeodeticReferenceFrame::_exportToJSON(
Datum::getPrivate()->exportAnchorDefinition(formatter);
+ if (dynamicGRF) {
+ 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("ellipsoid");
formatter->setOmitTypeInImmediateChild();
ellipsoid()->_exportToJSON(formatter);
@@ -1422,7 +1436,7 @@ void DynamicGeodeticReferenceFrame::_exportToWKT(
// ---------------------------------------------------------------------------
-/** \brief Instantiate a DyanmicGeodeticReferenceFrame
+/** \brief Instantiate a DynamicGeodeticReferenceFrame
*
* @param properties See \ref general_properties.
* At minimum the name should be defined.
@@ -1431,7 +1445,7 @@ void DynamicGeodeticReferenceFrame::_exportToWKT(
* @param primeMeridian the PrimeMeridian.
* @param frameReferenceEpochIn the frame reference epoch.
* @param deformationModelNameIn deformation model name, or empty
- * @return new DyanmicGeodeticReferenceFrame.
+ * @return new DynamicGeodeticReferenceFrame.
*/
DynamicGeodeticReferenceFrameNNPtr DynamicGeodeticReferenceFrame::create(
const util::PropertyMap &properties, const EllipsoidNNPtr &ellipsoid,
@@ -1562,6 +1576,56 @@ void DatumEnsemble::_exportToWKT(
// ---------------------------------------------------------------------------
+//! @cond Doxygen_Suppress
+void DatumEnsemble::_exportToJSON(
+ io::JSONFormatter *formatter) const // throw(FormattingException)
+{
+ auto objectContext(
+ formatter->MakeObjectContext("DatumEnsemble", !identifiers().empty()));
+ auto &writer = formatter->writer();
+
+ writer.AddObjKey("name");
+ auto l_name = nameStr();
+ if (l_name.empty()) {
+ writer.Add("unnamed");
+ } else {
+ writer.Add(l_name);
+ }
+
+ auto l_datums = datums();
+ writer.AddObjKey("members");
+ {
+ auto membersContext(writer.MakeArrayContext(false));
+ for (const auto &datum : l_datums) {
+ auto memberContext(writer.MakeObjectContext());
+ writer.AddObjKey("name");
+ const auto &l_datum_name = datum->nameStr();
+ if (!l_datum_name.empty()) {
+ writer.Add(l_datum_name);
+ } else {
+ writer.Add("unnamed");
+ }
+ datum->formatID(formatter);
+ }
+ }
+
+ auto grfFirst = std::dynamic_pointer_cast<GeodeticReferenceFrame>(
+ l_datums[0].as_nullable());
+ if (grfFirst) {
+ writer.AddObjKey("ellipsoid");
+ formatter->setOmitTypeInImmediateChild();
+ grfFirst->ellipsoid()->_exportToJSON(formatter);
+ }
+
+ writer.AddObjKey("accuracy");
+ writer.Add(positionalAccuracy()->value());
+
+ formatID(formatter);
+}
+//! @endcond
+
+// ---------------------------------------------------------------------------
+
/** \brief Instantiate a DatumEnsemble.
*
* @param properties See \ref general_properties.
@@ -1729,8 +1793,11 @@ void VerticalReferenceFrame::_exportToWKT(
void VerticalReferenceFrame::_exportToJSON(
io::JSONFormatter *formatter) const // throw(FormattingException)
{
- auto objectContext(formatter->MakeObjectContext("VerticalReferenceFrame",
- !identifiers().empty()));
+ auto dynamicGRF = dynamic_cast<const DynamicVerticalReferenceFrame *>(this);
+
+ auto objectContext(formatter->MakeObjectContext(
+ dynamicGRF ? "DynamicVerticalReferenceFrame" : "VerticalReferenceFrame",
+ !identifiers().empty()));
auto &writer = formatter->writer();
writer.AddObjKey("name");
@@ -1743,6 +1810,17 @@ void VerticalReferenceFrame::_exportToJSON(
Datum::getPrivate()->exportAnchorDefinition(formatter);
+ if (dynamicGRF) {
+ 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);
+ }
+ }
+
ObjectUsage::baseExportToJSON(formatter);
}
//! @endcond
@@ -1882,7 +1960,7 @@ void DynamicVerticalReferenceFrame::_exportToWKT(
// ---------------------------------------------------------------------------
-/** \brief Instantiate a DyanmicVerticalReferenceFrame
+/** \brief Instantiate a DynamicVerticalReferenceFrame
*
* @param properties See \ref general_properties.
* At minimum the name should be defined.
@@ -1890,7 +1968,7 @@ void DynamicVerticalReferenceFrame::_exportToWKT(
* @param realizationMethodIn the realization method, or empty.
* @param frameReferenceEpochIn the frame reference epoch.
* @param deformationModelNameIn deformation model name, or empty
- * @return new DyanmicVerticalReferenceFrame.
+ * @return new DynamicVerticalReferenceFrame.
*/
DynamicVerticalReferenceFrameNNPtr DynamicVerticalReferenceFrame::create(
const util::PropertyMap &properties,