Qt/C++編寫地圖應用/離線地圖下載/路徑規劃/軌跡回放/海量點/坐標轉換

一、前言說明

這個地圖組件寫了很多年了,最初設計的比較粗糙,最開始只是為了滿足項目需要,并沒有考慮太多拓展性,比如最初都是按照百度地圖寫死在代碼中,經過這幾年大量的現場實際應用,以及大量的用戶提出的改進意見,逐漸萌生了徹底重新編寫對應地圖相關的代碼,比如基類子類的設計,各種功能接口通過js函數交互,而不是一堆代碼寫在網頁中。

之前的地圖示例寫的比較粗糙,想到什么寫到什么,功能堆積比較嚴重,一直在做加法,導致越發臃腫,包括界面上的功能演示也比較不直觀,所以這次特意花點時間全部重構,包括所有示例都重構,對于過多的示例演示,單獨起了個目錄存放一個個小示例的代碼,拆分開來,使得該分組的功能學習起來非常的方便,之前是一堆示例代碼堆積在一個類中,找起來也要費時間,程序員最煩的就是一個代碼文件中特別多的代碼,能夠做到分組拆分就拆分。

二、功能特點

  1. 支持多種地圖內核,默認采用百度地圖。
  2. 同時支持在線地圖和離線地圖兩種模式,離線地圖方便在不聯網的場景中使用。
  3. 支持各種地圖控件的啟用,比如地圖導航、地圖類型、縮略圖、比例尺、全景導航、實時路況、繪圖工具、結果面板等。
  4. 支持多種地圖功能的動態啟用禁用,比如地圖拖曳、鍵盤操作、滾輪縮放、雙擊放大、地圖測距。
  5. 提供眾多js函數接口用于交互,參數極其豐富,能夠想到的應用場景需求都有。
  6. 統一的信號槽機制,地圖中的結果統一信號發送出去,收到后根據type類型區分。
  7. 支持地圖交互,比如鼠標按下獲取對應位置的經緯度。單擊標注點彈出對應點的信息。
  8. 支持添加標注、刪除標注、移動標注、清空標注。
  9. 標注點可以指定圖標圖片,可以設置旋轉角度,帶富文本提示信息。
  10. 標注點事件支持單擊發信號通知和自己彈框顯示信息。
  11. 提供地址轉坐標和坐標轉地址接口。
  12. 支持各種圖形繪制,包括折線圖、多邊形、矩形、圓形、弧線等。
  13. 可顯示懸浮的繪圖工具欄,直接在地圖上劃線、標注點、矩形、圓形等。
  14. 支持各種區域搜索,比如矩形區域、圓形區域,可以按照關鍵字匹配將搜索結果顯示在地圖中。
  15. 可動態添加離線的行政區邊界點數據。可以搜索行政區劃并獲取該區域的邊界點數據。數據可以保存到文件以便離線使用。
  16. 支持點聚合功能,多個小標注點合并到一個大標注點,防止點密集導致交互不友好。
  17. 可以添加海量點,每個點都可以單擊獲取對應坐標和信息。
  18. 所有的覆蓋物信息比如標注點、矩形、多邊形、折線圖等,都可以主動獲取。
  19. 支持路徑規劃,支持公交路線、自駕路線、步行路線、騎行路線,不同查詢支持不同策略,可選最少時間、最少換乘、不走高架等。
  20. 路徑規劃結果顯示在地圖中,也可以獲取到路徑點坐標集合。這個數據可以保存到文件,以便發給機器人或者無人機做導航用來軌跡移動。
  21. 可以設置不同的地圖視圖比如街道圖、衛星圖、混合圖。
  22. 可以設置不同的樣式,比如午夜藍、青草綠等樣式風格。
  23. 提供離線地圖下載模塊,可以選擇不同的地圖內核比如百度地圖或者谷歌地圖,不同的地圖類型比如下載街道圖還是衛星圖,不同的地圖層級,多線程極速下載。
  24. 表格行實時顯示對應的瓦片下載進度,有下載超時時間,重試次數,每個瓦片下載完成都發送信號通知,參數包括下載用時。
  25. 提供省市輪廓圖下載模塊,自動下載各個地區的輪廓圖,保存到腳本文件或者文本文件。
  26. 支持手動調整不同區域的輪廓邊界,調整后可以主動獲取調整后的邊界點集合。
  27. 提供動態點位示例,手動在地圖上選點并添加標注,附帶自定義的信息比如速度和時間等。
  28. 提供海量點位示例,批量添加標注點、點聚合、海量點。用于測試環境中支持的最大點位性能。
  29. 支持GPS坐標轉換,同時提供了在線和離線兩種方式。一般設備接收到的是標準的GPS坐標,在百度地圖上需要轉換成百度的坐標。
  30. 提供動態軌跡示例,在地圖上鼠標按下選擇起點和終點后,查詢路線,獲取路徑軌跡點,定時器模擬軌跡移動。可以篩選數據將過多的路徑點篩選到設定的點數。
  31. 提供軌跡回放示例,按照指定的軌跡點列表回放,也可以導入軌跡點數據進行回放。同時支持在街道圖、衛星圖、混合圖中回放軌跡。
  32. 提供省市區域地圖示例,采用echart組件,同時支持閃爍點圖、遷徙圖、區域地圖、世界地圖、儀表盤等。可以設置標題、提示信息、背景顏色、文字顏色、線條顏色、區域顏色等各種顏色。
  33. 省市區域地圖示例,內置世界地圖、全國地圖、省份地圖、地區地圖,可以精確到縣,所有地圖全部離線使用。可設置城市的名稱、值、經緯度集合。
  34. 內置通用瀏覽器組件,同時支持webkit/webengine/miniblink等內核。提供網頁控件示例,演示打開網頁和本地網頁文件。
  35. 支持任意Qt版本、任意系統、任意編譯器。

三、代碼使用

  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.pswp.cn/diannao/43119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43119.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43119.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django 新增數據 save()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

BFC 是什么?

BFC 是塊級格式化上下文(Block Formatting Context)的縮寫,是 CSS 中一個重要的概念,用于控制塊級盒子的布局及浮動元素的交互。BFC 是一個獨立的渲染區域,內部的塊級盒子會按照特定的規則進行布局,不會影響…

軟件工程(上)

目錄 軟件過程模型(軟件開發模型) 瀑布模型 原型模型 V模型 構件組裝模型 螺旋模型(原型瀑布) 基于構件的軟件工程(CBSE) 快速應用開發模型(RAD) 統一過程(UP&a…

Linux學習看這一篇就夠了,超超超牛的Linux基礎入門

引言 小伙伴們,不管是學習c還是學習其他語言在我們學的路上都繞不過操作系統,而且,老生常談的Linux更是每個計算機人的必修,那么我們對Linux的了解可能只是從別人那聽到的簡單的這個系統很牛,巴拉巴拉的,但…

大模型日報 2024-07-08

大模型日報 2024-07-08 大模型資訊 Anthropic CEO:大模型訓練成本暴漲,2027年將達1000億美元! Anthropic首席執行官表示,當前AI模型訓練成本是10億美元,未來三年,這個數字可能會上升到100億美元甚至1000億美…

GitLab管理員常用配置及設置匯總

? 之前在 虛擬機Ubuntu 22.04上搭建GitLab操作步驟 上介紹了在Ubuntu 22.04上如何搭建社區版的GitLab,這里整理下作為GitLab管理員時在搭建完GitLab CE后,如何對其進行配置或設置 更改倉庫存儲位置:切換到root用戶下操作 默認存放位置&…

SSL 證書

自動獲取 Lets Encrypt 免費證書 (適用于 Linux 系統) 安裝 Certbot sudo apt-get update sudo apt-get install certbot python3-certbot-nginx # Nginx 服務器 sudo apt-get install certbot python3-certbot-apache # Apache 服務器 獲取和安裝證…

小米rdemi紅米ax3000t刷機 20240707最新配套完整程序整理合集

小米rdemi紅米ax3000t刷機程序地址: https://www.123pan.com/s/LA1bVv-EOzVv.html 小米路由器SSH密碼計算器 https://www.1234f.com/fuwu/ax3000t/ 最新更新地址:https://www.1234f.com/fuwu/openwrt/ 依次輸入如下命令: curl -X POST h…

Leetcode 295.數據流的中位數

295.數據流的中位數 問題描述 中位數是有序整數列表中的中間值。如果列表的大小是偶數,則沒有中間值,中位數是兩個中間值的平均值。 例如 arr [2,3,4] 的中位數是 3 。例如 arr [2,3] 的中位數是 (2 3) / 2 2.5 。 實現 MedianFinder 類: Media…

算法013:水果成籃

水果成籃. - 備戰技術面試?力扣提供海量技術面試資源,幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/fruit-into-baskets/ 這道題題目很長,仔細閱讀過后,我們其實可以簡化成&#xff…

MySQL 9.0新特性:向量存儲

MySQL 9.0 正式版已經發布,其中一個亮點就是向量(VECTOR)數據類型的支持,本文給大家詳細介紹一下這個新功能。 向量類型 MySQL 9.0 增加了一個新的向量數據類型:VECTOR。它是一種可以存儲 N 個數據項的數據結構&…

Redis Stream:實時數據流的處理與存儲

Redis Stream:實時數據流的處理與存儲 引言 在當今數據驅動的世界中,實時數據處理和存儲成為了許多應用的核心需求。Redis Stream作為一種新興的數據結構,為Redis帶來了強大的流處理能力。本文將深入探討Redis Stream的特點、使用場景以及如何高效地利用它來處理實時數據流…

聚焦數字創新,定義影像未來

國際數字影像產業園在明確產業定位與發展方向時,應聚焦于數字影像、文創、媒體等新興產業領域,以技術創新為核心動力、產業升級為保障、市場拓展為途徑、國際化發展為方向,推動園區的持續健康發展。 作為園區的核心產業,數字影像產…

python socks5代理的使用

需要安裝依賴 1、解決方法1 In order to make requests use socks proxy, you need to install it with it’s dependency. pip install requests[socks]2、解決方法2 pip install PySocks

第二證券股市知識:股票填權是怎么回事?利好還是利空?

1、股票填權的含義 股票填權是指在除權除息之后的一段時刻內,假設多數投資者看好該個股,股票的價格超過除權除息的基準價就叫做填權。上市公司假設能持續分紅,就會向市場傳遞積極信號,招引更多投資者買入,越來越多的投…

使用Livox-Mid360激光雷達,復現FAST_LIO(保姆級教程)

前面我已經完成了mid360激光雷達的驅動安裝,octomap的復現,昨天我去把這倆在正式環境中實測了一下,效果不好,走廊轉角沒建出來,我查了一下,應該是TF的原因,但這部分我還不太懂,看到有…

云計算【第一階段(28)】DNS域名解析服務

一、DNS解析的定義與作用 1.1、DNS解析的定義 DNS解析(Domain Name System Resolution)是互聯網服務中的一個核心環節,它負責將用戶容易記住的域名轉換成網絡設備能夠識別和使用的IP地址。一般來講域名比 IP 地址更加的有含義、也更容易記住…

2024世界人工智能大會:deepin引領AI與操作系統融合新時代

內容來源:deepin(深度)社區 7月4日,WAIC 2024在上海拉開帷幕。大會圍繞核心技術、智能終端、應用賦能三大板塊,聚焦大模型、算力、機器人、自動駕駛等重點領域,集中展示一批“人工智能”創新應用最新成果。…

【web前端HTML+CSS+JS】--- JS學習筆記03

一、JS介紹 可以在前端頁面上進行邏輯處理,來解決表單的驗證等問題,提升效率,直接在前端提示問題,減少服務器壓力 應用1:可以做靜態驗證和動態驗證(進行異步請求) 應用2:可以解析后…

monad理解

每個學習monad的人都要寫一份自己理解的monad。然后還是包括自己沒人能看到自己在寫啥,而且大部分寫的還是錯誤的。 距離學習monad有接近2周了,已經挺模糊了。 monad我理解有兩個基本作用: 1. 能夠對全部的返回值做鏈式調用。只能封裝成mona…