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,如下所示:
- #include<iostream>
- #include<proj.h>
- int main(){
- char strDir[256];// proj.db所在路径。建议将proj.db拷贝到exe程序所在路径,并将exe所在路径提取出来。
- std::string strEnvTmp = "PROJ_DATA=";
- strEnvTmp += strDir;
- #ifdef _WIN32
- int nRet = _putenv(strEnvTmp.c_str());// windows平台用_putenv设置环境变量
- #else
- int nRet = setenv("PROJ_DATA", strDir, 1);//linux 平台更推荐setenv
- #endif // _WIN32
- std::cout << "PROJ_DATA:" << getenv("PROJ_DATA") << std::endl;
- if (nRet == -1)
- {
- std::cerr << "Cannot set environment variable PROJ_DATA!" << std::endl;
- return -1;
- }
- else return 1;
- }
复制代码 方法三:在利用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是路径字符串数组的首指针。
将搜刮路径设置为程序地点目录".“和上层目录”…",示例代码如下:
- #include<iostream>
- #include<proj.h>
- int main(){
- context = proj_context_create();
- const char* path[] = { ".",".." };//, nullptr};// 设置proj.db的搜索路径
- proj_context_set_search_paths(context, 2, path);
- std::cout << "proj.db path: " << proj_context_get_database_path(context) << "\n";// 检查所找到的proj.db路径是否正确
- return 0;
- }
复制代码 方法四:在利用GDAL库的程序中调用函数设置搜刮路径
在GDAL库中,提供了更简单的OSRSetPROJSearchPaths()函数(GDAL3.0起支持)或CPLSetConfigOption()函数(GDAL3.7起支持)设置proj.db的搜刮路径。
先先容OSRSetPROJSearchPaths()函数。该函数仅包罗一个参数,即路径字符串数组首指针。利用方式如下(需要包罗ogr_srs_api.h头文件):
- #include<ogr_srs_api.h>
- ///......上略
- const char* path[] = { ".","..",nullptr };// 设置proj.db的搜索路径
- OSRSetPROJSearchPaths(path);
复制代码 然后是CPLSetConfigOption()函数。该函数包罗两个参数,即设置项属性名和值字符串。利用方式如下(需要包罗cpl_conv.h头文件):
- #include<cpl_conv.h>
- ///......上略
- const char* path = "Your proj.db's path.";// 设置proj.db的搜索文件夹路径
- CPLSetConfigOption("PROJ_DATA", path);
复制代码 参考GDAL官方文档
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |