天天看點

Qt編寫地圖綜合應用9-行政區劃

一、前言

行政區劃在地圖應用中非常有用,行政區劃是行政區域劃分的簡稱,是國家為了進行分級管理而實行的區域劃分,百度地圖提供的内置的函數類支援傳入行政區劃的名稱來擷取對應的邊界點集合,然後根據該集合來繪制點集合,最後将該點集合封閉連起來,就形成了行政區劃的輪廓圖了,使用下來發現地圖本身提供的函數可以支援到縣城,如果需要精确到鄉鎮那就需要其他辦法獲得,一種是直接加載事先準備好的鄉鎮的邊界點集合的js檔案,一種是在地圖上繪制多邊形,然後開啟可編輯屬性,人為的拖動邊界,最後擷取整個多邊形的邊界點集合即可,這種方法有個專業術語叫扒資料,在音樂界叫扒帶。其實方法一的前提也是按照方法二來擷取的,對于很小的應用數量不多的鄉鎮可以采用此法,如果需要很多省市的鄉鎮那就可能需要安排專人去擷取了。

二、功能特點

  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編寫地圖綜合應用9-行政區劃

五、相關代碼

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

    //定義數組存儲可拖動的邊界點
    list << QString("  var polygons = [];");

    //動态添加行政區劃
    list << QString("  function addBoundary(cityname, callfun, edit) {");
    //清除地圖覆寫物
    list << QString("    map.clearOverlays();");
    list << QString("    var bdary = new BMap.Boundary();");
    //調用内置的方法擷取城市的點集合
    list << QString("    bdary.get(cityname, function(rs) {");
    //行政區域的點有多少個
    list << QString("      var count = rs.boundaries.length;");
    list << QString("      if (count > 0) {");

    //彈出+調試輸出+回調輸出 行政區劃的邊界坐标點集合
    //list << QString("        alert(rs.boundaries);");
    //list << QString("        console.log(rs.boundaries);");
    list << QString("        if (callfun) {");
    list << QString("          window.%1('boundary', rs.boundaries);").arg(callFun);
    list << QString("        }");

    list << QString("        var pointArray = [];");
    list << QString("        for (var i = 0; i < count; i++) {");
    //建立多邊形覆寫物
    list << QString("          var ply = new BMap.Polygon(rs.boundaries[i], %1);").arg(property);
    //範圍可編輯,開啟以後可以拖動邊界然後可以重新輸出邊界點集合
    list << QString("          if (edit) {");
    list << QString("            ply.enableEditing();");
    list << QString("          }");
    //添加到多邊形數組,用來後邊擷取調整後的邊界數組
    list << QString("          polygons.push(ply);");
    //添加覆寫物
    list << QString("          map.addOverlay(ply);");
    list << QString("          pointArray = pointArray.concat(ply.getPath());");
    list << QString("        }");

    //調整視野自适應行政區劃區域
    list << QString("        map.setViewport(pointArray);");
    list << QString("      }");
    list << QString("    });");
    list << QString("  }");
}           

繼續閱讀