Qt編寫地圖實(shí)現(xiàn)海量點(diǎn)位標(biāo)注
一、前言
海量點(diǎn)位標(biāo)注的出現(xiàn),是為了解決普通設(shè)備點(diǎn)超過幾百個(gè)性能極速降低的問題,普通的marker標(biāo)注由于采用的是對(duì)象的形式存在于地圖中,數(shù)量越多,占用內(nèi)存特別大,超過1000個(gè)點(diǎn)性能極其糟糕,哪怕是用點(diǎn)聚合,拖動(dòng)地圖的時(shí)候更是一卡卡,簡(jiǎn)稱卡成屎,加載的時(shí)候也是慢成一坨屎,所以迫切需要一個(gè)其他的形式來支持成千上萬的海量點(diǎn),最好的方式就是繪制圖形,精簡(jiǎn)掉很多屬性,比如自定義圖標(biāo)、旋轉(zhuǎn)角度、單擊動(dòng)畫跳動(dòng)等一堆特性,這些其實(shí)大部分時(shí)候是不需要的,在海量點(diǎn)的場(chǎng)景下,完全可以犧牲這些特性,然后采用最簡(jiǎn)單的繪制圖形的形式來繪制海量點(diǎn),提供最基礎(chǔ)的一個(gè)功能就是識(shí)別單擊了哪個(gè)點(diǎn)就行。
海量點(diǎn)位標(biāo)注核心就是采用地圖內(nèi)置的js對(duì)象類PointCollection,傳入點(diǎn)位的經(jīng)緯度坐標(biāo)集合,同時(shí)還可以統(tǒng)一設(shè)置點(diǎn)的顏色、點(diǎn)的大小、點(diǎn)的形狀,通過addEventListener監(jiān)聽單擊事件判斷單擊了哪個(gè)點(diǎn),最后通過添加覆蓋物的形式將一個(gè)海量點(diǎn)覆蓋物添加到地圖中。
尺寸參數(shù):
- 1 = BMAP_POINT_SIZE_TINY 2px*2px
- 2 = BMAP_POINT_SIZE_SMALLER 4px*4px
- 3 = BMAP_POINT_SIZE_SMALL 8px*8px
- 4 = BMAP_POINT_SIZE_NORMAL 10px*10px 默認(rèn)值
- 5 = BMAP_POINT_SIZE_BIG 16px*16px
- 6 = BMAP_POINT_SIZE_BIGGER 20px*20px
- 7 = BMAP_POINT_SIZE_HUGE 30px*30px
形狀參數(shù):
- 1 = BMAP_POINT_SHAPE_CIRCLE 圓形 默認(rèn)值
- 2 = BMAP_POINT_SHAPE_STAR 星形
- 3 = BMAP_POINT_SHAPE_SQUARE 方形
- 4 = BMAP_POINT_SHAPE_RHOMBUS 菱形
- 5 = BMAP_POINT_SHAPE_WATERDROP水滴
二、功能特點(diǎn)
定時(shí)器排隊(duì)下載省市輪廓圖點(diǎn)坐標(biāo)集合存儲(chǔ)到JS文件。
支持一個(gè)行政區(qū)域多個(gè)不規(guī)則區(qū)域下載。
自動(dòng)計(jì)算行政區(qū)域的下載輪廓數(shù)量。
可精確選擇省份、市區(qū)、縣城,也可直接輸入行政區(qū)域的名稱。
可以設(shè)置下載間隔、隨時(shí)開始下載和停止下載。
提供編輯邊界功能,可以直接在地圖上編輯好不規(guī)則區(qū)域的點(diǎn)集合,然后獲取邊界點(diǎn)集合數(shù)據(jù),這個(gè)可以用來自己繪制區(qū)域拿到數(shù)據(jù),比如某個(gè)鄉(xiāng)鎮(zhèn)甚至某個(gè)小區(qū)的行政區(qū)域數(shù)據(jù),很牛逼。
三、體驗(yàn)地址
體驗(yàn)地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg 提取碼:uyes 文件名:bin_map.zip
國(guó)內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
國(guó)際站點(diǎn):https://github.com/feiyangqingyun
四、效果圖
五、相關(guān)代碼
void frmMapMarkers::addMarker() { //先清空原有的所有覆蓋物包括標(biāo)注點(diǎn) runJs("deleteOverlay('')"); //取出定位點(diǎn)經(jīng)緯度大值 QString point = ui->txtPointLeftBottom->text(); QStringList list = point.split(","); double lng = list.first().toDouble(); double lat = list.last().toDouble(); //經(jīng)緯度小數(shù)點(diǎn)值最大值 float dotLng = 0.015; float dotLat = 0.011; //限定最大數(shù)量 int index = ui->cboxType->currentIndex(); int count = ui->cboxCount->currentText().toInt(); int maxCount = 300; if (index == 1) { maxCount = 1000; } else if (index == 2) { maxCount = 50000; } if (count > maxCount) { QString info = QString("由于官方該方法性能有限, 建議數(shù)量不要超過 %1 !").arg(maxCount); QUIHelper::showMessageBoxError(info); return; } //不同類型不同處理,隨機(jī)模擬經(jīng)緯度,可以自行調(diào)整范圍值 if (index == 0) { //添加標(biāo)注點(diǎn) for (int i = 0; i < count; ++i) { QStringList points = QUIHelper::getRandPoint(1, lng, lat, dotLng, dotLat); QString js = QString("addMarker('', '', '', '', 30, '%1')").arg(points.first()); runJs(js); } } else if (index == 1) { //添加點(diǎn)聚合 QStringList points = QUIHelper::getRandPoint(count, lng, lat, dotLng, dotLat); QString js = QString("addMarkerClusterer('%1')").arg(points.join("|")); runJs(js); } else if (index == 2) { //添加海量點(diǎn) QStringList points = QUIHelper::getRandPoint(count, lng, lat, dotLng, dotLat); QString js = QString("addPointCollection('%1', '#A279C5')").arg(points.join("|")); runJs(js); } } void frmMapMarkers::on_btnDo_clicked() { //自動(dòng)獲取當(dāng)前區(qū)域邊界 runJs("getBounds()"); }
以上就是Qt編寫地圖實(shí)現(xiàn)海量點(diǎn)位標(biāo)注的詳細(xì)內(nèi)容,更多關(guān)于Qt地圖 海量點(diǎn)位標(biāo)注的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于C語言中弱符號(hào)與弱引用的實(shí)際應(yīng)用問題
在編碼過程中,我們經(jīng)常遇到符號(hào)重定義的錯(cuò)誤問題,本文通過實(shí)例代碼展示給大家介紹了C語言弱符號(hào)與弱引用的實(shí)際應(yīng)用問題,一起看看吧2021-09-09C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下2023-11-11使用C語言的fork()函數(shù)在Linux中創(chuàng)建進(jìn)程的實(shí)例講解
這篇文章主要介紹了使用C語言的fork()函數(shù)在Linux中創(chuàng)建進(jìn)程的實(shí)例講解,fork在父進(jìn)程下創(chuàng)建出的子進(jìn)程可以與父進(jìn)程一起來多進(jìn)程運(yùn)行同一個(gè)程序,需要的朋友可以參考下2016-06-06C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)
使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2023-01-01