您的位置:首页 > 其它

QGIS二次开发第三讲

2012-07-09 20:38 471 查看

第三讲主要实现了矢量要素的标注(Label)功能,代码是在第二节的基础上进行修改

第一步:在qgis2.h文件中,增加相关头文件,主要三个头文件如下:qgslabel.h,qgslabelattribute.h qgsfield.h文件

具体代码如下所示:

#include <QtGui/QMainWindow>
#include "ui_qgis2.h"
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgssinglesymbolrenderer.h>
#include <qgsmapcanvas.h>
#include <qgsvectorlayer.h>
#include <qgsmaptool.h>
#include <QtGui/QVBoxLayout>
#include <qgsmaplayerregistry.h>
#include <QtGui/QToolBar>
#include<qgsmaptoolpan.h>
#include <qgsmaptoolzoom.h>

#include <qgsvectordataprovider.h>

//标注添加的头文件
#include <qgslabel.h>//一个用来渲染label的类,label渲染属性可以直接指定或者根据属性值动态指定
#include <qgslabelattributes.h>//此类保存了label渲染所需要的属性值,比如字大小,位置等属性
#include <qgsfield.h>//此类用于将字段包装成属性表或者是数据源的形式

//添加QT 对话框的头文件
#include <qmessagebox.h>
#include <qstring.h>


第二步:在qgis2.cpp文件,addlayer()函数增加代码,主要代码如下:

void qgis2::addLayer()
{
//读取矢量数据
QString myLayerPath ="../data";
QString myLayerBaseName = "test";
QString myPoviderName="ogr";
QList<QgsMapCanvasLayer> myLayerSet;
QgsVectorLayer* myLayer = new QgsVectorLayer(myLayerPath,myLayerBaseName,myPoviderName);
if (myLayer->isValid())
{

QgsSingleSymbolRenderer *myRenderer = new QgsSingleSymbolRenderer(myLayer->geometryType());
myLayer->setRenderer(myRenderer);
QgsLabel * mypLabel;
//得到关联mylayer的label指针
mypLabel=myLayer->label();
QgsLabelAttributes * mypLabelAttributes;
mypLabelAttributes = mypLabel->layerAttributes();
//得到矢量图层的字段列表
//typedef QMap<int,QgsField> QgsFieldMap
QgsFieldMap myFields = myLayer->dataProvider()->fields();
for (unsigned int i=0;i<myFields.size();i++)
{
QMessageBox::information(NULL,QString(tr("字段信息")),QString(myFields[i].name()).toLocal8Bit(),QMessageBox::Yes);
}
//在这里用最后一个字段作为标注的字段
mypLabel->setLabelField(QgsLabel::Text,myFields.size()-1);
//设置label的颜色,需要用到labelAttribute对象
mypLabelAttributes->setColor(Qt::black);
mypLabelAttributes->setBufferEnabled(true);
mypLabelAttributes->setBufferColor(Qt::yellow);
int myType = QgsLabelAttributes::PointUnits;
mypLabelAttributes->setBufferSize(1,myType);

//启用标注
myLayer->enableLabels(true);
//增加矢量数据到图层注册
QgsMapLayerRegistry::instance()->addMapLayer(myLayer,true);
//设置画布的extent
mpMapCanvas->setExtent(myLayer->extent());
//设置画布的图层数据集
myLayerSet.append(QgsMapCanvasLayer(myLayer));
mpMapCanvas->setLayerSet(myLayerSet);
}
else
{
return;
}
}
第三步:修改main.cpp文件,使其支持中文显示,具体代码如下:

int main(int argc, char *argv[])
{
QgsApplication a(argc, argv,TRUE);
//设置支持中文显示
QTextCodec *codec=QTextCodec::codecForName("System");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
qgis2 w;
w.show();
return a.exec();
}
最后程序执行效果如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: