本篇文章将在之前讲的以下两篇文章的基础上,实现添加矢量图层、栅格图层及图层列表的功能,代码均参考QGIS源码实现。

QGIS二次开发1: vs工程环境配置_guoqiong07的博客-CSDN博客

QT界面开发1:使用QtitanRibbon5开发软件界面_guoqiong07的博客-CSDN博客

最终要实现的效果如下:

1.中间画布展示矢量、栅格数据;

2.左侧展示图层列表,当勾选/取消勾选图层时,中间画布随之展示/隐藏。

一、图层列表的实现

接着上一篇讲解QT界面开发的文章中第6点【添加侧边栏】,现在我们讲解如何在侧边栏中添加图层列表。

QT界面开发1:使用QtitanRibbon5开发软件界面_guoqiong07的博客-CSDN博客

实现图层列表的代码如下:

    //新建图层树形控件mLayerTreeView = new QgsLayerTreeView(this);mLayerTreeView->setObjectName(QStringLiteral("theLayerTreeView"));//创建QgsLayerTreeModel 实例,并允许用户通过点选复选框手动隐藏/显示图层QgsLayerTreeModel* model = new QgsLayerTreeModel(QgsProject::instance()->layerTreeRoot(), this);model->setFlag(QgsLayerTreeModel::AllowNodeChangeVisibility);model->setAutoCollapseLegendNodes(10);//将View视图与Model数据绑定mLayerTreeView->setModel(model);//将工程实例中的图层根节点与画布绑定,实现与地图画布控件的数据交互mLayerTreeCanvasBridge = new QgsLayerTreeMapCanvasBridge(QgsProject::instance()->layerTreeRoot(), mMapCanvas, this);//将View添加到左侧的Dock控件中展示mLayerMapDock->setWidget(mLayerTreeView);

1.首先,创建一个图层树形控件。

也就是我们这里所说的图层列表。QGIS中专门提供了QgsLayerTreeView 类来实现图层列表功能,而这里的图层列表实际上应该称之为图层树形控件,因为图层可以分组,每个分组下面可以有多个图层。

mLayerTreeView = new QgsLayerTreeView(this);

2.接下来,创建Model实例。

这里的Model实例,是通过调用QgsProject的实例中的layerTreeRoot() 方法来实现的,目的是为了获取当前工程的图层根节点。QgsProject封装了当前QGIS工程信息,一个应用程序只有一个QgsProject工程实例。

 QgsLayerTreeModel* model = new QgsLayerTreeModel(QgsProject::instance()->layerTreeRoot(), this);model->setFlag(QgsLayerTreeModel::AllowNodeChangeVisibility);

3.接下来,绑定视图与数据。

Model/View 架构实现了数据与视图的双向绑定,任何一方的变化都会反馈到另外一方。

mLayerTreeView->setModel(model);

4.接下来, 创建QgsLayerTreeMapCanvasBridge实例。

QgsLayerTreeMapCanvasBridge是QGIS中图层管理的重要类,实现了当前工程中的图层与地图画布控件的数据交互。也就是当我们将图层添加到当前工程中时,地图画布mMapCanvas会渲染该图层进行显示。

mLayerTreeCanvasBridge = new QgsLayerTreeMapCanvasBridge(QgsProject::instance()->layerTreeRoot(), mMapCanvas, this);

5.将图层列表展示在左侧栏。

图层列表的创建工作和绑定工作做完后,需要将该图层列表放在软件界面的某个地方进行展示,该代码段则是将mLayerTreeView放在之前创建好的mLayerMapDock控件中展示。

 mLayerMapDock->setWidget(mLayerTreeView);

总结:图层列表、当前工程中的图层 、地图画布这是三个不同的概念,当我们将这三者绑定在一起后,才能正常实现添加图层到工程并进行展示。

二、添加栅格图层

在这篇文章中第2点【创建QAction】我们创建了添加栅格的槽函数slot_addRaterLayer。接下来实现该函数。

QT界面开发1:使用QtitanRibbon5开发软件界面_guoqiong07的博客-CSDN博客

1.添加引用的头文件。

#include <QMessageBox>#include "qgsguiutils.h"
#include "QgsRasterLayer.h"
#include "QgsProject.h"
#include "QgsProviderRegistry.h"
#include "QgsMapCanvas.h"
#include "QgsVectorLayer.h"

2.实现slot_addRaterLayer。

具体的代码如下,内容比较简单,容易理解。

    QStringList layerFiles;QString e;QString title = tr("Open Raster Layer");QString rasterFileFilter = "All supported(*.tif *.img *.hgt *.grd);;GeoTIFF(*.tif *.tiff *.TIF *.TIFF);;Erdas Imagine Images(*.img *.IMG);;NetCDF(*.grd *.GRD);;STRMHGT File(*.hgt *.HGT)";QgsGuiUtils::openFilesRememberingFilter(QStringLiteral("lastRasterFileFilter"), rasterFileFilter, layerFiles, e, title);if (layerFiles.isEmpty())return false;// this is messy since some files in the list may be rasters and others may// be ogr layers. We'll set returnValue to false if one or more layers fail// to load.bool returnValue = true;QList<QgsMapLayer*> myList;for (auto myIterator = layerFiles.begin();myIterator != layerFiles.end();++myIterator){QString errMsg;bool ok = false;if (QgsRasterLayer::isValidRasterFileName(*myIterator, errMsg)){QFileInfo myFileInfo(*myIterator);QString layerName = myFileInfo.completeBaseName();const QVariantMap uriDetails = QgsProviderRegistry::instance()->decodeUri(QStringLiteral("gdal"), *myIterator);if (!uriDetails[QStringLiteral("layerName")].toString().isEmpty()){layerName = uriDetails[QStringLiteral("layerName")].toString();}// try to create the layerQgsRasterLayer* layer = new QgsRasterLayer(*myIterator, layerName, QStringLiteral("gdal"));if (layer && layer->isValid()){myList << layer;ok = true;}} // valid raster filenameelse{ok = false;QString msg = tr("%1 is not a supported raster data source").arg(*myIterator);if (!errMsg.isEmpty())msg += '\n' + errMsg;QMessageBox::warning(this, "Unsupported Data Source", msg);}if (!ok){returnValue = false;}}QgsProject::instance()->addMapLayers(myList);return returnValue;

需要说明的是,rasterFileFilter 设置了支持打开的栅格影像格式;在最后,将创建好的栅格图层添加到工程中。由于之前做了图层列表、当前工程中的图层 、地图画布的绑定,添加的图层将会在图层列表中罗列出来,同时会在画布中展示当前图层。

    QgsProject::instance()->addMapLayers(myList);

三、添加矢量图层

设置允许添加的矢量格式vectorFileFilter ,将创建好的图层添加到工程。

    QStringList layerFiles;QString e;QString title = tr("Open Vector Layer");QString vectorFileFilter = "OGR Layer(*.shp *.geojson *.gmt);; KML(*.kml)";QgsGuiUtils::openFilesRememberingFilter(QStringLiteral("lastRasterFileFilter"), vectorFileFilter, layerFiles, e, title);if (layerFiles.isEmpty())return false;QList<QgsMapLayer*> layersToAdd;for (QString src : layerFiles){src = src.trimmed();QFileInfo fi(src);QString baseName = fi.completeBaseName();// create the layerQgsVectorLayer::LayerOptions options{ QgsProject::instance()->transformContext() };options.loadDefaultStyle = false;QgsVectorLayer* layer = new QgsVectorLayer(src, baseName, QStringLiteral("ogr"), options);if (layer != nullptr && layer->isValid()){layersToAdd << layer;}else{delete layer;QString msg = tr("%1 is not a valid or recognized data source.").arg(src);QMessageBox::warning(this, tr("Invalid Data Source"), msg);}}if (layersToAdd.size() > 0){QgsProject::instance()->addMapLayers(layersToAdd);}return true;

QGIS二次开发2:添加矢量、栅格图层及图层列表的实现相关推荐

  1. QGIS二次开发地图添加标记添加注记Svg小图标SvgItem

    QGIS二次开发地图添加标记添加注记Svg小图标 即QgsAnnotationLayer.QgsMarkerSymbol和QgsAnnotationMarkerItem的用法,我把QGIS3.20软件 ...

  2. QGis二次开发基础 -- 构建图层管理器

    为了回应有些同学对上一篇博文的建议,这篇文章主要关注于QGis二次开发中的"图层管理器"的实现. 使用QGis构建独立应用系统,我相信大部分同学应该还是关注于GIS基本功能框架构建 ...

  3. qgis二次开发环境搭建(超级详细)

    最近有一个项目要求基于qgis+QT进行二次开发开发,要使用到qgis平台.陆陆 续续花了差不多两个多星期,在把开发环境搭建起来. 首先就面临2种选择,一种 到qgis官网下载源码,进行编译,此 情况 ...

  4. QGis二次开发基础 -- 根据属性查询要素

    属性查询是GIS应用不可缺少的重要功能,尤其是在各种业务系统中,根据用户输入相应的查询条件,从属性要素中快速定位到用户感兴趣的要素,为业务应用提供了便利.本文就来聊一聊QGis二次开发中如何实现属性查 ...

  5. QGIS二次开发:鼠标在地图上移动时,状态栏显示鼠标所在位置经纬度

    主要思路: 当鼠标在地图画布控件上移动时,会发送xyCoordinates信号,该信号参数是墨卡托坐标系表示的地图上的点坐标,然后将墨卡托坐标转为经纬度表示的WSG84坐标,绑定该信号到槽函数,然后发 ...

  6. 基于ZFAKA二次开发,添加PayJS支付渠道

    基于ZFAKA二次开发,添加PayJS支付渠道 项目地址:https://github.com/hiyouli/payjs-for-zfaka 关于ZFAKA,请移步:ZFAKA 免费.安全.稳定.高 ...

  7. QGIS二次开发:加载XYZ Tiles形式的瓦片地图

    1.前言 QGIS官方提供的QGIS.exe可以加载远程地图提供商提供的基于URL格式的XYZ Tiles形式的瓦片地图.如:https://tile.openstreetmap.org/{z}/{x ...

  8. discuz二次开发 教你识别程序目录和文件列表

    本列表总览分两个部分, 第一个部分为:目录.文件篇. 第二个部分为:模板文件结构篇. 目录+文件篇: | – admin.php 管理员入口 | – api.php 接口文件 | – category ...

  9. QGIS二次开发 数据编辑功能等

    数据编辑 环境搭建 软件下载 QGIS下载较简单 这是个开源免费的软件 VS2015 有安装经验了 QT下载:https://blog.csdn.net/jjxcsdn/article/details ...

  10. UG二次开发GRIP添加属性

    组件 或 零件 添加属性 entity/COMP,ent string/std(2,132),str(4,132),mold(132) string/add(2,132) entity/obj STR ...

最新文章

  1. 基于空间金字塔池化的卷积神经网络物体检测
  2. Java:多态的概念和案例实现
  3. 高等数学上-赵立军-北京大学出版社-题解-练习5.1
  4. linux服务器防端口扫描,linux下防止syn***,端口扫描和死亡之ping
  5. 国庆出游,这个银行卡大小的充电宝一定要带
  6. oracle的存储设置默认参数,oracle初始化参数设置
  7. Android and Apple 投屏至linux电脑
  8. IOS基础学习日志(七)利用dispatch_once创建单例及使用
  9. Framework层SMS发送
  10. 精确率(查准率)、召回率(查全率)和F1值
  11. 游戏网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  12. 中国大学MOOC伦理学试题题库及答案
  13. HNOI 2009 图的同构记数 题解
  14. js 让鼠标右下角有一排小字_JS实现跟随鼠标的链接文字提示框效果
  15. 2011款iMac的AirDrop使用方法。
  16. 壮游奇迹哪个服务器稳定,壮游奇迹MU官方选哪个区好呢?
  17. English--基础知识点--6--非限制性定语从句
  18. 教你实现一个简单的对象深拷贝
  19. 用java设计实现一个简单的动作冒险类游戏
  20. 【2020.10.31 洛谷团队赛 普及组】T2 U138180 神仙数论题

热门文章

  1. jdk11的class反射机制,将newInstance()方法设置为了不建议使用了,怎么通过反射创建新的对象
  2. 第二课 介绍:手绘墙画颜料选择
  3. Laravel之数据库操作与Eloquent模型使用总结
  4. SpringBoot拦截器或过滤器中使用流读取参数后,controller中注解读取不到参数
  5. Java根据图片提取文字
  6. 分析力学-清华大学基科班课件
  7. 第三方自动投票软件制作教程
  8. presenting view controller
  9. .NET发邮件(验证码)
  10. matlab中stract用法_matlab初学之strcat、num2str