文档章节

QGis C++ 开发之图层分类显示

袁_龙
 袁_龙
发布于 2016/11/07 13:47
字数 1230
阅读 226
收藏 0

开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4

 

        简单介绍下如何用C++方式实现QGis中图层分类显示的方法。

        要实现图层的分类显示主要会用到QgsCategorizedSymbolRendererV2类,这个类是一个简单的符号分类渲染器,该类是从QgsFeatureRendererV2继承而来,大家可以看下帮助文档中的截图:

        QgsCategorizedSymbolRendererV2是其中一个子类,其他还有几个类似的子类,而这些子类的渲染方式就是对应的QGis中的几种不同的分类方式:

        所以如果掌握了其中一种分类方式的用法,其他几种都是大同小异。下面要介绍的就是上图中的第3种方式,用法简单,但是也是平时用得最多的一种方式。

        (一)先说下如何简单的根据指定图层字段创建分类。先上一小段代码,再来慢慢说:

1 	QgsCategoryList cats;
  2 	QgsFeature f;
  3 	QgsFeatureIterator it = mLayer->getFeatures();
  4 	while (it.nextFeature(f))
  5 
  6 		cats << QgsRendererCategoryV2(f.attribute("编号"),
  7 		unlinkedSymbolV2(), f.attribute("编号").toString());
  8 	}
  9 
 10 	mLayer->setRendererV2( new QgsCategorizedSymbolRendererV2("编号", cats) );

        说明下mLyaer是准备处理的一个有效的QgsVectorLayer对象。

        先看最后一句,通过图层的setRendererV2(QgsFeatureRendererV2*)便可以修改该图层的渲染方式,我们的目的就达到了,不过要详细说下传递的参数,要传递的参数就是上面提到的从QgsFeatureRendererV2继承而来的渲染器子类,我是直接通过两个参数来new了一个QgsCategorizedSymbolRendererV2对象:

        1、第一个参数是图层中已有的字段名称,这里我使用矢量图层中叫”编号”的字段来进行分类;

        2、第二个参数是一个QgsCategoryList对象,它其实是一个别名,本质上是QList<QgsRendererCategoryV2>,这个列表里保存的是与字段内容相对应的对象。QgsRendererCategoryV2是用于管理每个分类对象符号的类,通过一个图来看比较好理解,下图中显示了3种分类,每个分类就是一个单独的QgsRendererCategoryV2,它所显示的名称、颜色、符号等等都是通过QgsRendererCategoryV2来管理的。

        接着看上面在while循环中我通过遍历图层中的要素,创建QgsRendererCategoryV2对象,并保存到List中,第一个参数是设置对象的值,直接返回图层中“编号”字段的值来填充;第三个参数是设置一个显示的标签,我直接就使用与第一个参数相同的值来设置;第二个参数是一个指向QgsSymbolV2的对象,该类主要用于管理符号,显示的颜色、符号、透明度这些就是通过这个参数来设置,这里我是同过一个单独的函数来返回这个对象,这个unlinkedSymbolV2()函数内容如下:

1 QgsSymbolV2* unlinkedSymbolV2()
  2 {
  3 	QgsSymbolV2* mUnlinkedSymbolV2;
  4 
  5 	// 获得缺省的符号
  6 	mUnlinkedSymbolV2 = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
  7 
  8 	// 设置透明度与颜色
  9 	mUnlinkedSymbolV2->setAlpha(0.5);
 10 	mUnlinkedSymbolV2->setColor(cUnlinked);
 11 
 12 	return mLinkedSymbolV2->clone();
 13 }
 14

        这个符号类提供一个静态defaultSymbol函数可返回一个默认的符号对象,传入一个几何类型以返回对应的几何类型符号,然后通过setAlpha及setColor修改下符号的透明度及颜色,最后返回一个符号类指针的副本。

 

这是处理前的截图:

 

这是处理后的截图:

 

 

        (二)最后再说下已经像上面分类好了,怎么进行更新。

1  // 获得目前图层的分类样式符号渲染器
  2  QgsCategorizedSymbolRendererV2* cRenderer;
  3  cRenderer = dynamic_cast< QgsCategorizedSymbolRendererV2* >
  4  					( mLayer->rendererV2() );
  5  if (!cRenderer)
  6  {
  7  	return;
  8  }
  9  // 在渲染器中查找是否有对应的编号
 10  int index = cRenderer->categoryIndexForValue(QVariant("1"));
 11 
 12  // 更新
 13   if (-1 != index)
 14  {
 15  	cRenderer->deleteCategory(index);
 16  	cRenderer->addCategory(QgsRendererCategoryV2
 17  		(QVariant("1"), linkedSymbolV2(), "1"));
 18  }

        首先获得图层的渲染器类,如果之前图层没有进行过分类,将会得到一个空指针。

        之前我们在构造QgsRendererCategoryV2对象时不是用“编号”字段的内容设置了它的值吗,现在就可以通过categoryIndexForValue函数来返回索引,找到正确的索引后先删除原来记录,再通过addCategory添加一个新的对象进去,这里我同样通过调用一个linkedSymbolV2()返回符号,和unlinkedSymbolV2()不同的地方就是颜色改变了,所以就不贴代码了。

        更新完后还会有个小问题,会发现新添加的分类符号都显示在最后,显示顺序和之前不一样了,可以用下面这个方法按值重新排序。

1 cRenderer->sortByValue();

 

        关于图层分类显示基本上就这样了,其实涉及代码不多,应该还是好理解,其他几种分类渲染方式都大同小异。

© 著作权归作者所有

袁_龙
粉丝 5
博文 8
码字总数 8652
作品 0
成都
其他
私信 提问
QGIS PYTHON 开发环境

QGIS一般可以使用C++和PYTHON两种语言进行扩展开发,而PYTHON相对C++开发具有可移植性、易于学习、应用广泛、开发效率高等优势。利用PYTHON开发会大大提高开发效率降低开发成本,降低开发难度...

GIS开源
2018/04/26
0
0
C++ Web应用服务器中间件 MYCP 全面介绍

1、MYCP 的概念 MYCP是一种利用C++编写,来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。MYCP技术的基础就是核心C++语言平台,所以MYCP不仅拥有,例如“编写一次、随处运行...

红薯
2011/01/05
1K
0
开源图形库 c语言-开源C++库

开源C++库必须具有以下特点:必须是成熟的产品、跨平台的产品、相对通用的库。   一、通用标准类   STL:C++标准模板库,呵呵,它也是开源的嘛。   boost:C++准标准库,它是强大地,江...

mickelfeng
2013/01/03
1K
0
Native code support (Native Code(C和C++)支持)

1. WP 8和Win 8之间共享native代码 通过 Windows 运行时组件,可以在 Windows 应用商店和 Windows Phone 应用程序之间共享Native coad。由于windows phone 8和Windows 8没有共享所有的Windo...

失足处男的倒霉孩子
2013/12/26
1K
0
MFC界面套包BCG Pro Edition for MFC正式发布v27.3|附下载

BCGControlBar Professional Edition for MFC是MFC的一个扩展库,您可以用来构建类似于Microsoft Office 2000/XP/2003/2007/2010/2013 和 Microsoft Visual Studio-like(打印、用户定制工具......

Miss_Hello_World
2018/07/20
19
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
12
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部