已知shp图层所有字段的名称及值,根据指定的字段名和颜色、类别来对图层进行分级渲染显示。设置界面:
可能要用到的头文件:
#include
#include
#include
#include
#include
#include
#include
(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 generateColorRamp( QColor startcolor, QColor endcolor, int steps )
{
QList 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 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);