PROJ/GDAL库设置资源文件proj.db路径的两种方法

打印 上一主题 下一主题

主题 923|帖子 923|积分 2773

PROJ库的资源文件proj.db

proj.db是一个包罗坐标转换信息的SQLite数据库,是PROJ运行所必须的资源文件。PROJ库也是GDAL库的一个重要依赖项,因此GDAL在利用PROJ的功能时,也间接地需要proj.db文件。
下面提供两种设置proj.db路径的方法。
PROJ库自动搜刮proj.db的顺序


  • For resource files that have an explicit relative or absolute path, the directory specified in the filename.
  • 函数proj_context_set_file_finder()设置的路径。若此函数设置了搜刮路径,后续的查找都不会继续。
  • 函数proj_context_set_search_paths()。若此函数设置了搜刮路径,后续的查找都不会继续。
  • 自PROJ 7.0版本开始,自动搜刮用户可写路径:
平台路径Windows${LOCALAPPDATA}/projmacOS${HOME}/Library/Application Support/projLinux${XDG_DATA_HOME}/proj if XDG_DATA_HOME is defined. Else ${HOME}/.local/share/proj 自PROJ 9.5版本起,也可以调用proj_context_set_user_writable_directory()设置用户可写路径。

  • 环境变量PROJ_DATA指定的路径。 在PROJ 9.1版本以前,该环境变量名为PROJ_LIB;在后续版本中,将仅支持PROJ_DATA。On Linux/macOS/Unix, use : to separate paths. On Windows, ;
  • 自PROJ 7.0版本开始,支持相对路径查找:例如,库proj.dll/libproj.so安装在../bin/或../lib/中时,会实行在../share/proj/中查找资源文件proj.db。
  • 编译PROJ库时大概会在Makefile或CMake设置项中指定的资源文件路径。显然,编译好PROJ后拷贝到别处,这一资源文件路径也就跟着失效。
  • 调用proj_context_set_enable_network()函数或将环境变量PROJ_NETWORK设置为ON时,PROJ将实行从网络下载资源文件。
特别注意,特别注意

利用下面的方法之前,肯定确保设置的路径下存在proj.db!肯定记得把proj.db拷贝到你设置的路径下!
方法一:设置系统环境变量

可以选择在系统环境变量中永世添加PROJ_DATA项目,值为proj.db地点的路径(目录),以windows平台为例:

方法二:在程序中设置环境变量

在代码中临时添加环境变量PROJ_DATA,如下所示:
  1. #include<iostream>
  2. #include<proj.h>
  3. int main(){
  4.     char strDir[256];// proj.db所在路径。建议将proj.db拷贝到exe程序所在路径,并将exe所在路径提取出来。
  5.     std::string strEnvTmp = "PROJ_DATA=";
  6.     strEnvTmp += strDir;
  7. #ifdef _WIN32
  8.     int nRet = _putenv(strEnvTmp.c_str());// windows平台用_putenv设置环境变量
  9. #else
  10.     int nRet = setenv("PROJ_DATA", strDir, 1);//linux 平台更推荐setenv
  11. #endif // _WIN32
  12.     std::cout << "PROJ_DATA:" << getenv("PROJ_DATA") << std::endl;
  13.     if (nRet == -1)
  14.     {
  15.         std::cerr << "Cannot set environment variable PROJ_DATA!" << std::endl;
  16.         return -1;
  17.     }
  18.     else return 1;
  19. }
复制代码
方法三:在利用PROJ库的程序中调用函数设置搜刮路径

在PROJ库中,·proj_context_set_search_paths函数可用于设置资源文件的搜刮路径。
   void proj_context_set_search_paths(PJ_CONTEXT *ctx, int count_paths, const char *const *paths)
它包罗三个参数:
第一个参数ctx是PROJ上下文,通过调用proj_context_create()创建;第二个参数count_paths是路径数目,第三个参数paths是路径字符串数组的首指针。
  将搜刮路径设置为程序地点目录".“和上层目录”…",示例代码如下:
  1. #include<iostream>
  2. #include<proj.h>
  3. int main(){
  4.     context = proj_context_create();
  5.     const char* path[] = { ".",".." };//, nullptr};// 设置proj.db的搜索路径
  6.     proj_context_set_search_paths(context, 2, path);
  7.     std::cout << "proj.db path: " << proj_context_get_database_path(context) << "\n";// 检查所找到的proj.db路径是否正确
  8.     return 0;
  9. }
复制代码
方法四:在利用GDAL库的程序中调用函数设置搜刮路径

在GDAL库中,提供了更简单的OSRSetPROJSearchPaths()函数(GDAL3.0起支持)或CPLSetConfigOption()函数(GDAL3.7起支持)设置proj.db的搜刮路径。
先先容OSRSetPROJSearchPaths()函数。该函数仅包罗一个参数,即路径字符串数组首指针。利用方式如下(需要包罗ogr_srs_api.h头文件):
  1. #include<ogr_srs_api.h>
  2. ///......上略
  3.     const char* path[] = { ".","..",nullptr };// 设置proj.db的搜索路径
  4.     OSRSetPROJSearchPaths(path);
复制代码
然后是CPLSetConfigOption()函数。该函数包罗两个参数,即设置项属性名和值字符串。利用方式如下(需要包罗cpl_conv.h头文件):
  1. #include<cpl_conv.h>
  2. ///......上略
  3.     const char* path = "Your proj.db's path.";// 设置proj.db的搜索文件夹路径
  4.     CPLSetConfigOption("PROJ_DATA", path);
复制代码
参考GDAL官方文档

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表