diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/filemanager.cpp | 79 | ||||
| -rw-r--r-- | src/iso19111/operation/transformation.cpp | 1 |
3 files changed, 65 insertions, 17 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 16eca5de..b54f4323 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,7 +6,7 @@ TESTS = geodtest check_PROGRAMS = geodtest AM_CPPFLAGS = -DPROJ_LIB=\"$(pkgdatadir)\" \ - -DMUTEX_@MUTEX_SETTING@ -I$(top_srcdir)/include @SQLITE3_CFLAGS@ @TIFF_CFLAGS@ @TIFF_ENABLED_FLAGS@ @CURL_CFLAGS@ @CURL_ENABLED_FLAGS@ + -DMUTEX_@MUTEX_SETTING@ -I$(top_srcdir)/include @SQLITE3_CFLAGS@ @TIFF_CFLAGS@ @TIFF_ENABLED_FLAGS@ @CURL_CFLAGS@ @CURL_ENABLED_FLAGS@ @PROJ_LIB_ENV_VAR_TRIED_LAST_FLAGS@ AM_CXXFLAGS = @CXX_WFLAGS@ @FLTO_FLAG@ include_HEADERS = proj.h proj_experimental.h proj_constants.h geodesic.h \ diff --git a/src/filemanager.cpp b/src/filemanager.cpp index 0a0af8cf..121a4b3a 100644 --- a/src/filemanager.cpp +++ b/src/filemanager.cpp @@ -1362,6 +1362,12 @@ static const char *proj_lib_name = nullptr; #endif +#ifdef PROJ_LIB_ENV_VAR_TRIED_LAST +static bool gbPROJ_LIB_ENV_VAR_TRIED_LAST = true; +#else +static bool gbPROJ_LIB_ENV_VAR_TRIED_LAST = false; +#endif + static bool dontReadUserWritableDirectory() { // Env var mostly for testing purposes and being independent from // an existing installation @@ -1448,8 +1454,10 @@ static void *pj_open_lib_internal( sysname = fname.c_str(); } - /* if is environment PROJ_LIB defined */ - else if (!(projLib = NS_PROJ::FileManager::getProjLibEnvVar(ctx)) + /* if the environment PROJ_LIB defined, and *not* tried as last + possibility */ + else if (!gbPROJ_LIB_ENV_VAR_TRIED_LAST && + !(projLib = NS_PROJ::FileManager::getProjLibEnvVar(ctx)) .empty()) { auto paths = NS_PROJ::internal::split(projLib, dirSeparator); for (const auto &path : paths) { @@ -1461,17 +1469,42 @@ static void *pj_open_lib_internal( if (fid) break; } + } + + else if ((sysname = get_path_from_relative_share_proj( + ctx, name, fname)) != nullptr) { /* check if it lives in a ../share/proj dir of the proj dll */ - } else if ((sysname = get_path_from_relative_share_proj( - ctx, name, fname)) != nullptr) { + } else if (proj_lib_name != nullptr && + (fid = open_file( + ctx, + (std::string(proj_lib_name) + DIR_CHAR + name).c_str(), + mode)) != nullptr) { + /* or hardcoded path */ - } else if ((sysname = proj_lib_name) != nullptr) { - fname = sysname; + fname = proj_lib_name; fname += DIR_CHAR; fname += name; sysname = fname.c_str(); + } + + /* if the environment PROJ_LIB defined, and tried as last possibility */ + else if (gbPROJ_LIB_ENV_VAR_TRIED_LAST && + !(projLib = NS_PROJ::FileManager::getProjLibEnvVar(ctx)) + .empty()) { + auto paths = NS_PROJ::internal::split(projLib, dirSeparator); + for (const auto &path : paths) { + fname = path; + fname += DIR_CHAR; + fname += name; + sysname = fname.c_str(); + fid = open_file(ctx, sysname, mode); + if (fid) + break; + } + } + + else { /* just try it bare bones */ - } else { sysname = name; } @@ -1516,21 +1549,35 @@ std::vector<std::string> pj_get_default_searchpaths(PJ_CONTEXT *ctx) { ignoreUserWritableDirectory[0] == '\0') { ret.push_back(proj_context_get_user_writable_directory(ctx, false)); } + const std::string envPROJ_LIB = NS_PROJ::FileManager::getProjLibEnvVar(ctx); - if (!envPROJ_LIB.empty()) { - ret.push_back(envPROJ_LIB); - } - if (envPROJ_LIB.empty()) { - const std::string relativeSharedProj = pj_get_relative_share_proj(ctx); + const std::string relativeSharedProj = pj_get_relative_share_proj(ctx); + + if (gbPROJ_LIB_ENV_VAR_TRIED_LAST) { +/* Situation where PROJ_LIB environment variable is tried in last */ +#ifdef PROJ_LIB + ret.push_back(PROJ_LIB); +#endif if (!relativeSharedProj.empty()) { ret.push_back(relativeSharedProj); } - } + if (!envPROJ_LIB.empty()) { + ret.push_back(envPROJ_LIB); + } + } else { + /* Situation where PROJ_LIB environment variable is used if defined */ + if (!envPROJ_LIB.empty()) { + ret.push_back(envPROJ_LIB); + } else { + if (!relativeSharedProj.empty()) { + ret.push_back(relativeSharedProj); + } #ifdef PROJ_LIB - if (envPROJ_LIB.empty()) { - ret.push_back(PROJ_LIB); - } + ret.push_back(PROJ_LIB); #endif + } + } + return ret; } diff --git a/src/iso19111/operation/transformation.cpp b/src/iso19111/operation/transformation.cpp index fec821a1..45e1d9af 100644 --- a/src/iso19111/operation/transformation.cpp +++ b/src/iso19111/operation/transformation.cpp @@ -1992,6 +1992,7 @@ isGeographic3DToGravityRelatedHeight(const OperationMethodNNPtr &method, "1048", // Geographic3D to GravityRelatedHeight (Ausgeoid v2) "1050", // Geographic3D to GravityRelatedHeight (CI) "1059", // Geographic3D to GravityRelatedHeight (PNG) + "1088", // Geog3D to Geog2D+GravityRelatedHeight (gtx) "1060", // Geographic3D to GravityRelatedHeight (CGG2013) "1072", // Geographic3D to GravityRelatedHeight (OSGM15-Ire) "1073", // Geographic3D to GravityRelatedHeight (IGN2009) |
