From f2e66ecb6d62933dc9ed6e14c3887c80eca11fec Mon Sep 17 00:00:00 2001 From: Javier Jimenez Shaw Date: Fri, 23 Apr 2021 20:55:23 +0200 Subject: [PATCH] add proj_get_geoid_models_from_database to C API --- scripts/reference_exported_symbols.txt | 1 + src/iso19111/c_api.cpp | 43 ++++++++++++++++++ src/proj.h | 6 +++ test/unit/test_c_api.cpp | 60 ++++++++++++++++++++++++++ 4 files changed, 110 insertions(+) diff --git a/scripts/reference_exported_symbols.txt b/scripts/reference_exported_symbols.txt index d48ae2903f..4f853090cb 100644 --- a/scripts/reference_exported_symbols.txt +++ b/scripts/reference_exported_symbols.txt @@ -971,6 +971,7 @@ proj_get_crs_info_list_from_database proj_get_crs_list_parameters_create proj_get_crs_list_parameters_destroy proj_get_ellipsoid +proj_get_geoid_models_from_database proj_get_id_auth_name proj_get_id_code proj_get_insert_statements diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp index ce7f2ae287..f8d9e68510 100644 --- a/src/iso19111/c_api.cpp +++ b/src/iso19111/c_api.cpp @@ -9162,3 +9162,46 @@ PROJ_STRING_LIST proj_get_insert_statements( } return nullptr; } + +// --------------------------------------------------------------------------- + +/** \brief Returns a list of geoid models available for that crs + * + * The list includes the geoid models connected directly with the crs, + * or via "Height Depth Reversal" or "Change of Vertical Unit" transformations. + * The returned list is NULL terminated and must be freed with + * proj_string_list_destroy(). + * + * @param ctx Context, or NULL for default context. + * @param auth_name Authority name (must not be NULL) + * @param code Object code (must not be NULL) + * @param options should be set to NULL for now + * @return list of geoid models names (to be freed with + * proj_string_list_destroy()), or NULL in case of error. + * @since 8.1 + */ +PROJ_STRING_LIST +proj_get_geoid_models_from_database(PJ_CONTEXT *ctx, const char *auth_name, + const char *code, + const char *const *options) { + SANITIZE_CTX(ctx); + if (!auth_name || !code) { + proj_context_errno_set(ctx, PROJ_ERR_OTHER_API_MISUSE); + proj_log_error(ctx, __FUNCTION__, "missing required input"); + return nullptr; + } + (void)options; + try { + const std::string codeStr(code); + auto factory = AuthorityFactory::create(getDBcontext(ctx), auth_name); + auto geoidModels = factory->getGeoidModels(codeStr); + ctx->safeAutoCloseDbIfNeeded(); + return to_string_list(std::move(geoidModels)); + } catch (const std::exception &e) { + proj_log_error(ctx, __FUNCTION__, e.what()); + } + ctx->safeAutoCloseDbIfNeeded(); + return nullptr; +} + +// --------------------------------------------------------------------------- diff --git a/src/proj.h b/src/proj.h index 49bf991cee..0f78271a47 100644 --- a/src/proj.h +++ b/src/proj.h @@ -1188,6 +1188,12 @@ PJ_OBJ_LIST PROJ_DLL *proj_identify(PJ_CONTEXT *ctx, const char* const *options, int **out_confidence); +PROJ_STRING_LIST PROJ_DLL proj_get_geoid_models_from_database( + PJ_CONTEXT *ctx, + const char *auth_name, + const char *code, + const char *const *options); + void PROJ_DLL proj_int_list_destroy(int* list); /* ------------------------------------------------------------------------- */ diff --git a/test/unit/test_c_api.cpp b/test/unit/test_c_api.cpp index 8fa1b22807..2ee349a6b2 100644 --- a/test/unit/test_c_api.cpp +++ b/test/unit/test_c_api.cpp @@ -5619,5 +5619,65 @@ TEST_F(CApi, proj_get_insert_statements) { proj_insert_object_session_destroy(m_ctxt, session); } } +// --------------------------------------------------------------------------- + +TEST_F(CApi, proj_get_geoid_models_from_database) { + + const std::string GEOID12B{"GEOID12B"}; + const std::string GEOID18{"GEOID18"}; + const std::string OSGM15{"OSGM15"}; + + auto findInList = [](PROJ_STRING_LIST list, const std::string &ref) { + while (list && *list) { + if (std::string(*list) == ref) { + return true; + } + list++; + } + return false; + }; + + { + auto list = proj_get_geoid_models_from_database(m_ctxt, "EPSG", "4326", + nullptr); + ListFreer freer(list); + ASSERT_NE(list, nullptr); + EXPECT_EQ(list[0], nullptr); + } + + { + auto list = proj_get_geoid_models_from_database(m_ctxt, "EPSG", "5703", + nullptr); + ListFreer freer(list); + EXPECT_TRUE(findInList(list, GEOID12B)); + EXPECT_TRUE(findInList(list, GEOID18)); + EXPECT_FALSE(findInList(list, OSGM15)); + } + { + auto list = proj_get_geoid_models_from_database(m_ctxt, "EPSG", "8228", + nullptr); + ListFreer freer(list); + EXPECT_TRUE(findInList(list, GEOID12B)); + EXPECT_TRUE(findInList(list, GEOID18)); + EXPECT_FALSE(findInList(list, OSGM15)); + } + { + auto list = proj_get_geoid_models_from_database(m_ctxt, "EPSG", "6358", + nullptr); + ListFreer freer(list); + EXPECT_TRUE(findInList(list, GEOID12B)); + EXPECT_TRUE(findInList(list, GEOID18)); + EXPECT_FALSE(findInList(list, OSGM15)); + } + + { + auto list = proj_get_geoid_models_from_database(m_ctxt, "EPSG", "5701", + nullptr); + ListFreer freer(list); + EXPECT_FALSE(findInList(list, GEOID12B)); + EXPECT_FALSE(findInList(list, GEOID18)); + EXPECT_TRUE(findInList(list, OSGM15)); + } +} } // namespace