QGis C++ 开发之图层分类显示
开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4
简单介绍下如何用C++方式实现QGis中图层分类显示的方法。
要实现图层的分类显示主要会用到QgsCategorizedSymbolRendererV2类,这个类是一个简单的符号分类渲染器,该类是从QgsFeatureRendererV2继承而来,大家可以看下帮助文档中的截图:
QgsCategorizedSymbolRendererV2是其中一个子类,其他还有几个类似的子类,而这些子类的渲染方式就是对应的QGis中的几种不同的分类方式:
所以如果掌握了其中一种分类方式的用法,其他几种都是大同小异。下面要介绍的就是上图中的第3种方式,用法简单,但是也是平时用得最多的一种方式。
1、先说下如何简单的根据指定图层字段创建分类。先上一小段代码,再来慢慢说:
QgsCategoryList cats;
QgsFeature f;
QgsFeatureIterator it = mLayer->getFeatures();
while (it.nextFeature(f)) cats << QgsRendererCategoryV2(f.attribute("编号"),
unlinkedSymbolV2(), f.attribute("编号").toString());
} mLayer->setRendererV2( new QgsCategorizedSymbolRendererV2("编号", cats) );
说明下mLyaer是准备处理的一个有效的QgsVectorLayer对象。
先看最后一句,通过图层的setRendererV2(QgsFeatureRendererV2*)便可以修改该图层的渲染方式,我们的目的就达到了,不过要详细说下传递的参数,要传递的参数就是上面提到的从QgsFeatureRendererV2继承而来的渲染器子类,我是直接通过两个参数来new了一个QgsCategorizedSymbolRendererV2对象:
第一个参数是图层中已有的字段名称,这里我使用矢量图层中叫”编号”的字段来进行分类;
第二个参数是一个QgsCategoryList对象,它其实是一个别名,本质上是QList<QgsRendererCategoryV2>,这个列表里保存的是与字段内容相对应的对象。QgsRendererCategoryV2是用于管理每个分类对象符号的类,通过一个图来看比较好理解,下图中显示了3种分类,每个分类就是一个单独的QgsRendererCategoryV2,它所显示的名称、颜色、符号等等都是通过QgsRendererCategoryV2来管理的。
接着看上面在while循环中我通过遍历图层中的要素,创建QgsRendererCategoryV2对象,并保存到List中,第一个参数是设置对象的值,直接返回图层中“编号”字段的值来填充;第三个参数是设置一个显示的标签,我直接就使用与第一个参数相同的值来设置;第二个参数是一个指向QgsSymbolV2的对象,该类主要用于管理符号,显示的颜色、符号、透明度这些就是通过这个参数来设置,这里我是同过一个单独的函数来返回这个对象,这个unlinkedSymbolV2()函数内容如下:
QgsSymbolV2* unlinkedSymbolV2()
{
QgsSymbolV2* mUnlinkedSymbolV2; // 获得缺省的符号
mUnlinkedSymbolV2 = QgsSymbolV2::defaultSymbol(mLayer->geometryType()); // 设置透明度与颜色
mUnlinkedSymbolV2->setAlpha(0.5);
mUnlinkedSymbolV2->setColor(cUnlinked); return mLinkedSymbolV2->clone();
}
这个符号类提供一个静态defaultSymbol函数可返回一个默认的符号对象,传入一个几何类型以返回对应的几何类型符号,然后通过setAlpha及setColor修改下符号的透明度及颜色,最后返回一个符号类指针的副本。
这是处理前的截图:
这是处理后的截图:
2、最后再说下已经像上面分类好了,怎么进行更新。
// 获得目前图层的分类样式符号渲染器
QgsCategorizedSymbolRendererV2* cRenderer;
cRenderer = dynamic_cast< QgsCategorizedSymbolRendererV2* >
( mLayer->rendererV2() );
if (!cRenderer)
{
return;
}
// 在渲染器中查找是否有对应的编号
int index = cRenderer->categoryIndexForValue(QVariant("")); // 更新
if (-1 != index)
{
cRenderer->deleteCategory(index);
cRenderer->addCategory(QgsRendererCategoryV2
(QVariant(""), linkedSymbolV2(), ""));
}
首先获得图层的渲染器类,如果之前图层没有进行过分类,将会得到一个空指针。
之前我们在构造QgsRendererCategoryV2对象时不是用“编号”字段的内容设置了它的值吗,现在就可以通过categoryIndexForValue函数来返回索引,找到正确的索引后先删除原来记录,再通过addCategory添加一个新的对象进去,这里我同样通过调用一个linkedSymbolV2()返回符号,和unlinkedSymbolV2()不同的地方就是颜色改变了,所以就不贴代码了。
更新完后还会有个小问题,会发现新添加的分类符号都显示在最后,显示顺序和之前不一样了,可以用下面这个方法按值重新排序。
cRenderer->sortByValue();
关于图层分类显示基本上就这样了,其实涉及代码不多,应该还是好理解,其他几种分类渲染方式都大同小异。
QGis C++ 开发之图层分类显示的更多相关文章
- Qt+QGis二次开发:矢量图层的显示样式
原文链接:QGis二次开发基础 -- 矢量图层的显示样式
- CSS3实战开发: 纯CSS实现图片过滤分类显示特效
原文:CSS3实战开发: 纯CSS实现图片过滤分类显示特效 各位网友大家好,今天我要带领大家开发一个纯CSS的图片分类显示的网址导航,单纯看标题大家可能有些困惑,依照以往惯例,我先给大家演示一下实际运 ...
- day81:luffy:课程分类页面&课程信息页面&指定分类显示课程信息&分页显示课程信息
目录 1.构建课程前端初始页面 2.course后端的准备工作 3.后端实现课程分类列表接口 4.前端发送请求-获取课程分类信息 5.后端实现课程列表信息的接口 6.前端显示列表课程信息 7.按照指定 ...
- IE的F12开发人员工具不显示
IE的F12开发人员工具不显示问题: 按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的 ...
- Hexo主题实现多级分类显示
前言 最近在搞一个博客,是托管在github和gitcafe上的,利用Hexo生成的.之后,发现一个问题,显示的分类都是一级的.而我想要的是:能显示多级分类,层次分明`的那样. 问题 基本主题自带的分 ...
- 解决微信小程序使用wxcharts在屏幕不固定问题-开发工具里也显示好了布局,为啥到真机就是乱的
解决微信小程序使用wxcharts在屏幕不固定问题-开发工具里也显示好了布局,为啥到真机就是乱的 .chart{ width: 100%; text-align: center; } .canvas{ ...
- 图解android开发在界面上显示图片
图解android开发在界面上显示图片<申明:转自百度> <原文章地址:http://jingyan.baidu.com/article/49711c6153a277fa441b7c ...
- php 从2维数组组合为四维数组分析(项目中前台侧边栏导航三级分类显示)
foreach函数(循环函数)内嵌套循环函数时,当内层完全循环完后,才会向上一级循环 数组要注意问题 array_merge----合并一个或多个数组 将一个或多个数组的单元合并起来,一个数组中的值附 ...
- TocControl控件图层无法显示问题
在窗口里的层层嵌套SplitContainer后,出现最内层SplitContainer内部TocControl控件图层无法显示问题:加载完mxd后代后加上axTOCControl1.SetBuddy ...
随机推荐
- 修改VS类模板自动添加public修饰符和版权注释信息
在开发过程中,我们经常需要给类或接口添加public修饰符(默认没有)和一些相关的注释信息,这个工作是机械而枯燥的,而这个简单的需求其实是可以通过修改VS自带的类模板来实现的,下面是详细的修改步骤. ...
- RocketMQ NameServer
NameServer 路由管理,服务注册,服务发现.(类比为soa框架中的zookeeper) 一.路由管理 1.路由注册,由 Broker 向 NameServer 发送心跳,NameServer ...
- linux系统编程:自己动手写一个cp命令
cp命令的基本用法: cp 源文件 目标文件 如果目标文件不存在 就创建, 如果存在就覆盖 实现一个cp命令其实就是读写文件的操作: 对于源文件: 把内容全部读取到缓存中,用到的函数read 对于目标 ...
- HDU1281(KB10-D 二分图最大匹配)
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Linux 多个vi、vim进程编辑同一文件时的临时文件问题
多个vi.vim进程编辑同一文件时的临时文件问题 by:授客 QQ:1033553122 使用vi.vim编辑文件,实际是先copy一份临时文件并映射到内存里进行编辑,所以你编辑的是临时文件,不是 ...
- React Native 如何做轮播图 react-native-swiper
//:仿饿了么github:https://github.com/stoneWeb/elm-react-native 欢迎各位同学加入: React-Native群:397885169 大前端群:54 ...
- LeetCode题解之Largest Number
1.题目描述 2. 将整数值转换为string ,然后排序. 3.代码 string largestNumber(vector<int>& nums) { vector<s ...
- Ubuntu安装ffmpeg
二.linux源码安装: 如下: 下载 源码包:http://ffmpeg.org/releases/ffmpeg-3.3.tar.bz2 1.从网络上下载到的源码包,然后解压到指目录 假设下载目录 ...
- CSS| position定位和float浮动
对基础知识再度做个巩固和梳理. 一.position定位 (一):position的属性 1.absolute:生成绝对定位的元素,相对于最近一级定位不是static的父元素来进行定位: 2.rela ...
- od 转储 二进制文件常用命令
od : NAME od - dump files in octal and other formats 常用命令: ➜ Downloads od -t x1 -Ax /etc/ld.so.cach ...