Qgis二次开发-QgsMapTool地图交互工具详解

news2024/11/28 5:33:19

1.简介

QgsMapTool地图工具是用于操作地图画布的用户交互式工具。例如,地图平移和缩放功能被实现为地图工具。

QgsMapTool是抽象基类,以下是类的继承关系:

2.常用接口

virtual void canvasDoubleClickEvent (QgsMapMouseEvent *e)重写鼠标双击事件
virtual void canvasMoveEvent (QgsMapMouseEvent *e)重写鼠标移动事件
virtual void canvasPressEvent (QgsMapMouseEvent *e)重写鼠标按下事件
virtual void canvasReleaseEvent (QgsMapMouseEvent *e)重写鼠标抬起事件
virtual void setCursor (const QCursor &cursor)设置光标
QgsPointXY toMapCoordinates (QPoint point)将点从屏幕坐标转换为地图坐标。

3.示例 

示例1:画布移动、放大、缩小

源码:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_GisCtrl.h"
#include <QDebug>
#include <QFileInfo>
#include <qgsmaptoolpan.h>
#include <qgsrasterlayer.h>
#include <qgsmapcanvas.h>
#include <qgspoint.h>
#include <QMouseEvent>
#include <qgsmaptoolzoom.h>
#include <QActionGroup>

class GisCtrl : public QMainWindow
{
    Q_OBJECT

public:
    GisCtrl(QWidget *parent = Q_NULLPTR);

private:
    Ui::GisCtrlClass ui;

private slots:
	void slotXyCoordinates(const QgsPointXY &p);
	void slotMove();
	void slotZoomIn();
	void slotZoomOut();

private:
	QgsMapCanvas *m_mapCanvas = nullptr;
	QList<QgsMapLayer *> m_layers;
	QgsMapToolPan *m_toolPan = nullptr;	// 新建移动工具
	QgsMapToolZoom *m_toolZoomIn = nullptr;//放大
	QgsMapToolZoom *m_toolZoomOut = nullptr;//缩小

	QActionGroup *m_actionGroup = nullptr;
};



#include "GisCtrl.h"
#include <qgsrasterlayer.h>
#include <qgsrubberband.h>
#pragma execution_character_set("utf-8")

GisCtrl::GisCtrl(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	//创建画布
	m_mapCanvas = new QgsMapCanvas(this);

	QString url = "F:/arcgis/TMS.xml";

	m_mapCanvas->setCanvasColor(QColor(255, 255, 255));

	//加载瓦片地图
	QgsRasterLayer *layer = new QgsRasterLayer(url);
	if (!layer->isValid())
	{
		qDebug() << "load map faild";
	}

	m_layers.append(layer);

	// 新建移动工具
	m_toolPan = new QgsMapToolPan(m_mapCanvas);

	m_mapCanvas->setExtent(layer->extent());
	m_mapCanvas->enableAntiAliasing(true);
	m_mapCanvas->setLayers(m_layers);
	m_mapCanvas->setMapTool(m_toolPan);

	m_toolZoomIn = new QgsMapToolZoom(m_mapCanvas, false);
	m_toolZoomOut = new QgsMapToolZoom(m_mapCanvas, true);

	m_actionGroup = new QActionGroup(this);
	m_actionGroup->addAction(ui.actionMove);
	m_actionGroup->addAction(ui.actionZoomIn);
	m_actionGroup->addAction(ui.actionZoomOut);
	m_actionGroup->setExclusive(true);

	connect(m_mapCanvas, &QgsMapCanvas::xyCoordinates, this, &GisCtrl::slotXyCoordinates);
	connect(ui.actionMove, &QAction::triggered, this, &GisCtrl::slotMove);
	connect(ui.actionZoomIn, &QAction::triggered, this, &GisCtrl::slotZoomIn);
	connect(ui.actionZoomOut, &QAction::triggered, this, &GisCtrl::slotZoomOut);

	setCentralWidget(m_mapCanvas);

	ui.actionMove->setChecked(true);
	ui.actionLineManager->setVisible(false);
	ui.actionLayer->setVisible(false);
	ui.actionSelect->setVisible(false);
	ui.actionItem->setVisible(false);
}

void GisCtrl::slotXyCoordinates(const QgsPointXY &p)
{
	QString str = QString("经度= %1,纬度=%2").arg(QString::number(p.x(), 'f', 6)).arg(QString::number(p.y(), 'f', 6));
	this->statusBar()->showMessage(str);
}

void GisCtrl::slotMove()
{
	m_mapCanvas->setMapTool(m_toolPan);
}

void GisCtrl::slotZoomIn()
{
	m_mapCanvas->setMapTool(m_toolZoomIn);
}

void GisCtrl::slotZoomOut()
{
	m_mapCanvas->setMapTool(m_toolZoomOut);
}

示例2:鼠标点击画矩形

源码:

自定义一个地图交互工具继承QgsMapToolIdentify

#pragma once
#include <QObject>
#include <QList>
#include <QScopedPointer>
#include <qgsmapcanvas.h>
#include <qgsmaptoolidentify.h>
#include <qgsrubberband.h>
#include <qgsmapmouseevent.h>


class QgsMapToolSelectFeatures : public QgsMapToolIdentify
{
	Q_OBJECT
public:
	QgsMapToolSelectFeatures(QgsMapCanvas *mapCanvas);

protected:
	//重写鼠标移动
	void canvasMoveEvent(QgsMapMouseEvent *e) override;
	//重写鼠标按下
	void canvasPressEvent(QgsMapMouseEvent *e) override;

	void initRubberBand();

private:
	// 是否正在选择
	bool mSelectionActive = false;
	QScopedPointer<QgsRubberBand> mSelectionRubberBand;
	QColor mFillColor = QColor(255, 255, 0, 63);
	QColor mStrokeColor = QColor(255, 255, 0, 100);
	QPoint mInitDragPos;
};


//cpp
#include "QgsMapToolSelectFeatures.h"
#include "QgsMapToolIdentify.h"

QgsMapToolSelectFeatures::QgsMapToolSelectFeatures(QgsMapCanvas *mapCanvas)
	: QgsMapToolIdentify(mapCanvas)
{
}

void QgsMapToolSelectFeatures::canvasMoveEvent(QgsMapMouseEvent * e)
{
	if (e->buttons() != Qt::LeftButton)
		return;

	QRect rect;
	if (!mSelectionActive)
	{
		mSelectionActive = true;
		rect = QRect(e->pos(), e->pos());
	}
	else
	{
		rect = QRect(e->pos(), mInitDragPos);
	}
	if (mSelectionRubberBand)
		mSelectionRubberBand->setToCanvasRectangle(rect);
}

void QgsMapToolSelectFeatures::canvasPressEvent(QgsMapMouseEvent * e)
{
	if (!mSelectionRubberBand)
		initRubberBand();

	mInitDragPos = e->pos();
}

void QgsMapToolSelectFeatures::initRubberBand()
{
	mSelectionRubberBand.reset(new QgsRubberBand(mCanvas, QgsWkbTypes::PolygonGeometry));
	mSelectionRubberBand->setFillColor(mFillColor);
	mSelectionRubberBand->setStrokeColor(mStrokeColor);
}

使用

QgsMapToolSelectFeatures *m_tool = new QgsMapToolSelectFeatures(m_mapCanvas);
m_mapCanvas->setMapTool(m_tool);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Matlab】基于遗传算法优化 BP 神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的数据回归预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

Hadoop简介以及集群搭建详细过程

Hadoop简介以及集群搭建详细过程 hadoop集群简介hadoop部署模式Hadoop集群安装1.集群角色规划2.服务器基础环境准备3.上传安装包hadoop安装包目录结构5.编辑hadoop配置文件6.分发安装包7.配置hadoop环境变量8.NameNode format(格式化操作) hadoop集群启动关闭-手动逐个进程启停…

数字孪生in电力终端:高效虚拟环境实现测试“左移”

电力资源是现代社会发展必不可少的清洁型可再生资源&#xff0c;在清洁性、高效性、便捷性和适用性等方面优于传统化石能源&#xff0c;是如期实现2030年前碳达峰、2060年前碳中和的“双碳”目标的关键。2006至2019年前&#xff0c;电力行业累计为全社会减少了约159.4亿吨的碳排…

VSCode_常用插件_最新推荐

本文介绍前端开发领域常用的一些VSCode插件&#xff0c;插件是VSCode最重要的组成部分之一&#xff0c;本文列出了个人觉得是有用或有趣的一些插件。 一、代码管理相关插件 1、GitLens — Git supercharged 该插件增强了 VS Code 中的 Git&#xff0c;通过丰富的可视化和强…

【大厂直通车】百度2024届测开提前批一面面经(烫).

&#x1f4ec;&#x1f4ec;哈喽&#xff0c;大家好&#xff0c;我是小浪。那么最近24届提前批的公司陆续开了大大小小有好几十家了。有很多的同学已经制作好了简历&#xff0c;陆续开始投递了。但是结果&#xff0c;确实很不尽人意&#xff0c;在某论坛上面看到很多同学简历这…

5分钟,结合 LangChain 搭建自己的生成式智能问答系统

伴随大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;的涌现&#xff0c;人们发现生成式人工智能在非常多领域具有重要意义&#xff0c;如图像生成&#xff0c;书写文稿&#xff0c;信息搜索等。随着 LLM 场景的多样化&#xff0c;大家希望 LLM 能在垂直…

如何邀请明星和乐队演出你的音乐节?

组织一场音乐节是一个令人兴奋和具有挑战性的任务。邀请明星和乐队演出是吸引观众、增加活动吸引力的重要一环。以下是一些关键步骤和策略&#xff0c;媒介易帮助你成功邀请明星和乐队演出你的音乐节。 确定音乐节的定位和目标&#xff1a;首先&#xff0c;明确你的音乐节的定…

人工智能现在可以在没有人类的情况下学习!

一旦精灵离开灯&#xff0c;即使不是不可能&#xff0c;也很难将其放回去&#xff01; 南加州大学的一项研究表明 &#xff0c;相互共享知识的人工智能模型可以相互学习并快速掌握不同的任务。 这一发现具有在包括医学在内的各个领域应用的潜力。 一组研究人员开发了一种名…

shell脚本定时推送钉钉战报

一、目的与演示效果 解析服务端返回的如下字符串&#xff0c;获取今日数据、历史数据&#xff0c;实现钉钉定时推送战报效果。 {"code": "00000","msg": "","success": true,"data": {"2023-07-19": …

nacos适配达梦、瀚高、人大金仓数据库及部分源码探究

一.插件实现 1.插件目录结构 2.pom依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-datasource-plugin</artifactId><version>2.2.4</version></dependency><dependency><groupId>org.s…

自动化测试(二):安卓机初探与Python实现andriod截图实例

目录 1.安卓开发常用术语介绍2. 各种SDK的安装&#xff08;陆续补充ing&#xff09;2.1 JDK的安装2.2 单独安装Android SDK部分组件2.3 Android NDK的安装 3. pythonminicap实现andriod截图实例4. TODO 1.安卓开发常用术语介绍 IDE (Integrated Development Environment) : 集成…

索引的本质与数据结构

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; 正确合理的创建索引是提升数据库查询性能的基础&#xff0c;因此针对数据库来说&#xff0c;索引是必须要掌握的。 1 数据库索引的本质 我们一说到索引&#xff0c;如果大家想到是一个类似于字典的目录&#xff0…

Eclipse整合tomcat时要注意的几点

Eclipse整合tomcat时要注意的几点 1、安装目录及jdk 2、参数配置 注意&#xff1a;Arguments的配置&#xff0c;日志输出文件目录及java内存大小设置等&#xff0c;如下&#xff1a; -Dcatalina.base"E:\apache-tomcat-7.0.52" -Dcatalina.home"E:\apache-tomc…

【hadoop】Java API连接(操作)HDFS

Java API连接&#xff08;操作&#xff09;HDFS 直接连接遇到的问题设置执行的用户为root用户使用Java的-D参数来设置环境变量使用chmod的命令赋予权限修改参数配置 直接连接遇到的问题 直接运行下面的代码&#xff0c;会出现权限不够的问题 Test public void test1() throws…

Meta牵手Microsoft推出下一代Llama 2

官方消息 1、今天&#xff0c;我们将介绍 Llama 2 的可用性&#xff0c;这是我们的下一代开源大型语言模型。 2、Llama 2免费用于研究和商业用途。 3、Microsoft和 Meta 正在扩大他们的长期合作伙伴关系&#xff0c;Microsoft 是 Llama 2 的首选合作伙伴。 4、在技术、学术…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务&#xff0c;锁&#xff0c;子查询 事务有点像是原子操作&#xff0c;需要有完整性&#xff0c;要么全都完成了&#xff…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文&#xff1a;FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…

基于大模型的Text2SQL微调的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

(转载)基于 BP_Adaboost 的强分类器设计(matlab实现)

本博客的完整代码获取&#xff1a; https://www.mathworks.com/academia/books/book106283.html 1案例背景 1.1 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数…

Postman传递对象参数(包含有集合对象)

postman通常需要传递各式各样的参数&#xff0c;本文主要介绍了Postman传递对象参数(包含有集合对象)&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 项目场景&#xff1a; postman通常需要传递各式各样的参数&#xff0c;这样的话&#xff0c;进行…