天天看點

Qt編寫地圖綜合應用11-動态添加

一、前言

在添加裝置點或者區域形狀的時候,會考慮是直接靜态的方式寫入到網頁中加載,還是動态js函數異步加載的方式,這個需要根據現場的實際需求來,如果隻需要一次加載的話建議靜态即可,如果運作期間還需要動态添加的話就采用動态的js函數互動的方法,絕大部分場景都是動态添加,畢竟這個是異步執行的,而且比較靈活,靜态的方式寫入到網頁中加載開起來比較傻,資料都在網頁中可以看到了,沒有什麼保密性可言,在前面兩篇文章做行政區劃和點聚合的時候,也是兩種方法都支援,具展現場怎麼友善怎麼來。

動态添加的話,相當于要把官網那些demo,都做成js函數調用的形式,官網的那些demo主要都是以靜态寫死的方式作為示範的,為了更直覺更容易了解,如果是Qt程式員或者c++的程式,需要花一丢丢時間才能學會如何将其封裝成js函數調用,畢竟在js中沒有資料類型的概念,統一都是var,相當于Qt中的QVariant類型,所謂萬物皆var,數組和數組對象直接用[]搞定,着實相當友善。

二、功能特點

  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/

四、效果圖

Qt編寫地圖綜合應用11-動态添加

五、相關代碼

void MapBaiDu::addPolyline(QStringList &list)
{
    //覆寫物通用屬性,包括顔色線條粗細等,可以自行更改
    QString property = getOverlayProperty();

    //動态添加折線
    list << QString("  function addPolyline(points) {");
    list << QString("    var pts = getPoints(points);");
    list << QString("    var polyline = new BMap.Polyline(pts, %1);").arg(property);
    list << QString("    map.addOverlay(polyline);");
    list << QString("  }");
}

void MapBaiDu::addPolygon(QStringList &list)
{
    //覆寫物通用屬性,包括顔色線條粗細等,可以自行更改
    QString property = getOverlayProperty();

    //動态添加多邊形
    list << QString("  function addPolygon(points) {");
    list << QString("    var pts = getPoints(points);");
    list << QString("    var polygon = new BMap.Polygon(pts, %1);").arg(property);
    list << QString("    map.addOverlay(polygon);");
    list << QString("  }");
}

void MapBaiDu::addRectangle(QStringList &list)
{
    //覆寫物通用屬性,包括顔色線條粗細等,可以自行更改
    QString property = getOverlayProperty();

    //動态添加矩形
    list << QString("  function addRectangle(points) {");
    list << QString("    var listPoint = points.split(\"|\");");
    list << QString("    if (listPoint.length != 2) {");
    list << QString("      return;");
    list << QString("    }");

    //将兩個坐标拆分成四個點
    list << QString("    var list1 = listPoint[0].split(\",\");");
    list << QString("    var list2 = listPoint[1].split(\",\");");
    list << QString("    var ptStart = new BMap.Point(list1[0], list1[1]);");
    list << QString("    var ptEnd = new BMap.Point(list2[0], list2[1]);");
    list << QString("    var pt1 = new BMap.Point(ptStart.lng, ptStart.lat);");
    list << QString("    var pt2 = new BMap.Point(ptEnd.lng, ptStart.lat);");
    list << QString("    var pt3 = new BMap.Point(ptEnd.lng, ptEnd.lat);");
    list << QString("    var pt4 = new BMap.Point(ptStart.lng, ptEnd.lat);");
    list << QString("    var rectangle = new BMap.Polygon([pt1,pt2,pt3,pt4], %1);").arg(property);
    list << QString("    map.addOverlay(rectangle);");
    list << QString("  }");
}

void MapBaiDu::addCircle(QStringList &list)
{
    //覆寫物通用屬性,包括顔色線條粗細等,可以自行更改
    QString property = getOverlayProperty();

    //動态添加圓形
    list << QString("  function addCircle(points, radius) {");
    list << QString("    var listPoint = points.split(\"|\");");
    list << QString("    var list = listPoint[0].split(\",\");");
    list << QString("    var ptCenter = new BMap.Point(list[0], list[1]);");
    list << QString("    var circle = new BMap.Circle(ptCenter, radius, %1);").arg(property);
    list << QString("    map.addOverlay(circle);");
    list << QString("  }");
}           

繼續閱讀