Qt編寫地圖實現海量點位標註
一、前言
海量點位標註的出現,是為瞭解決普通設備點超過幾百個性能極速降低的問題,普通的marker標註由於采用的是對象的形式存在於地圖中,數量越多,占用內存特別大,超過1000個點性能極其糟糕,哪怕是用點聚合,拖動地圖的時候更是一卡卡,簡稱卡成屎,加載的時候也是慢成一坨屎,所以迫切需要一個其他的形式來支持成千上萬的海量點,最好的方式就是繪制圖形,精簡掉很多屬性,比如自定義圖標、旋轉角度、單擊動畫跳動等一堆特性,這些其實大部分時候是不需要的,在海量點的場景下,完全可以犧牲這些特性,然後采用最簡單的繪制圖形的形式來繪制海量點,提供最基礎的一個功能就是識別單擊瞭哪個點就行。
海量點位標註核心就是采用地圖內置的js對象類PointCollection,傳入點位的經緯度坐標集合,同時還可以統一設置點的顏色、點的大小、點的形狀,通過addEventListener監聽單擊事件判斷單擊瞭哪個點,最後通過添加覆蓋物的形式將一個海量點覆蓋物添加到地圖中。
尺寸參數:
- 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 默認值
- 5 = BMAP_POINT_SIZE_BIG 16px*16px
- 6 = BMAP_POINT_SIZE_BIGGER 20px*20px
- 7 = BMAP_POINT_SIZE_HUGE 30px*30px
形狀參數:
- 1 = BMAP_POINT_SHAPE_CIRCLE 圓形 默認值
- 2 = BMAP_POINT_SHAPE_STAR 星形
- 3 = BMAP_POINT_SHAPE_SQUARE 方形
- 4 = BMAP_POINT_SHAPE_RHOMBUS 菱形
- 5 = BMAP_POINT_SHAPE_WATERDROP水滴
二、功能特點
定時器排隊下載省市輪廓圖點坐標集合存儲到JS文件。
支持一個行政區域多個不規則區域下載。
自動計算行政區域的下載輪廓數量。
可精確選擇省份、市區、縣城,也可直接輸入行政區域的名稱。
可以設置下載間隔、隨時開始下載和停止下載。
提供編輯邊界功能,可以直接在地圖上編輯好不規則區域的點集合,然後獲取邊界點集合數據,這個可以用來自己繪制區域拿到數據,比如某個鄉鎮甚至某個小區的行政區域數據,很牛逼。
三、體驗地址
體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 文件名:bin_map.zip
國內站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
四、效果圖
五、相關代碼
void frmMapMarkers::addMarker() { //先清空原有的所有覆蓋物包括標註點 runJs("deleteOverlay('')"); //取出定位點經緯度大值 QString point = ui->txtPointLeftBottom->text(); QStringList list = point.split(","); double lng = list.first().toDouble(); double lat = list.last().toDouble(); //經緯度小數點值最大值 float dotLng = 0.015; float dotLat = 0.011; //限定最大數量 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("由於官方該方法性能有限, 建議數量不要超過 %1 !").arg(maxCount); QUIHelper::showMessageBoxError(info); return; } //不同類型不同處理,隨機模擬經緯度,可以自行調整范圍值 if (index == 0) { //添加標註點 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) { //添加點聚合 QStringList points = QUIHelper::getRandPoint(count, lng, lat, dotLng, dotLat); QString js = QString("addMarkerClusterer('%1')").arg(points.join("|")); runJs(js); } else if (index == 2) { //添加海量點 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() { //自動獲取當前區域邊界 runJs("getBounds()"); }
以上就是Qt編寫地圖實現海量點位標註的詳細內容,更多關於Qt地圖 海量點位標註的資料請關註WalkonNet其它相關文章!