摘要: 实现思路 首先我们注意到,QgsVectorLayer 这个类当中,有一个 enableLabels() 方法。先好奇的将它设置 QgsVectorLayer* layer = (QgsVectorlayer*)this->activeLayer(); //...
实现思路
首先我们注意到,QgsVectorLayer 这个类当中,有一个 enableLabels() 方法。先好奇的将它设置
QgsVectorLayer* layer = (QgsVectorlayer*)this->activeLayer(); // layer->enableLabels(true); m_mapCanvas->refresh();
发现有如下的效果:
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() 方法把设置写到相应的图层中。上面的代码效果如下图
至于想要更特别的显示效果,就自己去找相应的属性进行设置就可以了。
数据定义的标注样式
这里再多说一点,QgsPalLayerSettings 的定义中,第一个变量就是叫DataDefinedProperties 的枚举类型,这个枚举类型里面定义的属性,其实在 QgsPalLayerSettings 的公共属性中是对应的,那么它的作用是什么呢?其实,正如它的名字那样,DataDefinedProperties 是由数据定义的属性,也就说,同一个图层的属性可以是动态变化的。比如说同一个图层中,有两个 Feature,想要将这两个 Feature 的 Label 显示为不同大小,甚至不同的颜色、字体等。就可以定义一个 size 的字段来存储大小,color 的字段存储颜色, font 字段存储字体。这样,这两个 Feature 显示出来的 Label 样式就会不一样,并且是跟随数据的改变而改变的。
还是通过实际操作来解释会更直观一点。
现在我们新增加3个字段到测试图层中。注意我们新增的 color 表示为十六进制的颜色字符串,并且为了显示方便,在这个测试图层中,我们仅保留了3个要素。
我们在 QGis 的 Label 属性面板中,做如下的设置
点击确定,就可以得到如下图所示的效果,即这 3 个要素显示的 Label 样式各不相同。
那么,怎么通过代码来实现这个功能呢?我们注意到,QgsPalLayerSettings 类中,包含了一个 setDataDefinedProperty 方法,定义如下:
使用这个方法,我们就可以达到以上 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 中显示相同的效果。