From 2305dec4384365524cef76db4f84214746c4bd95 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 14 Nov 2019 14:26:31 +0100 Subject: import/export PROJJSON: support a interpolation_crs key to geoid_model for faithful serialization of the geoid_geog_crs parameter of proj_create_vertical_crs_ex() --- src/iso19111/c_api.cpp | 3 ++- src/iso19111/crs.cpp | 9 +++++++++ src/iso19111/io.cpp | 10 +++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp index fdfcdf7a..fd661cf8 100644 --- a/src/iso19111/c_api.cpp +++ b/src/iso19111/c_api.cpp @@ -3029,7 +3029,8 @@ PJ *proj_create_vertical_crs_ex( ? std::dynamic_pointer_cast(geoid_geog_crs->iso_obj) : nullptr; const auto model(Transformation::create( - propsModel, vertCRSWithoutGeoid, GeographicCRS::EPSG_4979, + propsModel, vertCRSWithoutGeoid, + GeographicCRS::EPSG_4979, // arbitrarily chosen. Ignored interpCRS, OperationMethod::create(PropertyMap(), std::vector()), diff --git a/src/iso19111/crs.cpp b/src/iso19111/crs.cpp index a55b701a..cf533bd3 100644 --- a/src/iso19111/crs.cpp +++ b/src/iso19111/crs.cpp @@ -2584,6 +2584,15 @@ void VerticalCRS::_exportToJSON( auto objectContext2(formatter->MakeObjectContext(nullptr, false)); writer.AddObjKey("name"); writer.Add(model->nameStr()); + + if (model->identifiers().empty()) { + const auto &interpCRS = model->interpolationCRS(); + if (interpCRS) { + writer.AddObjKey("interpolation_crs"); + interpCRS->_exportToJSON(formatter); + } + } + model->formatID(formatter); } diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp index a0a87f65..4d9e8633 100644 --- a/src/iso19111/io.cpp +++ b/src/iso19111/io.cpp @@ -5129,8 +5129,16 @@ VerticalCRSNNPtr JSONParser::buildVerticalCRS(const json &j) { auto propsModel = buildProperties(geoidModelJ); const auto dummyCRS = VerticalCRS::create( PropertyMap(), datum, datumEnsemble, NN_NO_CHECK(verticalCS)); + CRSPtr interpolationCRS; + if (geoidModelJ.contains("interpolation_crs")) { + auto interpolationCRSJ = + getObject(geoidModelJ, "interpolation_crs"); + interpolationCRS = buildCRS(interpolationCRSJ).as_nullable(); + } const auto model(Transformation::create( - propsModel, dummyCRS, dummyCRS, nullptr, + propsModel, dummyCRS, + GeographicCRS::EPSG_4979, // arbitrarily chosen. Ignored, + interpolationCRS, OperationMethod::create(PropertyMap(), std::vector()), {}, {})); -- cgit v1.2.3