QGis(五)矢量图层根据指定字段分级渲染显示

已知shp图层所有字段的名称及值,根据指定的字段名和颜色、类别来对图层进行分级渲染显示。设置界面:


可能要用到的头文件:

#include <qgsgraduatedsymbolrendererv2.h>
#include <qgsgraduatedsymbolrenderer.h>
#include <QgsVectorLayer.h>
#include <qgssymbol.h>
#include <qgsfield.h>
#include <qgsvectordataprovider.h>
#include <QgsSymbolLayerV2Utils.h>

(1)获取shp图层所有的字段名。将字段名插入下拉列表

先定义几个变量:

QgsVectorLayer *mLayer = new QgsVectorLayer(myLayerPath, myLayerBasename,"ogr");
QgsGraduatedSymbolRenderer *mRenderer = new QgsGraduatedSymbolRenderer(mLayer->geometryType(),QgsGraduatedSymbolRenderer::EqualInterval);
QString mFieldName = "Id"; 
int mClasses = 5;

void InitField()
{
	//设置字段名下拉列表
	ui.cboGraduatedColumn->clear();
	const QgsFieldMap &fields = mLayer->pendingFields();//从图层得到字段信息
	QgsField field;
	for(int i = 0; i < fields.count(); ++i)
	{
		field = fields[i];
		//只添加数值型字段
		if (field.type() == QVariant::Double || field.type() == QVariant::Int || field.type() == QVariant::LongLong &&
			(field.name() != "Id"))
		{
			ui.cboGraduatedColumn->addItem( field.name() );
		}

	}
	mFieldName = ui.cboGraduatedColumn->currentText();
	mRenderer->setClassificationField(mLayer->fieldNameIndex(mFieldName));
	
}
(2)按照分类的类别数和指定的颜色来生成渐变的颜色

//从 startcolor到endcolor的渐变,分成steps种颜色
QList<QColor> generateColorRamp( QColor startcolor, QColor endcolor, int steps )
{
	QList<QColor> colors;
	int r = endcolor.red() - startcolor.red();
	int g= endcolor.green() - startcolor.green();
	int b = endcolor.blue() - startcolor.blue();

	float rStep = r / (float)steps ;
	float gStep = g / (float)steps;
	float bStep = b / (float)steps;

	float fr = startcolor.red();
	float fg = startcolor.green();
	float fb = startcolor.blue();
	colors.push_back(startcolor);

	for ( int i = 0; i < steps - 2; ++i)
	{
		fr += rStep;
		fg += gStep;
		fb += bStep;
		QColor color((int)fr + 0.5, (int)(fg + 0.5), (int)(fb + 0.5));
		colors.push_back(color);
	}
	colors.push_back(endcolor);
	return colors;
}
(3)将指定字段的值按等间隔分成mClasses份,并赋予对应的颜色。mClasses等于上面颜色的steps
void ClassifyGraduated()
{
	...
	//计算要分类的字段的等间距值
	double min = 0, max = 0;
	double offset = 0;
	findMinMax(mFieldName, min, max);
	if (mClasses != 0)
	{
		offset = ( max - min  ) / mClasses;
	}
	QColor startColor, endColor;
	startColor.setRgb(255,255,255);
	endColor.setRgb(0, 255, 0);
	QList<QColor> mColors = generateColorRamp( startColor, endColor, mClasses );
	for (int i = 0; i < mClasses; ++i)
	{
		QgsSymbol* pSym = new QgsSymbol( QGis::Polygon );
		pSym->setFillColor( mColors.at(i) ); //颜色的控制
		pSym->setFillStyle( Qt::SolidPattern );
		pSym->setLowerValue( QString::number( min + i * offset, 'f', 5) );
		pSym->setUpperValue( QString::number( min + ( i + 1 ) * offset , 'f', 5) );
		mRenderer->addSymbol(pSym);//将symbol添加到渲染器中
		QString list = QString::number( min + i * offset, 'f', 5) + " - " + QString::number( min + ( i + 1 ) * offset , 'f', 5);
		
		QIcon icon =  QIcon( QPixmap::fromImage( pSym->getPolygonSymbolAsImage() ) ) ;
		QStandardItem* item = new QStandardItem( icon, "" );
		item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
		
		mShowModel->setItem(i, 0, item);
		mShowModel->setItem(i, 1, new QStandardItem( list));	
	}

}
(4)最后还要将渲染器设置给图层

mLayer->setRenderer(mRenderer);

当然这里的颜色和类别数可以通过界面来改变,而且可以实现自己双击上图中列表里的每一行来自定义颜色。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值