qgis c++二次开发初始化介绍

前言

上篇文章qgis二次开发环境搭建(qgis-3.28.6+qt5.15)的末尾介绍了如何新建一个Qt工程,链接QGIS库并调用Qgis::releaseName(),工程代码在仓库qgis_cpp_api_apps中。

但是要调用更复杂的QGIS函数需要添加一些初始化函数,下边将介绍如何初始化。

初始化函数

插件初始化

cpp 复制代码
//Alters prefix path - used by 3rd party apps.
QgsApplication::setPrefixPath( strAppDir, false );
QString strPluginDir = strAppDir + QString("/plugins/");
QgsApplication::setPluginPath(strPluginDir);
QString strPkgDir = strAppDir + QString("/share/qgis");
QgsApplication::setPkgDataPath(strPkgDir);
//loads providers
QgsApplication::initQgis();
  • QgsApplication::setPluginPath用于设置插件目录,如果不设置插件目录,则只能只用QGis的内置插件,下图是未设置目录的输出

    src/core/providers/qgsproviderregistry.cpp:249 : (init) [31447ms] No dynamic QGIS data provider plugins found in:
    /home/t/gis/qgis_cpp_api_apps/lib/qgis/plugins
    src/core/providers/qgsproviderregistry.cpp:337 : (init) [0ms] Loaded 7 providers (copc;ept;gdal;memory;mesh_memory;ogr;vectortile)
    src/core/qgsmessagelog.cpp:29 : (logMessage) [10804ms] 2023-10-15T08:56:07 No Authentication Methods[1] No QGIS auth method plugins found in:
    /home/t/gis/qgis_cpp_api_apps/lib/qgis/plugins
    No authentication methods can be used. Check your QGIS installation
    src/core/auth/qgsauthmanager.cpp:487 : (isDisabled) [0ms] Authentication system DISABLED: QCA's qca-ossl (OpenSSL) plugin is missing

  • 从上边的输出可以看到只加载了7个providers,第三方的data provider不能正常工作

  • 下面是正常加载插件的输出

    src/core/providers/qgsproviderregistry.cpp:337 : (init) [16677ms] Loaded 23 providers (OAPIF;WFS;arcgisfeatureserver;arcgismapserver;copc;delimitedtext;ept;gdal;geonode;gpx;mdal;memory;mesh_memory;mssql;ogr;postgres;postgresraster;spatialite;vectortile;virtual;virtualraster;wcs;wms)

  • plugins目录下是一些第三方动态库,如下图

算法初始化

复制代码
 QgsApplication::processingRegistry()->addProvider( new QgsNativeAlgorithms( QgsApplication::processingRegistry() ) );
  • 在调用本地算法如生成缓冲区之前,需要调用上述函数,否则会失败。如下图

  • 如果代码中没有用到空间分析即算法相关功能,可以不调用该函数

坐标映射

PROJ是一个通用的坐标转换软件,它将地理空间坐标从一个坐标参考系(CRS)转换到另一个坐标参考系。

复制代码
    //proj的配置目录,坐标映射相关 proj.db
    QString strProjDir = strAppDir + QString("/share/proj/");
    qputenv("PROJ_LIB",strProjDir.toStdString().c_str());
  • 这段代码用于坐标映射

  • 在QGis的User Manual有描述Proj坐标映射的段落,如下图

  • 不过proj设置的不对或者proj.db不存在报错如下

    proj_get_authorities_from_database: Cannot find proj.db
    ERROR 1: PROJ: proj_identify: Cannot find proj.db
    src/core/proj/qgscoordinatereferencesystem.cpp:1099 : (getRecord) [19385ms] failed : /home/t/gis/qgis_cpp_api_apps/bin/share/qgis/resources/srs.db does not exist!
    proj_create_from_wkt: Cannot find proj.db
    proj_identify: Cannot find proj.db
    proj_as_wkt: Cannot find proj.db
    ERROR 1: PROJ: proj_identify: Cannot find proj.db
    proj_crs_create_bound_crs_to_WGS84: Cannot find proj.db
    proj_as_proj_string: Cannot find proj.db

  • share/proj的目录内容如下

总结

目前在qgis_cpp_api_apps代码只用到了以上几个初始化,随着项目的深入可能会遇到新的需要初始化的情况!

相关推荐
炘爚几秒前
深入解析内存分区:程序运行的秘密
c++
网域小星球28 分钟前
C++ 从 0 入门(五)|C++ 面试必知:静态成员、友元、const 成员(高频考点)
开发语言·c++·面试·静态成员·友元函数
|_⊙29 分钟前
C++11 右值引用
开发语言·c++
李昊哲小课34 分钟前
WSL Ubuntu 24.04 GPU 加速环境完整安装指南
c++·pytorch·深度学习·ubuntu·cuda·tensorflow2
Byte不洛36 分钟前
C++继承详解(菱形继承与虚拟继承)
c++·继承·面向对象·菱形继承·虚拟继承
闻缺陷则喜何志丹1 小时前
【排序 离散化 二维前缀和】 P7149 [USACO20DEC] Rectangular Pasture S|普及+
c++·算法·排序·离散化·二维前缀和
君义_noip1 小时前
信息学奥赛一本通 4163:【GESP2512七级】城市规划 | 洛谷 P14921 [GESP202512 七级] 城市规划
c++·算法·图论·gesp·信息学奥赛
不想写代码的星星1 小时前
C++ 的花括号有多狂?std::initializer_list 那些不讲武德的事儿
c++
elseif1231 小时前
初学者必背【考点清单(大全)】【上篇】
开发语言·c++·笔记·学习·循环结构·分支结构·考纲
并不喜欢吃鱼1 小时前
从零开始C++----二.(下篇)模版进阶与编译全过程的复习
开发语言·c++