QGis 的 Label 配置面板实现功能

QGis 的 Label 配置面板实现功能


发布日期: 2016-10-24 更新日期: 2016-10-24 编辑:xuzhiping 浏览次数: 6118

标签:

摘要: 实现思路 首先我们注意到,QgsVectorLayer 这个类当中,有一个 enableLabels() 方法。先好奇的将它设置 QgsVectorLayer* layer = (QgsVectorlayer*)this->activeLayer(); //...

实现思路

首先我们注意到,QgsVectorLayer 这个类当中,有一个 enableLabels() 方法。先好奇的将它设置

QgsVectorLayer* layer = (QgsVectorlayer*)this->activeLayer(); // 
layer->enableLabels(true);
m_mapCanvas->refresh();

发现有如下的效果:

03

Qgs Pal Layer Settings

如果某个对象有一大堆属性需要设置,最好的方式就是新建另一个对象,来负责设置这些属性。Qgs Pal Layer Settings 这个类正是这样的存在,它负责矢量图层的相关设置。看一看 API 文档,不难发现,这里面定义的几乎全都是属性。

我相信配置属性对于大家来说都不会是一个难点,无非就是给不同的属性赋上不同的值而已。下面我会通过代码注释,来直接给出使用方法。


QgsPalLayerSettings layerSettings;
layerSettings.enabled = true;


layerSettings.fieldName = layer->pendingFields()[3].name();
layerSettings.centroidWhole = true; 


layerSettings.textColor = QColor( 0, 0, 0 ); 
layerSettings.textFont = QFont( "Times", 12 ); 


layerSettings.bufferDraw = true;
layerSettings.bufferColor = QColor( 255, 0, 0 ); 
layerSettings.bufferSize = 1; 
layerSettings.bufferTransp = 0.5; 


layerSettings.shadowDraw = true;
layerSettings.shadowOffsetAngle = 135; 
layerSettings.shadowOffsetDist = 1;

QgsVectorLayer* layer = (QgsVectorlayer*)this->activeLayer(); 

layerSettings.writeToLayer( layer ); 
m_mapCanvas->refresh();

注意,最后一定要用 writeToLayer() 方法把设置写到相应的图层中。上面的代码效果如下图

04

至于想要更特别的显示效果,就自己去找相应的属性进行设置就可以了。

数据定义的标注样式

这里再多说一点,QgsPalLayerSettings 的定义中,第一个变量就是叫DataDefinedProperties 的枚举类型,这个枚举类型里面定义的属性,其实在 QgsPalLayerSettings 的公共属性中是对应的,那么它的作用是什么呢?其实,正如它的名字那样,DataDefinedProperties 是由数据定义的属性,也就说,同一个图层的属性可以是动态变化的。比如说同一个图层中,有两个 Feature,想要将这两个 Feature 的 Label 显示为不同大小,甚至不同的颜色、字体等。就可以定义一个 size 的字段来存储大小,color 的字段存储颜色, font 字段存储字体。这样,这两个 Feature 显示出来的 Label 样式就会不一样,并且是跟随数据的改变而改变的。

还是通过实际操作来解释会更直观一点。

现在我们新增加3个字段到测试图层中。注意我们新增的 color 表示为十六进制的颜色字符串,并且为了显示方便,在这个测试图层中,我们仅保留了3个要素。

5

我们在 QGis 的 Label 属性面板中,做如下的设置

6

7 8

点击确定,就可以得到如下图所示的效果,即这 3 个要素显示的 Label 样式各不相同。

9

那么,怎么通过代码来实现这个功能呢?我们注意到,QgsPalLayerSettings 类中,包含了一个 setDataDefinedProperty 方法,定义如下:

10

使用这个方法,我们就可以达到以上 QGis 中实现的 Label 不同样式的功能了。测试代码如下:


QgsPalLayerSettings layerSettings;
layerSettings.enabled = true;


layerSettings.fieldName = layer->pendingFields()[3].name(); 

layerSettings.setDataDefinedProperty( layerSettings.Size, true, false, NULL, "size" ); 
layerSettings.setDataDefinedProperty( layerSettings.Color, true, false, NULL, "color" ); 
layerSettings.setDataDefinedProperty( layerSettings.Family, true, false, NULL, "font" ); 

QgsVectorLayer* layer = (QgsVectorlayer*)this->activeLayer(); 

layerSettings.writeToLayer( layer ); 
m_mapCanvas->refresh();

运行这段代码会得到与上面 QGis 中显示相同的效果。

关注公众号
获取免费资源

随机推荐


Copyright © Since 2014. 开源地理空间基金会中文分会 吉ICP备05002032号

Powered by TorCMS

OSGeo 中国中心 邮件列表

问题讨论 : 要订阅或者退订列表,请点击 订阅

发言 : 请写信给: osgeo-china@lists.osgeo.org