当前位置: 首页 > news >正文

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

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_OBJECTpublic: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);

相关文章:

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

1.简介 QgsMapTool地图工具是用于操作地图画布的用户交互式工具。例如&#xff0c;地图平移和缩放功能被实现为地图工具。 QgsMapTool是抽象基类&#xff0c;以下是类的继承关系&#xff1a; 2.常用接口 virtual void canvasDoubleClickEvent (QgsMapMouseEvent *e)重写鼠标…...

MySQL基础(四)数据库备份

目录 前言 一、概述 1.数据备份的重要性 2.造成数据丢失的原因 二、备份类型 &#xff08;一&#xff09;、物理与逻辑角度 1.物理备份 2.逻辑备份 &#xff08;二&#xff09;、数据库备份策略角度 1.完整备份 2.增量备份 三、常见的备份方法 四、备份&#xff08…...

子类化QThread来实现多线程,moveToThread函数的作用

子类化QThread来实现多线程&#xff0c; QThread只有run函数是在新线程里的&#xff0c;其他所有函数都在QThread生成的线程里。正确启动线程的方法是调用QThread::start()来启动。 一、步骤 子类化 QThread&#xff1b;重写run&#xff0c;将耗时的事件放到此函数执行&#…...

经典面试题(力扣,接雨水)

接雨水 方法一思路测试代码复杂度测试结果 方法二思路测试代码复杂度测试结果 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]…...

2023年深圳杯数学建模C题无人机协同避障航迹规划

2023年深圳杯数学建模 C题 无人机协同避障航迹规划 原题再现&#xff1a; 平面上A、B两个无人机站分别位于半径为500 m的障碍圆两边直径的延长线上&#xff0c;A站距离圆心1 km&#xff0c;B站距离圆心3.5 km。两架无人机分别从A、B两站同时出发&#xff0c;以恒定速率10 m/s…...

PostgreSQL--实现数据库备份恢复详细教学

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;RodmaChen PostgreSQL--实现数据库备份恢复详细教学 一. 数据库备份二. 数据库恢复三. 存留问题 数据库备份恢复功能是每个产品所需的&#xff0c;以下是简单的脚本案例&a…...

JDK工具之jstack说明

JDK工具之jstack说明 前言什么是jstack&#xff1f;如何使用jstack&#xff1f;获取Java进程的PID分析jstack输出 常用的jstack命令选项jstack的应用场景结论 前言 作为Java开发人员&#xff0c;在开发和维护复杂的Java应用程序时&#xff0c;我们经常会遇到各种各样的问题&am…...

34 | 牛顿迭代法

文章目录 牛顿迭代法一、原理二、Python实现三、练习题四、总结牛顿迭代法 一、原理 牛顿迭代法(Newton’s Method)是一种用于寻找方程的实根的数值方法。其基本思想是通过一系列逼近来求解方程的根。对于方程 f ( x ) = 0 f(x) = 0 f(x...

ChatGPT如何帮助学生学习

​ 一些教育工作者担心学生可能使用ChatGPT作弊。因为这个AI工具能写报告和计算机代码&#xff0c;画出复杂图表……甚至已经有许多学校把ChatGPT屏蔽。 研究发现&#xff0c;学生作弊的主要原因是想考得好。是否作弊与作业和考试的打分方式有关&#xff0c;所以这与技术的便…...

easyexcel导出excel-50行代码搞定大量数据导出

文章目录 一、写在前面二、使用步骤定义导出的数据实体导出 一、写在前面 场景&#xff1a; 当数据量导出过大时如果一次从数据库取出所有数据会导致内存飙升导致系统奔溃&#xff0c;所以我们采取循环读取和循环写入。 准备: mave导入&#xff1a;easyexcel:3.0.5 二、使用…...

OpenAI宣布安卓版ChatGPT正式上线;一站式 LLM底层技术原理入门指南

&#x1f989; AI新闻 &#x1f680; OpenAI宣布安卓版ChatGPT正式上线 摘要&#xff1a;OpenAI今日宣布&#xff0c;安卓版ChatGPT已正式上线&#xff0c;目前美国、印度、孟加拉国和巴西四国的安卓用户已可在谷歌Play商店下载&#xff0c;并计划在下周拓展到更多地区。Chat…...

Rust vs Go:常用语法对比(二)

21. Swap values 交换变量a和b的值 a, b b, a package mainimport "fmt"func main() { a : 3 b : 10 a, b b, a fmt.Println(a) fmt.Println(b)} 103 fn main() { let a 3; let b 10; let (a, b) (b, a); println!("a: {a}, b: {b}", aa,…...

对于Vue3的一些思考

看完 Vue Hooks: 让Vue开发更简单与高效 - 掘金 一些小心得 vue3&#xff1a; 组合式API&#xff08;是利用架构&#xff0c;强制达到拆分目的&#xff09; 达到解耦的目的。对于vue3来说 每个模块的每个逻辑都是 一个一个独立的方法。通过 方法方法整体业务 代码风格&#…...

Bean的生命周期 - spring

前言 本篇介绍了Bean的生命周期&#xff0c;认识PostConstruct注释&#xff0c;PreDestroy注释&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. spring生命周期2. Bean的生命周期3. 为什么先设置…...

入门Linux基本指令(2)

这篇文章主要提供一些对文件操作的Linux基本指令&#xff0c;希望对大家有所帮助&#xff0c;三连支持&#xff01; 目录 cp指令(复制) mv指令(剪切) nano指令 cat指令(打印文件内容) > 输出重定向 >> 追加重定向 < 输入重定向 more指令 less指令(推荐) …...

【C++】【自用】选择题 刷题总结

文章目录 【类和对象】1. 构造、拷贝构造的调用2. 静态成员变量3. 初始化列表4. 成员函数&#xff1a;运算符重载5. 友元函数、友元类55. 特殊类设计 【细节题】1. 构造 析构 new \ deletet、new[] \ delete[] 【类和对象】 1. 构造、拷贝构造的调用 #include using namespace…...

SkyWalking链路追踪-Collector(收集器)

Collector&#xff08;收集器&#xff09; SkyWalking的Collector&#xff08;收集器&#xff09;是SkyWalking链路追踪的核心组件之一。它负责接收来自各个Agent的追踪数据&#xff0c;并将其存储到数据存储器&#xff08;如数据库&#xff09;中。具体来说&#xff0c;Colle…...

typescript自动编译文件实时更新

npm install -g typescripttsc --init 生成tsconfig.json配置文件 tsc -w 在监听模式下运行&#xff0c;当文件发生改变的时候自动编译...

qt6.5 download for kali/ubuntu ,windows (以及配置选项选择)

download and sign in qt官网 sign in onlion Install 1 2 3 4 5...

【JS 原型链】

JavaScript 原型链是一个重要的概念&#xff0c;它是 JavaScript 语言实现面向对象编程的核心。在 JavaScript 中&#xff0c;每个对象都有一个与之关联的原型&#xff0c;并且该对象继承了原型中的属性和方法。这些原型组成了一个原型链&#xff0c;可以通过该链追溯到顶层的 …...

终极指南:如何用KCN-GenshinServer轻松搭建原神私服

终极指南&#xff1a;如何用KCN-GenshinServer轻松搭建原神私服 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 还在为复杂的命令行配置而头疼吗&#xff1f;KCN-GenshinSe…...

从package.xml到CMakeLists.txt:手把手教你配置一个ROS1机器人控制包(附完整项目模板)

从package.xml到CMakeLists.txt&#xff1a;构建工业级ROS1机器人控制包的完整指南 在机器人操作系统(ROS)开发中&#xff0c;功能包的配置质量直接影响项目的可维护性和扩展性。本文将带您深入理解ROS1功能包的核心配置文件&#xff0c;通过一个完整的工业机器人控制包案例&am…...

别再死磕逐位计算了!用C语言手撸一个CRC32查表函数(附完整代码和表格生成)

从零构建高性能CRC32查表算法&#xff1a;嵌入式场景的极致优化实践 在嵌入式开发中&#xff0c;数据校验的效率和资源消耗往往成为系统设计的瓶颈。传统逐位计算的CRC32实现虽然直观&#xff0c;但在处理高速数据流或资源受限环境时&#xff0c;其性能劣势暴露无遗。查表法通过…...

OpenClaw新手避坑指南:Phi-3-vision-128k-instruct部署中的5个常见错误

OpenClaw新手避坑指南&#xff1a;Phi-3-vision-128k-instruct部署中的5个常见错误 1. 镜像版本不匹配导致的初始化失败 上周我在本地尝试部署Phi-3-vision-128k-instruct时&#xff0c;遇到了第一个拦路虎——系统提示"CUDA version mismatch"。这个错误看似简单&…...

从零到集群:基于Rocky Linux ARM64的虚拟化平台构建与自动化部署实战

1. 环境准备与基础配置 第一次接触ARM64架构的虚拟化平台搭建时&#xff0c;我踩过不少坑。不同于常见的x86环境&#xff0c;Rocky Linux ARM64在驱动支持和软件生态上有其特殊性。我们先从最基础的物理服务器配置说起。 假设你面前是一台刚拆封的ARM架构服务器&#xff0c;我…...

有些路看起来很难走,其实是在带你慢慢变强

生活里&#xff0c;很多人都希望自己走的是一条轻松一点、顺利一点的路。最好努力了就能有结果&#xff0c;付出了就能被看见&#xff0c;遇到的问题也都能很快解决。可真正经历过一些事情后才会发现&#xff0c;人生并不会总按照理想的节奏前进。很多时候&#xff0c;那些让人…...

快速验证dify部署方案:用快马生成环境检查与部署脚本原型

最近在折腾dify的本地部署&#xff0c;发现环境配置这块特别容易踩坑。作为一个开源AI应用开发平台&#xff0c;dify的部署涉及Python版本、Docker环境、端口占用等一系列依赖项检查&#xff0c;手动操作既繁琐又容易遗漏步骤。正好发现InsCode(快马)平台能快速生成这类工具的原…...

用ESP32和2.13寸电子价签墨水屏,DIY一个超省电的桌面网络时钟(附完整代码)

用ESP32和2.13寸电子价签墨水屏打造极简网络时钟&#xff1a;从硬件拆解到代码实战 在智能设备泛滥的今天&#xff0c;一块能安静显示时间且不打扰生活的时钟反而成了稀罕物。本文将带你用ESP32开发板和汉朔2.13寸电子价签墨水屏&#xff0c;打造一个年耗电量不足1度电的极简网…...

PCB开窗技术:提升电流承载能力的关键工艺

1. PCB开窗技术解析&#xff1a;从概念到应用在PCB设计领域&#xff0c;"开窗"这个术语经常被经验丰富的工程师挂在嘴边&#xff0c;但对于刚入行的新手来说&#xff0c;这个看似简单的操作背后却蕴含着不少设计门道。作为一名有十年硬件设计经验的工程师&#xff0c…...

自动化工具赋能工作流:如何用KeymouseGo提升效率与降低错误率

自动化工具赋能工作流&#xff1a;如何用KeymouseGo提升效率与降低错误率 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 在…...