• 8.12 矢量图层面要素单一符号使用二(仅渲染中心点)


    前言

    • 本章介绍矢量图层线要素单一符号中仅渲染中心点(Centroid fill)的使用
    • 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps

    仅渲染中心点(Centroid fill

    Centroid fill 是一种用于地理信息系统 (GIS) 中填充面状地物的方法。在计算每个多边形的质心后,将该点与邻近的多边形连接,然后填充整个区域。该方法通常用于将遥感图像转换为矢量格式,或者在地图制作中创建特定类型的地图,例如土壤类型地图或植被覆盖地图。

    • 以water.shp为例,在QGis中添加water图层,QGis中默认使用的符号是简单填充(Simple fill),如下图
      在这里插入图片描述

    QGis设置面符号为仅渲染中心点(Centroid fill)

    • Symbol layer type设置为Centroid fill
    • 其子符号为Marker符号,如下图
      在这里插入图片描述
    • 属性设置完成后图层显示效果如下图
      在这里插入图片描述

    二次开发代码实现仅渲染中心点(Centroid fill)

    • QgsCentroidFillSymbolLayer是仅渲染中心点(Centroid fill),详情见文档,类图如下
      在这里插入图片描述
    • QgsCentroidFillSymbolLayer需要设置子符号为Marker符号
    • QgsCentroidFillSymbolLayer构造函数中默认创建了一个Simple Marker的符号,代码如下
    QgsCentroidFillSymbolLayer::QgsCentroidFillSymbolLayer()
    {
      setSubSymbol( new QgsMarkerSymbol() );
    }
    
    • 创建符号层有两种方法:构造函数和create
    • 方法一
    1. 从图层获取渲染器
        //从图层获取渲染器
        QgsFeatureRenderer * layerRenderer= layer->renderer();
        QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
    
    1. 构造函数:修改属性可以调用setxxx函数,如下代码
        auto centroidFillSymbolLayer = new QgsCentroidFillSymbolLayer();
        centroidFillSymbolLayer->setPointOnSurface(false);
        centroidFillSymbolLayer->setPointOnAllParts(true);
        centroidFillSymbolLayer->setClipPoints(false);
        centroidFillSymbolLayer->setClipOnCurrentPartOnly(false);
    
    1. 创建符号并设置到渲染器
        //多个Symbol Layer构成一个Symbol
        QgsSymbolLayerList layerList;
        layerList << centroidFillSymbolLayer;
        //构造QgsFillSymbol并设置renderer
        auto fillSymbol = new QgsFillSymbol(layerList);
        singleSymbolRenderer->setSymbol(fillSymbol);
        layer->setRenderer(singleSymbolRenderer);
    
    • 方法二
      方法一中步骤1,3不变,步骤2中使用create()成员函数,颜色方案同样有两种选择
        QVariantMap mp;
        mp["point_on_surface"] = QStringLiteral("0");
        mp["point_on_all_parts"] = QStringLiteral("1");
        mp["clip_points"] = QStringLiteral("0");
        mp["clip_on_current_part_only"] = QStringLiteral("0");
        auto centroidFillSymbolLayer = QgsCentroidFillSymbolLayer::create(mp);
    
    • 完整测试代码如下
    void MainWindow::polygonCentroidSlot()
    {
        //添加一个线图层
        QgsVectorLayer* layer = addTestShape(QStringLiteral("maps/shapefile/water.shp"));
        //从图层获取渲染器
        QgsFeatureRenderer * layerRenderer= layer->renderer();
        QgsSingleSymbolRenderer *singleSymbolRenderer = QgsSingleSymbolRenderer::convertFromRenderer(layerRenderer);
    #if 0
        auto centroidFillSymbolLayer = new QgsCentroidFillSymbolLayer();
        centroidFillSymbolLayer->setPointOnSurface(false);
        centroidFillSymbolLayer->setPointOnAllParts(true);
        centroidFillSymbolLayer->setClipPoints(false);
        centroidFillSymbolLayer->setClipOnCurrentPartOnly(false);
    #else
        QVariantMap mp;
        mp["point_on_surface"] = QStringLiteral("0");
        mp["point_on_all_parts"] = QStringLiteral("1");
        mp["clip_points"] = QStringLiteral("0");
        mp["clip_on_current_part_only"] = QStringLiteral("0");
        auto centroidFillSymbolLayer = QgsCentroidFillSymbolLayer::create(mp);
    #endif
        //多个Symbol Layer构成一个Symbol
        QgsSymbolLayerList layerList;
        layerList << centroidFillSymbolLayer;
        //构造QgsFillSymbol并设置renderer
        auto fillSymbol = new QgsFillSymbol(layerList);
        singleSymbolRenderer->setSymbol(fillSymbol);
        layer->setRenderer(singleSymbolRenderer);
    
    }
    
    • 效果如下图
      在这里插入图片描述
      在这里插入图片描述

    总结

    • 介绍了矢量图层面要素单一符号中的仅渲染中心点(Centroid fill)使用
  • 相关阅读:
    【数据结构与算法】之深入解析“检测正方形”的求解思路与算法示例
    05 vue 计算属性的练习 1 methods \computed\ watch三种方法对比实例
    Rafy 框架:领域控制器
    【ZooKeeper】zookeeper源码6-FastLeaderElection选举算法
    828 统计子串中唯一的字符 思路草稿纸箱
    25 C++ 文件和流
    Java日期与时间 LocalDate、LocalDateTime函数
    使用seq2seq架构实现英译法
    分类预测 | MATLAB实现SSA-CNN-LSTM-Attention数据分类预测
    计算机基础(二):汇编语言与内存结构
  • 原文地址:https://blog.csdn.net/richie12/article/details/139774947