天天看點

Qt編寫地圖綜合應用12-路線查詢

一、前言

路線查詢的功能隻有線上地圖才有,因為這個路線規劃需要經常更新的,這個資料同步需要大量的人力物力去統計,是以這玩意必須放在伺服器端,就算是類似于手機端一樣的放在本地離線,也需要隔一段時間更新的,不然資料很可能不正确。路線查詢也叫出行規劃,基本上分成兩大類,一種是開車的一種是不開車的,其中開車的又有多種政策供選擇比如最少時間、最短距離、避開高速等,不開車的也有多種政策供選擇比如最少時間、最少換乘、最少步行、不乘地鐵。路線查詢的功能,現在貌似預設隻支援經緯度作為參數了,之前是可以直接填入中文名稱地名的比如門牌号之類的,這種位址解析或者逆解析的功能需要去背景用對應的秘鑰去開通才行。

昨天又重新整理了路徑規劃這個功能,發現官網增加了步行+騎行兩種路徑規劃方式,是以越發覺得放在伺服器上運作的優點特别多,可以不斷的優化更新伺服器程式,這樣就做到了使用者無感覺無影響,不知不覺中就用上了最新的程式和服務,是以程式界開發中就經常遇到要用戶端還是服務端的處理選擇,當然用戶端也有用戶端的的好處。

二、功能特點

  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編寫地圖綜合應用12-路線查詢

五、相關代碼

void MapBaiDu::addRoute(QStringList &list)
{
    if (!startAddr.isEmpty()) {
        //位址中帶了 , 表示采用的經緯度形式
        if (startAddr.contains(",")) {
            list << QString("  var p1 = new BMap.Point(%1);").arg(startAddr);
            list << QString("  var p2 = new BMap.Point(%1);").arg(endAddr);
        } else {
            list << QString("  var p1 = \"%1\";").arg(startAddr);
            list << QString("  var p2 = \"%1\";").arg(endAddr);
        }

        //0-公交 1-駕車 2-步行 3-騎行
        if (routeType == 0) {
            list << QString("  var transit = new BMap.TransitRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType);
            list << QString("  transit.search(p1, p2);");
        } else if (routeType == 1) {
            list << QString("  var driving = new BMap.DrivingRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType);
            list << QString("  driving.search(p1, p2);");
        } else if (routeType == 2) {
            list << QString("  var walking = new BMap.WalkingRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType);
            list << QString("  walking.search(p1, p2);");
        } else if (routeType == 3) {
            list << QString("  var riding = new BMap.RidingRoute(map, {renderOptions:{map:map, panel:\"result\"}, policy:%1});").arg(policyType);
            list << QString("  riding.search(p1, p2);");
        }
    }
}           

繼續閱讀