这部分参考了博主 Jacory_Gao的博文QGis二次开发基础 – 矢量图层的显示样式,这篇博文起到很好的渲染方面的导引作用,但是有些部分函数的结构和现在用的3.10不太一样了。而且发现里面描写的思路和我开发过程的翻看API的文档思路不太一样,于是重新撰写一遍。

要是有大佬们愿意指点一下开发思路,快来吧。搬板凳听课。

上一篇文章介绍了如何新建空白图层并向图层内新增特征。但如果不加其他的渲染(即显示方式的设置),很难进行多样化的数据显示,出来的效果就如下面两张图所示。

显然上面两张图是没办法满足我们的~所以,继续往下做。

1 Qgis 中渲染的逻辑结构

博文中需要用到的几个大类:

  • QgsVectorLayer
  • QgsFeatureRenderer
  • QgsSymbol
  • QgsSymbolLayerList

1.1 首先从QgsVectorLayer看起

在API文档中,给了这样一个函数
void setRenderer (QgsFeatureRenderer *r)

Sets renderer which will be invoked to represent this layer.-----QGIS API
设置会被激活用于代表这个图层的渲染器

因此我们为了改变图层的渲染样式,所需要的事情就是构建一个我们想要的QgsFeatureRenderer

1.2 到QgsFeatureRenderer

API文档里对QgsFeatureRenderer的架构图

可以从这个图中看出Qgis支持的所有渲染器格式,包括2.5D显示,分类显示,热力图,反向显示等等等。
我们这里只需要基本的改变显示样式的功能,因此关注其中的QgsSingleSymbolRenderer
因此现在的任务就是构建一个QgsSingleSymbolRenderer,因此看看其构造函数
QgsSingleSymbolRenderer::QgsSingleSymbolRenderer ( QgsSymbol * symbol )

在构造函数的描述下有一句话,表示我们传入的QgsSymbol,会用来渲染每一个特征,因此也反映了在singlesymbol的渲染中,不支持对每一个特征点进行单独的渲染设置,例如调整每个点渲染的方向。(如果采用分类渲染,或者改变了原来特征点的性质也有可能,但目前来看,点并不具有角度的性质)
The same symbol will be used to render every feature. Ownership of symbol is transferred to the renderer.

为了构造该渲染器,需要先构造QgsSymbol
ok,问题又转移到了如何构造一个QgsSymbol

1.3 到QgsSymbol

QgsSymbol的官方文档可以看出,其中又细分了三个子类,分别对应着多边形、线、点的渲染。
为了渲染不同的图层,构造对应的子类即可。接下逐一分析点Marker,线Line图层。

观察两个类的构造函数,会发现其传入的参数都是同一个,
QgsMarkerSymbol (const QgsSymbolLayerList &layers=QgsSymbolLayerList())

QgsLineSymbol (const QgsSymbolLayerList &layers=QgsSymbolLayerList())
其构造需要传入参数QgsSymbolLayerList,因此接下来需要分析怎么构造该类

1.4 到QgsSymbolLayerList

发现QgsSymbolLayerList并不是一个独立的类,而是一个QList(Qgis中带List的都表示QList)
typedef QList<QgsSymbolLayer *> QgsSymbolLayerList;
内部存储的为QgsSymbolLayer,那么就转到如何构建这个图层了。

1.5 到 QgsSymbolLayer

下面这个继承关系图,可以看出基本分类还是按照点、线、面进行了子类的派生。我们下一步就只需要构建对应的子类便可。

1.6 总结

根据上面乱七八糟的分析,基本要重新设置图层的渲染器,就是按照下图的步骤进行

QgsFeatureRenderer的子类QgsSymbol的子类

传入
点图层
线图层
构建QgsSingleSymbolRenderer
构建QgsMarkerSymbol
构建QgsLineSymbol
构建QgsSymbolLayer对应子类
QgsSymbolLayerList
调用QgsVectorLayer::setRenderer

2 点图层渲染代码实现

采用的是QgsSymbolLayer的子类QgsSvgMarkerSymbolLayer,传入矢量图标进行渲染

    My_MapCanvas->freeze();// 获取SVG矢量图标,绘制矢量图层QString Image_Path = QFileDialog::getOpenFileName(this,tr("Select a SVG Image"),"D:/QGIS_Code/QGIS_BASIC5/Qgis_Basic5/OSGeo4W64/apps/qgis-ltr/svg",tr("Image Files (*.svg)"));QgsSvgMarkerSymbolLayer* svg_Marker =  new QgsSvgMarkerSymbolLayer(Image_Path);// 创建QgsSymbolLayerListQgsSymbolLayerList Sym_Layer_List;Sym_Layer_List.append(svg_Marker);// 构建QgsMarkerSymbolQgsMarkerSymbol* MarkerSymbol = new QgsMarkerSymbol(Sym_Layer_List);// 构建QgsSingleSymbolRenderer, 即最终图层的渲染器QgsSingleSymbolRenderer* Sym_Renderer = new QgsSingleSymbolRenderer( MarkerSymbol );// 设置当前图层的渲染器CurrentLayer->setRenderer( Sym_Renderer );My_MapCanvas->freeze( false );My_MapCanvas->refresh();

3 线图层渲染代码实现

采用的是QgsSymboLayer的子类QgsSimpleLineSymbolLayer
然后调用该类的方法,设置颜色、样式、宽度等

 //设置线图层的样式,包括color, width (in millimeters) and penStyleQgsSimpleLineSymbolLayer* Line_Renderer_Layer = new QgsSimpleLineSymbolLayer();Line_Renderer_Layer->setColor(Qt::red);Line_Renderer_Layer->setPenStyle(Qt::PenStyle::DotLine);// 创建矢量图层列表,QgsSymbolLayerList就是重新定义了一个特殊的QListQgsSymbolLayerList Sym_Layer_List;Sym_Layer_List.append(Line_Renderer_Layer);// 构建QgsLineSymbolQgsLineSymbol* LineSymbol = new QgsLineSymbol(Sym_Layer_List);// 构建QgsSingleSymbolRenderer, 即最终图层的渲染器QgsSingleSymbolRenderer* Sym_Renderer = new QgsSingleSymbolRenderer( LineSymbol );
//    qDebug() << "Sym_Renderer" << Sym_Renderer;// 设置当前图层的渲染器CurrentLayer->setRenderer( Sym_Renderer );

4 箭头图层渲染代码实现

这段代码的目的:是为了实现在图层上显示可以自定义方向的箭头。
原始的方案是希望通过点图层实现,调整图层中每个点渲染的方式,或者改变每个点的相对角度等,但最后并没有找到相关的设定。只能设定渲染的角度,这将会统一改变这个图层下每一个点的角度。
后来的方案希望通过线图层实现,给出一个点与角度,按照默认的长度算出另一个点的坐标,将其作为一条线,并通过下面的方式进行渲染,形成箭头图标。
存在的问题这样需要自己去自适应箭头的长度,如果给定默认值会导致在不同比例尺下的畸变。然后也依然无法实现一个图层表示多个自定义角度的航标。只能通过多个图层来实现。
潜在的解决方案通过构建分类渲染器categorized renderer实现,或一个图层一个航标,多图层的管理进行实现。

    QgsArrowSymbolLayer* Arrow_Layer = new QgsArrowSymbolLayer();Arrow_Layer->setArrowType(QgsArrowSymbolLayer::ArrowType::ArrowPlain);// 创建矢量图层列表,QgsSymbolLayerList就是重新定义了一个特殊的QListQgsSymbolLayerList Sym_Layer_List;Sym_Layer_List.append(Arrow_Layer);// 构建QgsLineSymbolQgsLineSymbol* LineSymbol = new QgsLineSymbol(Sym_Layer_List);// 构建QgsSingleSymbolRenderer, 即最终图层的渲染器QgsSingleSymbolRenderer* Sym_Renderer = new QgsSingleSymbolRenderer( LineSymbol );// 设置当前图层的渲染器CurrentLayer->setRenderer( Sym_Renderer );

5 实现的效果

线图层



点图层

QT(5.12)+Qgis(3.10) 点图层及线图层渲染相关推荐

  1. ArcGIS线图层转面图层后,使面图层拥有线图层的属性

    使用Spatial Join工具 如下图所示将线图层和面图层加载进去 点击OK,面图层就会拥有线图层中的属性了~

  2. Qt Creator5.12配置OpenCV4.3.0和opencv_contrib扩展包(亲测有效)

    本文结构 第一部分 只安装Qt Creator和配置OpenCV 1.Qt Creator5.12.2下载与安装 2.Cmake下载与安装 3.OpenCV下载 4.编译OpenCV 5.测试Qt程序 ...

  3. Qt 5.12 LTS(长期维护版本)中Qt Quick的性能改进

    我们一直致力于提高Qt的性能和优化其内存消耗.Qt 5.12的一个重点关注是在于减少QML引擎的内存消耗和优化JavaScript性能. 与上一个长期支持版Qt 5.6 LTS相比,Qt 5.9 LT ...

  4. Ubuntu安装qt 5.12

    1.下载qt5.12.10 qt下载网址:https://download.qt.io/archive/qt/ 下载完成后,将下载的文件拷入Ubuntu,去到文件目录添加执行权限 chmod +x 文 ...

  5. Qt 5.12学习笔记--QML性能策略

    Qt 5.12学习笔记--QML性能策略 1 简介 2 时间因素 2 性能分析 3 JavaScript 部分 4 绑定 5 类型转换 6 解析属性 6 属性绑定 7 序列提示(Sequence ti ...

  6. QGIS 3.10 插值与等值线提取

    插值(Interpolation)通过离散的点状数据生成连续的面状数据,是常用的GIS分析技术.现实世界中的很多现象是连续的,比如高程.土壤.温度等,很难通过对整个表面进行测量的方式完成对这些连续现象 ...

  7. 在QGIS 3.10中访问Geoserver中发布的服务

    在QGIS 3.10中访问Geoserver中发布的服务 1 新建 WMS 连接 geoserver的发布教程有很多就不再说,建立在geoserver已经发布的前提. 本次在QGIS中查看的是webg ...

  8. ubuntu 12.04/11.10 PPA 安装 Nvidia 295.59

    2019独角兽企业重金招聘Python工程师标准>>> Nvidia 295.59 增加支持以下GPUs: NVS 5400M NVS 310 GeForce GT 620M GeF ...

  9. 安装教程-VMware 12 安装 Windows 10 企业版

    VMware 12 安装 Windows 10 企业版 1.实验描述 在虚拟机中,手动安装 Windows10 企业版操作系统,为一些实验提供平台,因此,有关系统激活问题不再演示.可自行百度,或者加入 ...

  10. python 计算s= 12+ 22+ 32 +... + (10*n+2)

    计算 s= 12+ 22+ 32 +- + (10*n+2) 参考代码 @author: Catwang """ def main():sum = 0n = int(in ...

最新文章

  1. evaluate函数使用无效_[Python实战]使用栈实现简易计算器
  2. arthas命令使用示例:monitor监视指定方法的执行情况
  3. java mqtt客户端_基于 t-io 实现一个 mqtt5 协议之 mica-mqtt
  4. php7 ast,PHP7新特性之抽象语法树(AST)带来的变化详解
  5. 《三国志》生僻人名读法集(zz)
  6. python对日期型数据排序_如何对日期执行数学运算并用Python对它们进行排序?
  7. Shiro JSP 标签
  8. ubuntu安装libjasper.so.1,libpng12.so.0
  9. access mysql oracle_Oracle访问Access实现数据同步
  10. Photoshop插件-黑白(二)-脚本开发-PS插件
  11. 【cs230】吴恩达Deep Learning-3/3
  12. 提高睡眠质量的东西,这几件东西能让你睡得香又好
  13. sqlserver查看历史死锁信息
  14. 单利模式的优缺点和使用场景
  15. 面试干货!21个必知数据科学面试题和答案part2(12-21)
  16. 在中断函数和MAIN函数中同时调用同一个函数的有趣现象
  17. 【小经验】Windows 11 家庭中文版连接远程桌面,出现身份验证错误。要求的函数不受支持
  18. 【前缀和】蓝桥杯试题 k倍区间
  19. html语言div图片垂直居中,图文详解图片水平垂直居中的五种方法
  20. 计算机任务管理器无法响应,简单几步解win10任务管理器打不开提示无响应的方法...

热门文章

  1. 判断入射满射c语言编码,例4,判断下列函数是否是满射、单射、双射。.PDF
  2. vscode中用emmet语法a{}*3无法自动换行
  3. 国内邮箱有哪些?vip163微信邮箱登录简单吗?
  4. [维修笔记]关于红米2A手机无限重启的维修
  5. html table中td内容超出显示.怎么实现
  6. Vmware_jjbLite_jb51不是有效的短文件名
  7. 计算机系统——处理器体系结构
  8. redis 附近的人_Redis怎么实现查找附近的人,请看特殊数据类型Geospatial
  9. New File(.)
  10. SGE上的qsub以及作业的状态查看