Qt/C++地图标注点的添加删除移动旋转/指定不同图标和动图/拿到单击信号

一、前言说明

标注点在地图开发中是最常见的应用场景之一,比如在地图上需要显示设备的位置,基本上都是添加标注点,指定图片和尺寸已经经纬度坐标位置。这个功能在每种地图内核中都提供的,这个并没有任何难点,在这个功能点上最大难题或者说是设计细节就是,标注点该如何对齐,比如水滴形状的图标一般是底部居中对齐更美观,刚好水滴的头在指定的经纬度坐标上,整个图标位于正上方。还有一种情况是圆形的图标,这种最美观的方式是中间居中对齐,也就是图片的中心点在指定的经纬度坐标上,更符合实际的情况,如果说是底部,则看起来可能会很怪。

不同地图内核提供了不同的函数设置图标位置,百度地图是通过setOffset设置偏移值,这个值需要自己根据图片的大小自己计算好再设置。高德地图是通过setAnchor指定位置字符串来设置,比如setAnchor(‘center’)是中间居中,setAnchor(‘bottom-center’)是底部居中,这种方式蛮好的,他会自己根据图片尺寸进行设置。天地图是通过设置marker的属性参数iconAnchor偏移值控制。腾讯地图很特殊,他是通过设置图标MarkerImage对象的anchor参数来控制的。

在marker标注点的旁边还可以显示一个跟随的文本,表示名称之类的信息,百度地图和高德地图都在marker对象的函数中就提供了处理,而天地图和腾讯地图需要自己new一个label对象,这个对象设置对应的位置为marker的位置来实现。

二、功能特点

  1. 支持多种地图内核,默认采用百度地图,可选高德地图、天地图、腾讯地图等。
  2. 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
  3. 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
  4. 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。
  5. 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
  6. 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
  7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
  8. 支持添加标注、删除标注、移动标注、清空标注。
  9. 标注点可以指定图标图片和尺寸,支持gif动图,支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度,带富文本提示信息。
  10. 标注点事件支持单击发信号通知和自己弹框显示信息。
  11. 提供地址转坐标和坐标转地址接口。
  12. 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
  13. 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
  14. 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
  15. 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
  16. 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
  17. 可以添加海量点,每个点都可以单击获取对应坐标和信息。
  18. 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取对应的信息比如坐标点和路径等。
  19. 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
  20. 路径规划结果可以显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
  21. 可以设置不同的地图视图比如街道图、卫星图、混合图。
  22. 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
  23. 可以设置地图的旋转角度和倾斜角度。
  24. 提供经纬度坐标纠偏转换功能,比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数,支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换,涵盖了各种地图的坐标系。
  25. 提供动态轨迹点移动功能,按照给定的经纬度坐标集合平滑移动。
  26. 同时支持qwidget和qml,支持编译到安卓系统运行。

三、使用说明

  1. 从左侧地图上鼠标按下选点,对应经纬度坐标会填充到坐标文本框中。填写好对应的标注的名称,单击添加标注按钮,左侧地图中会出现一个标注点,鼠标单击对应的标准点,会弹出提示单击了哪个标注点。
  2. 添加标注按钮的左侧是选择图片的类型,支持各种图片和尺寸,包括动图。默认图标文件在可执行文件下的mapimage目录。
  • 默认图标:不指定图片文件,每种地图都有自己内置风格的标注图片。
  • 水滴图标:指定一张水滴形状的图片,底部居中对齐。
  • 圆形图标:指定一张宽高一样的圆形图片,居中对齐。
  • 索引图标:指定一张大图,从中取固定位置的图标,网页中常见的方式。
  • 动画图标:指定一张gif动图文件,底部居中对齐。
  1. 在名称文本框中输入要删除的标注点名称,单击删除标注按钮,可以删除对应的标注点。
  2. 在名称文本框中输入要删除的标注点名称,然后左侧地图中鼠标选点,单击移动旋转按钮,会自动将标注点移动到新的位置,并设置45度旋转。
  3. 单击清空按钮会清空整个地图中的标注点。
  4. 单击重置标注,将随机生成一些标注点以及位置,每次都是新的位置。
  5. 在地址文本框中输入地址,单击地址转坐标,会查找到当前地址最近的经纬度坐标填入坐标文本框中。
  6. 在坐标文本框中输入坐标,单击坐标转地址,会查找坐标文本框中经纬度坐标最近的地址填入地址文本框中。

四、相关链接

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 名称:bin_map.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun

五、效果图

在这里插入图片描述

六、相关代码

#include "frmmapdemomarker.h"
#include "ui_frmmapdemomarker.h"
#include "qthelper.h"
#include "maphelper.h"frmMapDemoMarker::frmMapDemoMarker(QWidget *parent) : QWidget(parent), ui(new Ui::frmMapDemoMarker)
{ui->setupUi(this);this->initConfig();
}frmMapDemoMarker::~frmMapDemoMarker()
{delete ui;
}void frmMapDemoMarker::initConfig()
{ui->cboxIcon->setCurrentIndex(AppConfig::MapDemoIcon);connect(ui->cboxIcon, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
}void frmMapDemoMarker::saveConfig()
{AppConfig::MapDemoIcon = ui->cboxIcon->currentIndex();AppConfig::writeConfig();
}void frmMapDemoMarker::receiveDataFromJs(const QString &type, const QVariant &data)
{//不可见不用继续/说明不是本界面的操作触发的if (!this->isVisible()) {return;}QString result = data.toString();if (type == "click") {QString point = MapHelper::getLngLat2(result);ui->txtPoint->setText(point);} else if (type == "marker") {QtHelper::showMessageBoxInfo("当前单击了: " + result);} else if (type == "geocoderresult") {QStringList list = result.split("|");QString flag = list.first();if (flag == "AddrToPoint") {QString point = MapHelper::getLngLat2(list.last());ui->txtPoint->setText(point);} else if (flag == "PointToAddr") {ui->txtAddr->setText(list.last());}} else if (type == "searchresult") {//搞个文本框用于显示获取到的结果static QTextEdit *edit = NULL;if (!edit) {edit = new QTextEdit;edit->resize(800, 600);edit->setReadOnly(true);}edit->setWindowTitle("搜索结果");edit->setText(MapHelper::getSearchResult(result));edit->show();}
}void frmMapDemoMarker::on_btnAddMarker_clicked()
{QString name = ui->txtName->text().trimmed();QString point = ui->txtPoint->text().trimmed();QString image;int width = 23;int height = 25;bool center = false;static int index = -1;//可以指定本地图片文件或者网络图片/可设置图片的图标索引和尺寸等int icon = ui->cboxIcon->currentIndex();if (icon == 1) {image = "../mapimage/marker.png";width = 45;height = 65;} else if (icon == 2) {image = "../mapimage/marker0.png";width = 50;height = 50;center = true;} else if (icon == 3) {image = "../mapimage/ipc_red.png";width = 25;height = 30;} else if (icon == 4) {image = "../mapimage/markers.png";//image = "http://api.map.baidu.com/img/markers.png";index++;//图标有限重置索引if (index == 13) {index = 0;}} else if (icon == 5) {image = "../mapimage/gif_person.gif";width = 68;height = 100;//可以通过换行来实现垂直展示文字name = "垂<br/>直<br/>文<br/>字";}//可以测试不同的默认值参数QString js = QString("addMarker('%1', '%2', '%1')").arg(name).arg(point);js = QString("addMarker('%1', '%2', '%1', '%3')").arg(name).arg(point).arg(image);js = QString("addMarker('%1', '%2', '%1', '%3', %4, %5, %6, %7)").arg(name).arg(point).arg(image).arg(width).arg(height).arg(center).arg(index);emit runJs(js);//设置单击事件js = QString("setClick('%1', 2)").arg(name);emit runJs(js);//自动将序号递增if (name.startsWith("标注点")) {int index = name.mid(3, name.length()).toInt();name = QString("标注点%1").arg(index + 1);ui->txtName->setText(name);}
}void frmMapDemoMarker::on_btnDeleteMarker_clicked()
{QString name = ui->txtName->text().trimmed();QString js = QString("deleteMarker('%1')").arg(name);emit runJs(js);
}void frmMapDemoMarker::on_btnSetMarker_clicked()
{QString name = ui->txtName->text().trimmed();QString point = ui->txtPoint->text().trimmed();QString js = QString("setMarker('%1', '%2', %3)").arg(name).arg(point).arg(20);emit runJs(js);
}void frmMapDemoMarker::on_btnClearMarker_clicked()
{emit runJs("deleteMarker()");
}void frmMapDemoMarker::on_btnResetMarker_clicked()
{//先清空所有点on_btnClearMarker_clicked();//然后添加多个点/这里随机生成坐标QStringList names;names << "测试点1" << "测试点2" << "测试点3" << "测试点4" << "测试点5";for (int i = 0; i < names.count(); ++i) {QString point = QString("121.%1%2,31.%3%4").arg(rand() % 7).arg(rand() % 100).arg(rand() % 4).arg(rand() % 100);QString js = QString("addMarker('%1', '%2', '%1')").arg(names.at(i), point);emit runJs(js);}
}void frmMapDemoMarker::on_btnAddrToPoint_clicked()
{QString addr = ui->txtAddr->text().trimmed();emit runJs(QString("getPointByAddr('AddrToPoint', '%1')").arg(addr));
}void frmMapDemoMarker::on_btnPointToAddr_clicked()
{QString point = ui->txtPoint->text().trimmed();emit runJs(QString("getAddrByPoint('PointToAddr', '%1')").arg(point));
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CeresPCL 最小二乘插值(曲线拟合)

一、简介 在多项式插值时,当数据点个数较多时,插值会导致多项式曲线阶数过高,带来不稳定因素。因此我们可以通过固定幂基函数的最高次数 m(m < n),来对我们要拟合的曲线进行降阶。之前的函数形式就可以变为: 既然是最小二乘问题,那么就仍然可以使用Ceres来进行求解。 …

★ C++基础篇 ★ vector 类

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中&#xff0c;我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序&#xff0c;该程序包含设置标签文本和自增计数器的功能。 …

高可用集群keepalived从部署到实战一篇解决

目录 一.高可用集群 1.1 集群类型 1.2 系统可用性 1.3 系统故障 1.4 实现高可用 1.5.VRRP&#xff1a; 1.5.1 VRRP 相关术语 1.5.2 VRRP 相关技术 二.Keepalived 部署 2.1 keepalived 简介 2.2keepalived架构 2.3 Keepalived 环境准备 2.4 Keepalived 相关文件 2.…

Python编写Word文档

目录 0. 安装依赖 1. 创建word文档 2. 添加标题、居中、字体16大小 3. 添加标题一 4. 添加一段话并设置字体颜色 封装函数 5. 换页 6. 插入表格 0. 安装依赖 python-docx1.1.2 1. 创建word文档 from docx import Documentdoc Document() 2. 添加标题、居中、字体1…

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】 介绍基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码-能管系统软件架构

【记git 重命名文件失败,和正确方法】

【背景】 想要重命名一个文件&#xff0c;并同步到远程 【过程】 1.我是直接把 “驱动增加he.c” 文件重命名为 “驱动增加播放he接口方法” &#xff0c;想着直接提交就会同步重命名git仓记录的文件名。然后就可以推送到远程仓库&#xff0c;同步重命名远程仓库的文件名。 2.然…

全球滑坡(降雨诱发的)数据(有时间属性)

滑坡一般指狭义概念的滑坡,是指构成斜坡的有滑动历史和滑动可能性的岩、土体边坡,在重力作用下伴随着其下部软弱面(带)上的剪切作用过程而产生整体性运动的现象。 滑坡的发育阶段滑坡的发生、发展过程是有阶段性的。根据大量的现场实际资料、观测成果、滑坡模型试验和相关的岩土…

ant design pro v6 如何做好角色管理

先上图&#xff1a; 整个角色管理是如何做的吗&#xff1f; 首先你要处理后端&#xff0c;要先把角色存到用户那。 这是用户管理部分的内容&#xff1a; 可以看到一个用户是有多个角色的。 看到没有&#xff0c;存的是数组 数组的是一个 role 对象 role 对象是这样&#xf…

【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37350 随着人工智能技术的飞速发展&#xff0c;AI已经成为当今时代的重要驱动力。本报告将聚焦于人工智能AI行业的最新动态&#xff0c;涵盖客户服务、体验营销、资产管理以及国产AI大模型应用等多个领域。通过深入研究和分析&#xff0c;我们…

C++ 设计模式——抽象工厂模式

抽象工厂模式 抽象工厂模式 抽象工厂模式主要组成部分代码实现抽象工厂模式模式的 UML 图抽象工厂模式 UML 图解析优点和缺点适用场景 抽象工厂模式提供一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们的具体类。它通常用于需要创建多个产品…

2024年必读!《大模型应用开发极简入门》—— 一书掌握LLM大模型精髓

大家好&#xff0c;今天给大家推荐一本大模型应用开发入门书籍《大模型应用开发极简入门》&#xff0c;本书对很多AI概念做了讲解和说明&#xff01; 朋友们如果有需要 《大模型应用开发极简入门》&#xff0c;扫码获取~ 本书主要讲解了以下几个方面的大模型技术&#xff1a; …

[图解]片段16 ESS状态机图-SysMLEA建模住宅安全系统

1 00:00:00,220 --> 00:00:03,580 然后我们看初始这里 2 00:00:03,590 --> 00:00:09,500 有一个指向它的一个迁移的事件 3 00:00:09,710 --> 00:00:13,730 站点可用&#xff0c;这个实际上是错误的 4 00:00:14,020 --> 00:00:15,050 这不是事件 5 00:00:15,900…

NCSN公式推导(一)

通过估计数据分布的梯度进行生成建模 Paper Title&#xff1a;Generative Modeling by Estimating Gradients of the Data Distribution Paper是斯坦福大学发表在NIPS 2019的工作 Paper地址 Abstract 我们引入了一种新的生成模型&#xff0c;其中样本通过朗之万动力学生成&…

Power Query抓取多页数据导入到Excel

原文链接 举例网站&#xff1a;http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml?last5&p1 操作步骤 &#xff08;版本为&#xff1a;Excel2010&#xff09;&#xff1a; Step-01&#xff1a;单击【Power Query】-【从Web】&#xff0c;…

日期类代码实现-C++

一、目标 通过前面对类和对象的介绍我们可以自己通过C代码初步实现一个简单的日期类。 实现的主要操作有&#xff1a; 1.日期类的构造函数 2.日期类的拷贝构造函数&#xff08;在头文件中实现&#xff09; 3.日期类的比较运算符重载 4.日期类的计算运算符重载 5.流插入运…

【Linux】 gdb-调试器初入门(简单版使用)

&#x1f525;系列文章&#xff1a;《Linux入门》 目录 一、背景 二、什么是GDB &#x1f337;定义 &#x1f337;GDB调试工具---提供的帮助 三、GDB的安装教程-Ubuntu &#x1f337;gdb的安装 四、哪类程序可被调试 &#x1f337;程序的发布方式 &#x1f337;Debug版…

Vscode——如何实现 Ctrl+鼠标左键 跳转函数内部的方法

一、对于Python代码 安装python插件即可实现 二、对于C/C代码 安装C/C插件即可实现

5.3 表结构设计与数据完整性

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

Linux:开发工具(2)

一、Linux编译器-gcc/g使用 1.1 为什么我们可以用C/C做开发呢&#xff1f; 无论是在windows、还是Linux中&#xff0c;C的开发环境不仅仅指的是vs、gcc、g&#xff0c;更重要的是语言本身的头文件&#xff08;函数的声明&#xff09;和库文件&#xff08;函数的实现&#xff0…