QGIS+qt 二次开发 移动要素

本文介绍了使用QGIS和Qt进行GIS二次开发,着重讲解如何在QGIS中移动要素。首先介绍了开发环境,然后详细阐述了添加要素、启用编辑状态以移动要素的步骤,并分析了QGIS源码中涉及的关键类和函数。最后,展示了如何在自定义项目中调用并实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 前言

2 开发环境

3 添加要素

4 如何移动要素

5 分析

6 如何调用

6.1 先拷贝一些依赖的qgis文件

6.2 代码调整

6.3 外部调用

7 最后效果


1 前言

        最近在研究gis相关的开发,之前使用arcgis进行二次开发,虽然arcgis的文档很丰富,demo功能也比较全,实例代码也都有,可无奈的是,arcgis的桌面版只支持x86平台,由于我的项目涉及到的是arm平台的,只能再找一个能同时支持x86和arm的gis开发库了。

        通过网上搜索,最后发现QGIS用的比较多,而且是开源的,于是就选择使用QGIS来进行开发了,但QGIS的资料真的是很少,比arcgis还少,没办法,自己研究吧。

        图层的添加,要素的添加,这些都是基本的,baidu一搜一大堆,我这里就不说了。此文主要来说一下如果对图层中的要素进行移动。

2 开发环境

        Qt 5.12.12+QGIS 3.10+Win11

        编译器选择vs2017(msvc2017_64bit)

3 添加要素

        首先,我们先在QGIS desktop中导入一张shp图层,如下图:

 代码如下:

void MainWindow::addVectorLayer(const QString& path)
{
    QString fileName;
    if (path.isEmpty())
    {
        fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
        if(fileName.isNull())//如果未选择文件则返回
            return;
    }
    else
    {
        fileName = path;
    }
    QFileInfo info(fileName);
    QString basename = info.baseName();

    qDebug()<<"basename:"<<basename;

    // 创建矢量图层
    QgsVectorLayer* vecLayer = new QgsVectorLayer(fileName, basename, "ogr");

    if (!vecLayer->isValid())
    {
        QMessageBox::critical(this, "error", QString("layer is invalid: \n") + fileName);
        return;
    }
    // 缩放至图层区域
    m_mapCanvas->setExtent(vecLayer->extent());
    mlayers.append(vecLayer);
    m_mapCanvas->setLayers(mlayers);
    m_mapCanvas->refresh();

    // 设置坐标系,坐标系以导入的shp文件为准
    vecLayer->setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem::EpsgCrsId));
    // 设置当前图层
    m_mapCanvas->setCurrentLayer(vecLayer);

}

导入之后运行效果如下:

4 如何移动要素

        接下来说一下如何移动要素。通过参考QGIS Desktop工具上的工具栏,可以发现要素操作的工具栏,见下图:

 小白会问,怎么我的工具栏是灰色的不能点啊,那是因为需要先开启编辑状态,按下按钮

 

 然后就元素工具栏就点亮了。然后我们就可以点击移动要素按钮,对图层的要素进行移动了。如下:

 网上资料比较多的都是说如何识别选择的要素,或者如何选择要素,这明显不是我们想要的,但提供了思路,就是这些工具按钮,都是通过QgsMapTool这个类来实现的,既然网上没有,那就看源码吧,最后通过文件搜索关键字move feature,在源码的\src\app\目录下发现了qgsmaptoolmovefeature.cpp这个文件,就是QGIS上的移动要素的类,我们打开看一下代码:

qgsmaptoolmovefeature.h

/***************************************************************************
    qgsmaptoolmovefeature.h  -  map tool for translating features by mouse drag
    ---------------------
    begin                : Juli 2007
    copyright            : (C) 2007 by Marco Hugentobler
    email                : marco dot hugentobler at karto dot baug dot ethz dot ch
 ***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.             
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值