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其它相關文章!

推薦閱讀: