From d0d8aefc99217f1f6303a7ed2ba92660ba98bdbb Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 27 Sep 2022 11:53:30 +0200 Subject: [PATCH] proj_normalize_for_visualization(): take into account FORCE_OVER property from source operation (fixes #3347) --- src/iso19111/c_api.cpp | 12 +++++++++--- test/unit/gie_self_tests.cpp | 11 +++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp index d957a3d65c..c351208fd8 100644 --- a/src/iso19111/c_api.cpp +++ b/src/iso19111/c_api.cpp @@ -8825,6 +8825,7 @@ PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ *obj) { pjNew->descr = "Set of coordinate operations"; pjNew->left = obj->left; pjNew->right = obj->right; + pjNew->over = obj->over; for (const auto &alt : obj->alternativeCoordinateOperations) { auto co = dynamic_cast( @@ -8857,11 +8858,14 @@ PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ *obj) { std::swap(maxxDst, maxyDst); } } + auto pjNormalized = + pj_obj_create(ctx, co->normalizeForVisualization()); + pjNormalized->over = alt.pj->over; pjNew->alternativeCoordinateOperations.emplace_back( alt.idxInOriginalList, minxSrc, minySrc, maxxSrc, maxySrc, minxDst, minyDst, maxxDst, maxyDst, - pj_obj_create(ctx, co->normalizeForVisualization()), - co->nameStr(), alt.accuracy, alt.isOffshore); + pjNormalized, co->nameStr(), alt.accuracy, + alt.isOffshore); } } return pjNew.release(); @@ -8890,7 +8894,9 @@ PJ *proj_normalize_for_visualization(PJ_CONTEXT *ctx, const PJ *obj) { return nullptr; } try { - return pj_obj_create(ctx, co->normalizeForVisualization()); + auto pjNormalized = pj_obj_create(ctx, co->normalizeForVisualization()); + pjNormalized->over = obj->over; + return pjNormalized; } catch (const std::exception &e) { proj_log_debug(ctx, __FUNCTION__, e.what()); return nullptr; diff --git a/test/unit/gie_self_tests.cpp b/test/unit/gie_self_tests.cpp index b0f00e338e..ad973246f6 100644 --- a/test/unit/gie_self_tests.cpp +++ b/test/unit/gie_self_tests.cpp @@ -1105,6 +1105,10 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) { EXPECT_NEAR(input_over.xyz.x, input_over_inv.xyz.x, 1e-8); EXPECT_NEAR(input_over.xyz.y, input_over_inv.xyz.y, 1e-8); + auto Pnormalized = proj_normalize_for_visualization(ctx, P); + ASSERT_TRUE(Pnormalized->over); + proj_destroy(Pnormalized); + proj_destroy(P); } @@ -1196,6 +1200,13 @@ TEST(gie, proj_create_crs_to_crs_from_pj_force_over) { EXPECT_NEAR(output_over.xyz.x, 4980122.749364435, 1e-8); EXPECT_NEAR(output_over.xyz.y, 14467212.882603768, 1e-8); + auto Pnormalized = proj_normalize_for_visualization(ctx, P); + ASSERT_TRUE(Pnormalized->over); + for (const auto &op : Pnormalized->alternativeCoordinateOperations) { + ASSERT_TRUE(op.pj->over); + } + proj_destroy(Pnormalized); + proj_destroy(P); }