文章目录
- 前言
- 点聚合(Point cluster)
- QGis
- 代码实现
- 总结
前言
- 本章介绍如何使用点聚合(Point cluster)
- 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps
点聚合(Point cluster)
点要素过于密集时,将距离近的符号聚合,提高地图的可读性。
- 以下以myplaces.shp为例,分别介绍QGis和二次开发中如何使用点分布
QGis
- 以myplaces.shp为例,图层包含的点在缩放情况下会聚集在一起,如下图
- 设置符号渲染方式为点聚合(Point cluster),如下图
- 将符号标记图层的字符通过表达式设置为“@cluster_size”,即可显示聚合点中的点数量。
- 设置之后可见聚集在一起的点聚合在了一起,如下图
代码实现
- 类
QgsPointClusterRenderer
是点聚合(Point cluster)渲染器,详情见文档,类图如下
- 以下是实现点聚合渲染的步骤
- 从图层获取渲染器
QgsFeatureRenderer * layerRenderer= layer->renderer();
QgsPointClusterRenderer *pointClusterRenderer = QgsPointClusterRenderer::convertFromRenderer(layerRenderer);
- 设置点符号
//设置clusterSymbol,其实以下代码都不用写,默认就是这个效果。
//这里写出来只是演示
#if 0
auto markerSymbol = new QgsMarkerSymbol();
markerSymbol->setSize( 4 );
markerSymbol->setColor( QColor( 245, 75, 80 ) );
QgsFontMarkerSymbolLayer *fm = new QgsFontMarkerSymbolLayer();
fm->setFontFamily( QFont().defaultFamily() );
fm->setColor( QColor( 255, 255, 255 ) );
fm->setSize( 3.2 );
fm->setOffset( QPointF( 0, -0.4 ) );
fm->setDataDefinedProperty( QgsSymbolLayer::PropertyCharacter, QgsProperty::fromExpression( QStringLiteral( "@cluster_size" ) ) );
markerSymbol->insertSymbolLayer( 1, fm );
pointClusterRenderer->setClusterSymbol(markerSymbol);
#else
//设置渲染器
QVariantMap mp;
mp[QString("name")] = QStringLiteral("circle");
mp[QString("color")] = QStringLiteral("red");
mp[QString("size")] = QStringLiteral("6.0");
auto simpleSymbolLayer = QgsSimpleMarkerSymbolLayer::create(mp);
QVariantMap mp1;
mp1[QString("font")] = QStringLiteral("Mukti");
mp1[QString("color")] = QStringLiteral("white");
mp1[QString("offset")] = QStringLiteral("0, -0.8");
auto fontSymbolLayer = QgsFontMarkerSymbolLayer::create(mp1);
fontSymbolLayer->setDataDefinedProperty( QgsSymbolLayer::PropertyCharacter, QgsProperty::fromExpression( QStringLiteral( "@cluster_size" ) ) );
QgsSymbolLayerList layerList;
layerList << simpleSymbolLayer << fontSymbolLayer;
auto markerSymbol = new QgsMarkerSymbol(layerList);
pointClusterRenderer->setClusterSymbol(markerSymbol);
#endif
- 设置点图层渲染器
layer->setRenderer(pointClusterRenderer);
总结
- 分别使用QGis软件和C++ Api二次开发演示了点聚合的使用