• Qgis 开发初级 《ToolBox》


    Qgis 有个ToolBox 的,在Processing->ToolBox 菜单里面,界面如下。

    理论上Qgis这里面的工具都是可以用脚本或者C++ 代码调用的。界面以Vector overlay 为例子简单介绍下使用方式。Vector overlay 的意思是矢量叠置分析,和arcgis软件类似的。点开之后会看到具体的功能。和之前的Geometry的叠置分析的功能是一样的,不同是这个图层级别的叠置分析,效率自然也比遍历Geometry的效率要高。

    接下面介绍下使用这些的方法

    1、Difference

    1. QgsVectorLayer* Diff(QgsVectorLayer* layer1, QgsVectorLayer* layer2) {
    2. const QString id = "native:difference";
    3. const QgsProcessingAlgorithm* algorithm = QgsApplication::processingRegistry()->algorithmById(id);
    4. QVariantMap conf;
    5. conf.insert(QStringLiteral("INPUT"), QVariant::fromValue(layer1));
    6. conf.insert(QStringLiteral("OVERLAY"), QVariant::fromValue(layer2));
    7. QgsProcessingOutputLayerDefinition value("TEMPORARY_OUTPUT");
    8. conf.insert(QStringLiteral("OUTPUT"), value);
    9. QgsProcessingContext context;
    10. QgsProcessingFeedback feedback;
    11. QVariantMap results = algorithm->run(conf, context, &feedback);
    12. QgsVectorLayer* outputLayer(dynamic_cast(context.getMapLayer(results.value(QStringLiteral("OUTPUT")).toString())));
    13. //暂时先加载,实际用的时候需要屏蔽
    14. QgsProject::instance()->addMapLayer(outputLayer);
    15. return outputLayer;
    16. }

    2、Clip

    1. QgsVectorLayer* Clip(QgsVectorLayer* inputLayer, QgsVectorLayer* overlayLayer) {
    2. //差集
    3. const QString id = "native:clip";
    4. QVariantMap conf;
    5. conf.insert(QStringLiteral("INPUT"), QVariant::fromValue(inputLayer));
    6. conf.insert(QStringLiteral("OVERLAY"), QVariant::fromValue(overlayLayer));
    7. QgsProcessingOutputLayerDefinition value("TEMPORARY_OUTPUT");
    8. conf.insert(QStringLiteral("OUTPUT"), value);
    9. conf.insert(QStringLiteral("LAYER_OPTIONS"), QStringLiteral("COORDINATE_PRECISION=1"));
    10. QgsProcessingContext context;
    11. QgsProcessingFeedback feedback;
    12. const QgsProcessingAlgorithm* algorithm = QgsApplication::processingRegistry()->algorithmById(id);
    13. QVariantMap results = algorithm->run(conf, context, &feedback);
    14. QgsVectorLayer* resultlayer(dynamic_cast(context.getMapLayer(results.value(QStringLiteral("OUTPUT")).toString())));
    15. //暂时先加载,实际用的时候需要屏蔽
    16. QgsProject::instance()->addMapLayer(resultlayer);
    17. return resultlayer;
    18. }

    3、Union

    1. QgsVectorLayer* Union(QgsVectorLayer* layer1, QgsVectorLayer* layer2) {
    2. const QString id = "native:union";
    3. const QgsProcessingAlgorithm* algorithm = QgsApplication::processingRegistry()->algorithmById(id);
    4. // 检查图层类型
    5. if (layer1->geometryType() != layer2->geometryType()) {
    6. qWarning() << "Input layers must have the same geometry type.";
    7. return nullptr;
    8. }
    9. QVariantMap conf;
    10. conf.insert(QStringLiteral("INPUT"), QVariant::fromValue(layer1));
    11. conf.insert(QStringLiteral("OVERLAY"), QVariant::fromValue(layer2));
    12. QgsProcessingOutputLayerDefinition value("TEMPORARY_OUTPUT");
    13. conf.insert(QStringLiteral("OUTPUT"), value);
    14. conf.insert(QStringLiteral("LAYER_OPTIONS"), QStringLiteral("COORDINATE_PRECISION=1"));
    15. QgsProcessingContext context;
    16. QgsProcessingFeedback feedback;
    17. QVariantMap results = algorithm->run(conf, context, &feedback);
    18. QgsVectorLayer* outputLayer(dynamic_cast(context.getMapLayer(results.value(QStringLiteral("OUTPUT")).toString())));
    19. //暂时先加载,实际用的时候需要屏蔽
    20. QgsProject::instance()->addMapLayer(outputLayer);
    21. return outputLayer;
    22. }

    4、小节

    使用这些工具的代码基本大同小异,最关键的就是id,id基本就是原来的名字的小写。读者可以自己去试试里面其他工具的使用。使用过程需要注意一点的是如果有无效的Geometey,可能会报错,可以在执行之前删除无效的Geometry。还有一点就是面图层在执行过程中因为误差问题可能会出现线的情况,常常需要删除线,一般需要在Geometry的 parts 里面做判断的。还有一些qgis的常用功能,像投影,三维,server和pyphon脚本的使用。这些功能后面可能会继续介绍,也可能不在做介绍了。

  • 相关阅读:
    贪吃蛇-c语言版本
    Vue的生命周期函数
    SpringBoot系列:通过AOP+注解优雅实现操作日志记录
    备战蓝桥杯---牛客寒假训练营2VP
    基于SSM技术的oa办公管理系统的设计与实现毕业设计源码100934
    每日五道java面试题之spring篇(二)
    Android Compose 入门,深入底层源码分析
    SVN创建分支与合并分支
    openEuler 22.03 LTS 环境使用 Docker Compose 一键部署 JumpServer (all-in-one 模式)
    http+nunjucks模板引擎、koa+nunjucks模板引擎
  • 原文地址:https://blog.csdn.net/azxc12345/article/details/143254159