Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图

news/2024/11/20 20:19:21/文章来源:https://www.cnblogs.com/feiyangqingyun/p/18345877

一、前言说明

最近花了半年时间,专门重构了整个地图组件,之前写的比较粗糙,有点为了完成功能而做的,没有考虑太多拓展性和易用性。这套地图自检这几年大量的实际项目和用户使用下来,反馈了不少很好的建议和意见,经过这几年的整理,刚好趁着近期经济下行严重,抽出时间把整个地图组件重构一下,首要的任务就是搞个地图基类,然后子类分别实现不同地图的具体功能。

实际编码过程中发现,无论是百度地图还是高德地图或者天地图等,能够提取出来的共性特别多,甚至很多处理函数都一样,所以在地图基类mapobjbase的基础上,又单独搞了个mapobjfun静态函数类,专门放置的通用的js函数处理,比如设置地图中心,获取和设置缩放级别,坐标字符串传坐标对象等。这样可以节约大量的重复代码,同时万一有相同的处理,还可以直接改动一处就所有地图内核都通用。

在整个组件的重构过程中,遇到过很多疑难杂症,当你把各个地图厂家提供的js开发手册全部实现一遍的时候,会发现大厂的程序员也不是很有水平,也存在不少的bug,我们能做的就是尽量规避这些bug,绕弯解决,而不是硬要在这种bug上死耗。比如一个办法就是自己写js去实现一部分的功能,这样就可以非常巧妙的避开,这在我们平时的编程过程中是一个很好的习惯。

二、功能特点

  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. 将core_map(地图组件)/core_webview(浏览器组件)这两个组件目录拷贝到你的项目目录,并在pro中填写引入代码加入到你的项目中。$$PWD/../表示上级目录。
include ($$PWD/../core_map/core_map.pri)
include ($$PWD/../core_webview/core_webview.pri)
  1. 在pro中启用地图内核,比如百度地图内核对应需要在pro文件中增加一行定义 DEFINES += baidux。
  2. 引入头文件。
#include "webview.h"
#include "mapbase.h"
  1. 新建一个窗体,上面放一个布局,推荐用表格布局 gridlayout,可以放多个浏览器控件。
  2. 实例化浏览器类和地图类。
//实例化浏览器控件
WebView *webView = new WebView(this);
//加入到布局
webView->setLayout(ui->gridLayout);
//实例化地图类/参数2表示何种地图内核
MapBase *mapObj = MapHelper::getMapObj(this, MapCore_BaiDu);
//传入网页控件用于执行函数
mapObj->setWebView(webView);
//加载地图
mapObj->load();
  1. 所有地图相关的函数接口在MapBase类中,可以打开mapbase.h查看具体说明。
  2. 地图中大部分的功能都是通过执行js函数来触发,比如添加标注、添加折线图等。这些必须严格按照提供的js函数名称和参数来执行。对应示例都提供了相关的调用方法。
  3. 部分函数接口。
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);
  1. 浏览器组件使用示例。
//实例化浏览器控件
WebView *webView = new WebView(this);
//加入到布局
webView->setLayout(ui->verticalLayout);
//打开网址
webView->load("https://www.xxx.com", "", "");

四、相关链接

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

五、效果图










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

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

相关文章

[WACV2022]Addressing out-of-distribution label noise in webly-labelled data

该论文考虑了一个现实的场景:数据集来自网络爬虫,即存在开集噪声OOD样本和闭集噪声ID样本。作者提出了一个简单但有效的策略:通过新设计的指标区分OOD样本,并对OOD样本软化(soften)弥补与干净样本的差距,该方法称为:Dynamic Softening of Out-of-distribution Samples …

异常处理

异常概述 程序中的异常: 在Java语言中,异常是指程序在运行期间发生的事件,它是导致程序中断运行的正常指令流。 例如,在算术运算中除数为0、数组越界、空指针异常等,这些事件的发生都会阻止程序的正常运行。 *示例:**演示除法运算*** public class MathCalc {public stat…

Matlab第一章

Matlab第一章 1.命令行窗口里写的命令,当文件关闭时命令行窗口和工作区内容消失。 2.想要保存代码,方法是: 新建脚本->写代码->保存->运行 3.脚本语言 (1)clear;清空工作区 clc;清空命令行窗口 x=20; y=30; x+y(2)clear; clc; x=20; y=30; x+y;如果x+y有分号则…

【题解】暑假集训CSP提高模拟14

目录Rank&挂分A. BA题目内容部分分10pts10+20pts正解思路代码B. BB题目内容部分分5pts正解思路代码C. BCD. BD Rank&挂分T4暴搜后来改了记搜,不知道哪里锅了,挂5pts。 A. BA 题目内容 现在有 \(m\) 块烙板,\(n\) 张饼,第 \(i\) 张饼需要烙 \(a_i\) 个单位时间,一张…

232Modbus转Profinet网关模块接液相柱塞泵与PLC通讯

本文介绍了232Modbus转Profinet网关(XD-PNR200)模块的使用步骤,包括硬件连接、软件配置和测试验证等环节,配置PLC与232Modbus转Profinet网关(XD-PNR200)IP,选功能码读写数据,分配设备名称并下载组态。测试通信后,可成功通讯。232Modbus转Profinet网关模块接液相柱塞泵…

挂载Ceph文件系统以及Ceph存储三副本特性展示

创建文件系统ceph fs volume create cephfs 挂载 CephFS 的常规先决条件 为客户端主机生成最小的 conf 文件并将其放在标准位置:mkdir -p -m 755 /etc/ceph ssh {user}@{mon-host} "sudo ceph config generate-minimal-conf" | sudo tee /etc/ceph/ceph.conf确保co…

nginx配置正向代理

1、下载源码包 # 地址http://nginx.org/download/2、下载ngx_http_proxy_connect_module补丁包 # 下载地址https://github.com/chobits/ngx_http_proxy_connect_module/archive/master.zip3、使用patch对源码包进行打补丁 # 先解压补丁包,得到的包名是ngx_http_proxy_connect_…

CSP14

暴力最高\(50\)吧,本地测试不太准跑得快的只得了\(10\)分,慢的却得了\(50\)分暴力 #include <bits/stdc++.h> #define pb push_back #define ll long long #define bs bitset<70> #define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); using na…

Goby漏洞发布 | CVE-2024-38856 Apache OFbiz /ProgramExport 命令执行漏洞【已复现】

漏洞名称:Apache OFbiz /ProgramExport 命令执行漏洞(CVE-2024-38856) English Name:Apache OFbiz /ProgramExport Command Execution Vulnerability(CVE-2024-38856) CVSS core: 9.0 漏洞描述: Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、…

LLM学习笔记-位置编码篇

在Transformer模型中,位置编码(Positional Encoding)的引入是为了补充自注意力机制(Self-Attention)在捕捉序列位置信息方面的不足。自注意力机制是Transformer的核心,但它对输入序列的位置信息并不敏感。具体来说,Transformer模型对输入序列中的每个元素进行处理时是并…

Profinet转Modbus网关运用在DCS系统中与变频器的通讯案例

在DCS(分散控制系统)系统中,Profinet转Modbus网关(XD-MDPN100)的应用是一个典型的工业自动化通讯案例,通过Profinet转Modbus网关(XD-MDPN100)将Profinet协议转换为Modbus协议,从而实现DCS系统与变频器之间的无缝通讯。一、案例背景 随着工业自动化程度的不断提高,DCS…

OpenAI 重大人事变动,联创加入死敌;阿里视频框架 Tora 操控物体运动轨迹丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…