Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换
一、前言说明
这个地图组件写了很多年了,最初设计的比较粗糙,最开始只是为了满足项目需要,并没有考虑太多拓展性,比如最初都是按照百度地图写死在代码中,经过这几年大量的现场实际应用,以及大量的用户提出的改进意见,逐渐萌生了彻底重新编写对应地图相关的代码,比如基类子类的设计,各种功能接口通过js函数交互,而不是一堆代码写在网页中。
之前的地图示例写的比较粗糙,想到什么写到什么,功能堆积比较严重,一直在做加法,导致越发臃肿,包括界面上的功能演示也比较不直观,所以这次特意花点时间全部重构,包括所有示例都重构,对于过多的示例演示,单独起了个目录存放一个个小示例的代码,拆分开来,使得该分组的功能学习起来非常的方便,之前是一堆示例代码堆积在一个类中,找起来也要费时间,程序员最烦的就是一个代码文件中特别多的代码,能够做到分组拆分就拆分。
二、功能特点
- 支持多种地图内核,默认采用百度地图。
- 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
- 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
- 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、地图测距。
- 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
- 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
- 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
- 支持添加标注、删除标注、移动标注、清空标注。
- 标注点可以指定图标图片,可以设置旋转角度,带富文本提示信息。
- 标注点事件支持单击发信号通知和自己弹框显示信息。
- 提供地址转坐标和坐标转地址接口。
- 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
- 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
- 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
- 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
- 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
- 可以添加海量点,每个点都可以单击获取对应坐标和信息。
- 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取。
- 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
- 路径规划结果显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
- 可以设置不同的地图视图比如街道图、卫星图、混合图。
- 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
- 提供离线地图下载模块,可以选择不同的地图内核比如百度地图或者谷歌地图,不同的地图类型比如下载街道图还是卫星图,不同的地图层级,多线程极速下载。
- 表格行实时显示对应的瓦片下载进度,有下载超时时间,重试次数,每个瓦片下载完成都发送信号通知,参数包括下载用时。
- 提供省市轮廓图下载模块,自动下载各个地区的轮廓图,保存到脚本文件或者文本文件。
- 支持手动调整不同区域的轮廓边界,调整后可以主动获取调整后的边界点集合。
- 提供动态点位示例,手动在地图上选点并添加标注,附带自定义的信息比如速度和时间等。
- 提供海量点位示例,批量添加标注点、点聚合、海量点。用于测试环境中支持的最大点位性能。
- 支持GPS坐标转换,同时提供了在线和离线两种方式。一般设备接收到的是标准的GPS坐标,在百度地图上需要转换成百度的坐标。
- 提供动态轨迹示例,在地图上鼠标按下选择起点和终点后,查询路线,获取路径轨迹点,定时器模拟轨迹移动。可以筛选数据将过多的路径点筛选到设定的点数。
- 提供轨迹回放示例,按照指定的轨迹点列表回放,也可以导入轨迹点数据进行回放。同时支持在街道图、卫星图、混合图中回放轨迹。
- 提供省市区域地图示例,采用echart组件,同时支持闪烁点图、迁徙图、区域地图、世界地图、仪表盘等。可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。
- 省市区域地图示例,内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。可设置城市的名称、值、经纬度集合。
- 内置通用浏览器组件,同时支持webkit/webengine/miniblink等内核。提供网页控件示例,演示打开网页和本地网页文件。
- 支持任意Qt版本、任意系统、任意编译器。
三、代码使用
- 将core_map(地图组件)/core_webview(浏览器组件)这两个组件目录拷贝到你的项目目录,并在pro中填写引入代码加入到你的项目中。$$PWD/…/表示上级目录。
include ($$PWD/../core_map/core_map.pri)
include ($$PWD/../core_webview/core_webview.pri)
- 在pro中启用地图内核,比如百度地图内核对应需要在pro文件中增加一行定义 DEFINES += baidux。
- 引入头文件。
#include "webview.h"
#include "mapbase.h"
- 新建一个窗体,上面放一个布局,推荐用表格布局 gridlayout,可以放多个浏览器控件。
- 实例化浏览器类和地图类。
//实例化浏览器控件
WebView *webView = new WebView(this);
//加入到布局
webView->setLayout(ui->gridLayout);
//实例化地图类/参数2表示何种地图内核
MapBase *mapObj = MapHelper::getMapObj(this, MapCore_BaiDu);
//传入网页控件用于执行函数
mapObj->setWebView(webView);
//加载地图
mapObj->load();
- 所有地图相关的函数接口在MapBase类中,可以打开mapbase.h查看具体说明。
- 地图中大部分的功能都是通过执行js函数来触发,比如添加标注、添加折线图等。这些必须严格按照提供的js函数名称和参数来执行。对应示例都提供了相关的调用方法。
- 部分函数接口。
QString js;
//设置地图级别(值越大放大/越小缩小)
js = "setZoom(9)";
//街道图卫星图切换(0-街道图/1-卫星图/2-混合图)
js = "setMapType(1)";
//添加一个标记(北京那边)
js = QString("addMarker('测试点', '测试地址', '', '', 100, '%1', 2)").arg("116.475836,40.251114");
//最终通过浏览器控件执行
webView->runJs(js);
- 浏览器组件使用示例。
//实例化浏览器控件
WebView *webView = new WebView(this);
//加入到布局
webView->setLayout(ui->verticalLayout);
//打开网址
webView->load("https://www.xxx.com", "", "");
四、相关链接
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 名称:bin_map.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
五、效果图
相关文章:

Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换
一、前言说明 这个地图组件写了很多年了,最初设计的比较粗糙,最开始只是为了满足项目需要,并没有考虑太多拓展性,比如最初都是按照百度地图写死在代码中,经过这几年大量的现场实际应用,以及大量的用户提出…...

最新版Python安装教程
一、安装Python 1.下载Python 访问Python官网: https:/www.oython.orgl 点击downloads按钮,在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…...

1.3镜像管理
【必知必会】了解镜像的命名及导入导出镜像 1.3.1镜像的命名 一般情况下,镜像是按照如下格式命名的 服务器ip:端口/分类/镜像名:tag 如果不指明端口,默认是80,tag是latest,比如:192.168.26.101:5000,再比如hub.c.163.com/library/mysql:latest.分类也可以不写,比如d…...

黑马|最新AI+若依 |初识项目
本章主要内容是: 1.快速搭建了若依前后端项目在本地 2.实现了单表的增删改查快速生成 文章目录 介绍1.若依介绍2.若依的不同版本3.项目运行环境 初始化前后端项目1.下载若依项目2.初始化后端a.把表导入到数据库中b.更改application.yml文件 3.初始化前端a.安装依赖…...

ArrayList综合案例-模拟外卖中的商家系统
一案例要求: 二代码要求: package 重修;import java.util.ArrayList; import java.util.Random; import java.util.Scanner;import static java.lang.System.exit;public class first {public static void main(String[] args) {Scanner scnew Scanne…...

Postgres JSON字段怎么修改key的名称
场景 当你不小心将 key 的名称写错了(人员类别:多了一个冒号),或者想把引文改为中文(type改为类型) 大致思路是添加一个新的 key,然后将旧的 key 删除 sql语句 假如 JSON 列为 extra&#x…...

GStreamer学习5----probe数据探测
参考资料: gstreamer中如何使用probe(探针)获取帧数据_gstreamer 视频编码时获取视频关键帧信息-CSDN博客 Gstreamer中可以使用AppSink作为一个分支来查看管线中的数据,还可以使用probe去处理。 在GStreamer中,probe…...

Open3D 点云的圆柱形邻域搜索
目录 一、概述 1.1原理 1.2应用 二、代码实现 2.1完整代码 2.2程序说明 三、实现效果 3.1原始点云 3.2搜索后点云 一、概述 1.1原理 圆柱邻域搜索的基本思想是确定点云中的哪些点位于给定圆柱的内部。一个圆柱可以由以下几个参数定义: 中心点:…...

python如何设计窗口
PyQt是一个基于Qt的接口包,可以直接拖拽控件设计UI界面,下面我简单介绍一下这个包的安装和使用,感兴趣的朋友可以自己尝试一下: 1、首先,安装PyQt模块,这个直接在cmd窗口输入命令“pip install pyqt5”就行…...

C语言获取当前时间
一共有两段代码,一个是获取当前时间,一个是获取到现在的总毫秒数 求关注😄 互粉必回 获取当前时间 #include <stdio.h> #include <time.h> int main() { time_t rawtime; struct tm * timeinfo; char buffer[20]; // 获取当前…...

【每日一练】python三目运算符的用法
""" 三目运算符与基础运算的对比 """ a 1 b 2#1.基础if运算判断写法: if a > b:print("基础判断输出:a大于b") else:print("基础判断输出: a不大于b")#2.三目运算法判断:…...

CentOS 7.9 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路
众所周知,centos 7 在2024年6月30日,生命周期结束,官方不再进行支持维护,而很多环境一时之间无法完全更新替换操作系统,因此对于yum源还是需要的,特别是对于互联网环境来说,在线yum源使用方便很…...

Git 常用命令备忘
1、删除 (1)、git push origin --delete dev 删除远程分支 (2)、git branch -d dev 删除本地分支 git branch -D dev 强制删除本地分支 2、创建分支 (1)、git checkout -b dev 创建本地分支 (2)、git push origin dev 创建远程分支,此时本地分支与远程…...

Ubuntu24.04安装Skynet环境
安装依赖 sudo apt-get -y install gcc sudo apt-get -y install g sudo apt-get -y install make sudo apt-get install -y autoconf automake libtool sudo apt-get install -y git 或者可以用: sudo apt-get -y install gcc g make autoconf automake libtool…...

【C++】cout.self()函数
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文作为 JohnKi 学习笔记,借鉴了部分大佬案例 📢未来很长&#…...

VueQuill 富文本编辑器技术文档快速上手
VueQuill 富文本编辑器技术文档 1. 安装 VueQuill2. 配置 VueQuill3. 在组件中使用 VueQuill4. 配置选项5. 事件处理6. 数据格式7. 自定义工具栏8. 示例项目结构9. 常见问题如何添加图片上传功能?如何自定义编辑器主题? 在此之前,我讲解过关于…...

链式二叉树oj题
1.输入k ,找第k层节点个数 int TreeKlevel(BTNode*root,int k) {if (root NULL) {return 0;}if (k 1) {return 1;}return TreeKlevel(root->left, k - 1)TreeKlevel(root->right, k - 1); } 在这里我们要确定递归子问题,第一个就是NULL时返回&…...

Curator 是一个开源工具为 Elasticsearch 集群设计,用于自动化索引的维护任务。
Elasticsearch 使用 Curator 进行索引生命周期管理是一种常见的做法,Curator 是一个开源的 Python 工具,专为 Elasticsearch 集群设计,用于自动化索引的维护任务。以下是使用 Curator 进行索引生命周期管理的一些关键步骤和概念: …...

STM32-PWR和WDG看门狗
本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. PWR1.1 PWR简介1.2 电源框图1.3 上电复位和掉电复位1.4 可编程电压监测器1.5 低功耗模式1.6 模式选择1.7 睡眠模式1.8 停止模式1.9 待机模式1.10 库函数 2. WDG看门狗2.1 WDG简介2.2 IWDG框图2.3 IWDG键寄存器2.4 …...

C++循环队列 经典示例
循环队列(Circular Queue),又称环形缓冲区,是一种常用的数据结构,特别适用于资源有限的场合,比如操作系统中的任务调度、网络数据缓冲等。循环队列在数组的基础上实现,逻辑上首尾相连࿰…...

【程序大侠传】大表分库分表切换数据库类型导致pagehelper生成sql语法报错
前序 代码剑宗等级分明,其门下弟子等级划分如下: 入门弟子 刚刚拜入代码剑宗,学习基础编程语言和基本剑法(语法和基础概念)。他们的代码还显得生涩,但已经开始展现出对优雅代码的追求。 江湖小虾 初步掌握…...

7、Redis 队列与 Stream
引言 Redis 自 5.0 版本起引入了一种新的数据结构——Stream。这种数据结构不仅增加了 Redis 的数据处理能力,还使其在消息队列和数据流处理方面更具竞争力。Stream 提供了持久化、多播、消费组等功能,可以满足多种复杂的数据处理需求。 1. Redis Stre…...

FFT剖析
快速傅里叶变换 (fast Fourier transform) xn{x0,x1,…xn-1} (num:N) 旋转因子系数: d2pik/N 旋转因子 wk(n)(cos(dn)isin(dn)) n[0,N-1] y(k) sum(x(n)wk(n),0,N-1) y(k){y(0),y(1),…y(N-1)} 傅里叶级数 x(n)wk(n)的级数是: 1.d2pik/N 这个系数决…...

git clone报错RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly
问题描述 git clone github上的项目报错: RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly: CANCEL (err 8) 4796 bytes of body are still expected fetch-pack: unexpected disconnect while reading sideband packet early EOF fetch-pack: invalid index-pac…...

Apispec,一个用于生成 OpenAPI(Swagger)规范的 Python 库
目录 01什么是 Apispec? 为什么选择 Apispec? 安装与配置 02Apispec 的基本用法 生成简单的 API 文档 1、创建 Apispec 实例 2、定义 API 路由和视图 3、添加路径到 Apispec 集成 Flask 和 Apispec 1、安装…...

SpringBoot 自定义异常返回数据格式
Spring Boot 默认异常处理 当我们用 spring boot 开发接口是,当遇到异常时返回的数据格式是如下形式的 {"timestamp": "2024-07-06T02:48:55.79100:00","status": 404,"error": "Not Found","path":…...

【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!!
视频演示 【xinference】(15):在compshare上,使用docker-compose运行xinference和chatgpt-web项目,配置成功!!! 1,安装docker方法: #!/bin/shdistribution$(…...

【Unity 3D角色移动】
【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤,包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码: 步骤1:设置角色的物理属性 角色通常使用Character Co…...

个人视角,社会影响力:自媒体的魅力所在
随着数字化时代的到来,自媒体正成为信息传播领域的一场革命。个人视角与社会影响力的结合,赋予了自媒体独特的魅力。在传统媒体受限制的同时,自媒体为每个人提供了表达自己观点和思想的自由。个体的真实视角使得自媒体在信息传播中发挥着重要…...

算法训练营day70
题目1:108. 冗余连接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…...