天天看點

Qt編寫地圖綜合應用10-點聚合

一、前言

點聚合在地圖相關應用中比較常用,比如在地圖上查詢結果通常以标記點的形式展現,但是如果标記點較多,不僅會大大增加用戶端的渲染時間,讓用戶端變得很卡,而且會讓人産生密集恐懼症,密密麻麻的一大堆點擠在一起。為了解決這一問題,我們需要一種手段能在使用者有限的可視區域範圍内,利用最小的區域展示出最全面的資訊,而又不産生重疊覆寫,這個東西專業名詞就叫點聚合,百度地圖内置了方法可以設定點聚合BMapLib.MarkerClusterer,注意這個方法在BMapLib中而不是在BMAP中,是以要使用點聚合的話需要引入這個MarkerClusterer_min.js類檔案,不然是沒用的,這個很容易忽視,因為絕大部分類和方法都是在BMap中都有。

二、功能特點

  1. 同時支援線上地圖和離線地圖兩種模式。
  2. 同時支援webkit核心、webengine核心、IE核心。
  3. 支援設定多個标注點,資訊包括名稱、位址、經緯度。
  4. 可設定地圖是否可單擊、拖動、滑鼠滾輪縮放。
  5. 可設定協定版本、秘鑰、主題樣式、中心坐标、中心城市、地理編碼位置等。
  6. 可設定地圖縮放比例和級别,縮略圖、比例尺、路況資訊等控件的可見。
  7. 支援地圖互動,比如滑鼠按下擷取對應位置的經緯度。
  8. 支援查詢路線,可設定起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
  9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
  10. 可設定行政區劃,指定某個城市區域繪制圖層,線上地圖自動輸出行政區劃邊界點集合到js檔案給離線地圖使用。
  11. 可靜态或者動态添加多個覆寫物。支援點、折線、多邊形、矩形、圓形、弧線、點聚合等。
  12. 函數接口友好和統一,使用簡單友善,就一個類。
  13. 支援js動态互動添加點、删除點、清空點、重置點,不需要重新整理頁面。
  14. 支援任意Qt版本、任意系統、任意編譯器。

三、體驗位址

  1. 體驗位址: https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ 提取碼:1jkp 檔案名:bin_map.zip
  2. 國内站點: https://gitee.com/feiyangqingyun
  3. 國際站點: https://github.com/feiyangqingyun
  4. 個人首頁: https://blog.csdn.net/feiyangqingyun
  5. 知乎首頁: https://www.zhihu.com/people/feiyangqingyun/

四、效果圖

五、相關代碼

void MapBaiDu::getMarkers(QStringList &list)
{
    //通用多個點坐标轉換成 BMap.Marker 對象
    //坐标格式 121.414,31.1828|121.414,31.1838|121.416,31.1838
    list << QString("  function getMarkers(points) {");
    list << QString("    var markers = []");
    list << QString("    var listPoint = points.split(\"|\");");
    list << QString("    var len = listPoint.length");
    list << QString("    for (var i = 0; i < len; i++) {");
    list << QString("      var list = listPoint[i].split(\",\");");
    list << QString("      var pot = new BMap.Point(list[0], list[1]);");
    list << QString("      var marker = new BMap.Marker(pot);");
    list << QString("      markers.push(marker);");
    list << QString("    }");
    list << QString("    return markers;");
    list << QString("  }");
}

void MapBaiDu::addMarkerClusterer(QStringList &list)
{
    list << QString("  function addMarkerClusterer(points) {");
    list << QString("    var markers = getMarkers(points);");
    //最簡單的用法,生成一個marker數組,然後調用markerClusterer類即可
    list << QString("    var markerClusterer = new BMapLib.MarkerClusterer(map, {markers:markers});");
    list << QString("  }");
}           

繼續閱讀