欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt編寫地圖之實現(xiàn)覆蓋物坐標和搜索

 更新時間:2022年03月14日 08:28:58   作者:feiyangqingyun  
地圖應(yīng)用中經(jīng)常會需要有覆蓋物坐標和搜索的功能,本文將利用Qt實現(xiàn)這一功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

一、前言

地圖應(yīng)用中有時候需要開啟懸浮工具欄,用戶可以直接在地圖上繪制矩形、多邊形、圓形、線條等,于是需要提供一個函數(shù)接口,能夠獲取到用戶繪制的這些圖形形狀對應(yīng)的信息。比如坐標點、圓形的中心點和半徑、所有圖形的路徑Path坐標點集合,這些信息都是以經(jīng)緯度坐標的形式。一般封裝的類似功能的js函數(shù)一般有三種要求,第一種傳入空值則表示找出所有覆蓋物,第二種傳入類型則找出所有該類型的覆蓋物比如矩形,第三種傳入對象名稱則找出符合該名稱的。從一堆覆蓋物中找到符合指定類型的覆蓋物,這個對于初學者是難點,可以通過map.getOverlays()拿到所有的覆蓋物,最開始我想的策略是如何拿到對應(yīng)一個覆蓋物的類型,后面發(fā)現(xiàn)toString()可以獲取到[object Marker] [object Circle] [object Overlay]字樣,于是針對這個去過濾類型,后面發(fā)現(xiàn)js通用關(guān)鍵字instanceof也可以實現(xiàn)這個功能,比如if (overlay instanceof BMap.Circle)就可以判斷當前覆蓋物是否是圓形。

地圖模塊中很多個地方都用到了將getPath函數(shù)獲取到的路徑轉(zhuǎn)換成坐標點集合字符串傳出去,比如發(fā)給Qt程序處理,所以封裝了一個通用的轉(zhuǎn)換函數(shù),專門將路徑轉(zhuǎn)成字符串的坐標點集合,經(jīng)度和緯度之間用英文逗號 , 隔開,做個坐標之間用英文分號 ; 隔開,多個不同的參數(shù)值用英文豎杠 | 隔開,這個統(tǒng)一的規(guī)則在所有函數(shù)和交互中都通用。比如在早期的webkit內(nèi)核的瀏覽器控件中,就無法將數(shù)組的數(shù)組傳出來,于是就要轉(zhuǎn)成萬能的字符串組合數(shù)據(jù)。

二、功能特點

1 省市區(qū)域地圖封裝類功能特點

  1. 同時支持閃爍點圖、遷徙圖、區(qū)域地圖、世界地圖、儀表盤等。
  2. 可以設(shè)置標題、提示信息、背景顏色、文字顏色、線條顏色、區(qū)域顏色等各種顏色。
  3. 可設(shè)置城市的名稱、值、經(jīng)緯度 集合。
  4. 可設(shè)置地圖的放大倍數(shù)、是否允許鼠標滾輪縮放。
  5. 內(nèi)置世界地圖、全國地圖、省份地圖、地區(qū)地圖,可以精確到縣,所有地圖全部離線使用。
  6. 內(nèi)置了各省市json數(shù)據(jù)文件轉(zhuǎn)js文件功能,如有數(shù)據(jù)更新自行轉(zhuǎn)換即可,支持單個文件轉(zhuǎn)換和一鍵轉(zhuǎn)換所有文件。
  7. 內(nèi)置了從json文件或者js文件獲取該區(qū)域的所有名稱和經(jīng)緯度信息集合的功能,可以通過該方法獲取到信息用來顯示。
  8. 依賴瀏覽器組件顯示地圖,提供的demo支持webkit/webengine/miniblink/ie 多種方式加載網(wǎng)頁。
  9. 采用miniblink瀏覽器內(nèi)核打通了Qt5.6及后續(xù)版本+mingw編譯器缺少瀏覽器模塊的遺憾,使得整個項目支持所有Qt版本,親測4.7到6.2等任意版本。
  10. 閃爍點遷徙圖等設(shè)置的點支持單獨設(shè)置顏色。
  11. 提供接口直接獲取點擊的點相關(guān)信息,方便程序聯(lián)動處理。
  12. 拓展性極強,可以依葫蘆畫瓢自行增加各種精美的echarts組件,做出牛逼的效果。
  13. 內(nèi)置的儀表盤組件提供交互功能,demo演示中包含了對應(yīng)的代碼。
  14. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  15. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

2 百度地圖封裝類功能特點

  1. 同時支持在線地圖和離線地圖兩種模式。
  2. 同時支持webkit內(nèi)核、webengine內(nèi)核、miniblink內(nèi)核、IE內(nèi)核。
  3. 支持設(shè)置多個標注點,信息包括名稱、地址、經(jīng)緯度。
  4. 可設(shè)置地圖是否可單擊、拖動、鼠標滾輪縮放。
  5. 可設(shè)置協(xié)議版本、秘鑰、主題樣式、中心坐標、中心城市、地理編碼位置等。
  6. 可設(shè)置地圖縮放比例和級別,縮略圖、比例尺、路況信息等控件的可見。
  7. 支持地圖交互,比如鼠標按下獲取對應(yīng)位置的經(jīng)緯度。
  8. 支持查詢路線,可設(shè)置起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
  9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
  10. 可設(shè)置行政區(qū)劃,指定某個城市區(qū)域繪制圖層,在線地圖自動輸出行政區(qū)劃邊界點集合到j(luò)s文件給離線地圖使用。
  11. 可靜態(tài)或者動態(tài)添加多個覆蓋物。支持點、折線、多邊形、矩形、圓形、弧線、點聚合等。
  12. 提供函數(shù)接口處理經(jīng)緯度解析成地址和地址解析成經(jīng)緯度坐標。
  13. 提供的demo直接可以單獨選點執(zhí)行對應(yīng)的處理比如路線查詢。
  14. 可以拿到路線查詢到的點坐標信息集合,比如用于機器人坐標導(dǎo)航等。
  15. 封裝了豐富的函數(shù)比如刪除指定點和所有點,刪除指定覆蓋物和所有覆蓋物等。
  16. 標注點彈框信息可以自定義內(nèi)容,標準html格式。
  17. 標注點單擊事件可選 0-不處理 1-自己彈框 2-發(fā)送信號。
  18. 標注點可設(shè)置動畫效果 0-不處理 1-跳動 2-墜落
  19. 標注點可設(shè)置本地圖片文件等。
  20. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  21. 支持js動態(tài)交互添加點、刪除點、清空點、重置點,不需要刷新頁面。
  22. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

3 離線地圖下載類功能特點

  1. 多線程同步下載多級別瓦片地圖,不卡界面。
  2. 內(nèi)置多個離線地圖下載請求地址,自動隨機選擇一個發(fā)送請求。
  3. 下載地圖類型同時支持街道圖和衛(wèi)星圖。
  4. 自動計算可視區(qū)域或者行政區(qū)域的下載瓦片數(shù)量。
  5. 下載的級別可以自定義范圍和選擇。
  6. 每個瓦片下載完成都發(fā)送信號通知,參數(shù)包括下載用時。
  7. 可設(shè)置下載最大超時時間,超過了則丟棄跳到下一個下載任務(wù)。
  8. 實時顯示下載進度,以及當前級別已經(jīng)下載的瓦片數(shù)和總瓦片數(shù)。
  9. 下載過程中可以停止下載,下載完成自動統(tǒng)計總用時。
  10. 內(nèi)置經(jīng)緯度和屏幕坐標互相轉(zhuǎn)換函數(shù)。
  11. 目前支持百度地圖,其他地圖比如谷歌地圖、騰訊地圖、高德地圖可以定制。
  12. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  13. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

4 省市輪廓下載類功能特點

  1. 定時器排隊下載省市輪廓圖點坐標集合存儲到JS文件。
  2. 支持一個行政區(qū)域多個不規(guī)則區(qū)域下載。
  3. 自動計算行政區(qū)域的下載輪廓數(shù)量。
  4. 可精確選擇省份、市區(qū)、縣城,也可直接輸入行政區(qū)域的名稱。
  5. 可以設(shè)置下載間隔、隨時開始下載和停止下載。
  6. 提供編輯邊界功能,可以直接在地圖上編輯好不規(guī)則區(qū)域的點集合,然后獲取邊界點集合數(shù)據(jù),這個可以用來自己繪制區(qū)域拿到數(shù)據(jù),比如某個鄉(xiāng)鎮(zhèn)甚至某個小區(qū)的行政區(qū)域數(shù)據(jù),很牛逼。

三、體驗地址

體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg  提取碼:uyes 文件名:bin_map.zip

國內(nèi)站點:https://gitee.com/feiyangqingyun

國際站點:https://github.com/feiyangqingyun

四、效果圖

五、相關(guān)代碼

void MapBaiDu::addLocalSearch(QStringList &list)
{
    //全局搜索對象 結(jié)果可選顯示在地圖中還是異步通知
#if 1
    list << QString("  var searchOptions = {renderOptions:{map: map}};");
#else
    list << QString("  var searchOptions = {");
    list << QString("    onSearchComplete: function(results) {");
    list << QString("      if (local.getStatus() != BMAP_STATUS_SUCCESS) {");
    list << QString("        return;");
    list << QString("      }");
    list << QString("      var result = [];");
    list << QString("      var count = results.getCurrentNumPois();");
    list << QString("      for (var i = 0; i < count; ++i) {");
    list << QString("        var poi = results.getPoi(i);");
    list << QString("        var point = poi.point.lng + ',' + poi.point.lat;");
    list << QString("        result.push(point + ';' + poi.title + ';' + poi.address + ';' + poi.url);");
    list << QString("      }");
    list << QString("      receiveData('searchresult', result.join('|'));");
    list << QString("    }");
    list << QString("  };");
#endif
    list << QString("  var local = new %1.LocalSearch(map, searchOptions);").arg(mapFlag);

    list << QString("  local.setSearchCompleteCallback(function(results) {");
    list << QString("    ");
    list << QString("  });");

    //通用搜索方法
    //text: 搜索的關(guān)鍵字 支持多個可以用 | 隔開
    list << QString("  function search(text) {");
    list << QString("    var texts = text.split('|');");
    list << QString("    local.search(texts);");
    list << QString("  }");

    //矩形區(qū)域搜索
    list << QString("  function searchInBounds(text, start, end) {");
    list << QString("    var texts = text.split('|');");
    list << QString("    if (!start || !end) {");
    list << QString("      local.searchInBounds(texts, map.getBounds());");
    list << QString("      return;");
    list << QString("    }");
    list << QString("    var bs = new %1.Bounds(getPoint(start), getPoint(end));").arg(mapFlag);
    list << QString("    local.searchInBounds(texts, bs);");
    list << QString("  }");

    //圓形區(qū)域搜索
    list << QString("  function searchNearby(text, center, radius) {");
    list << QString("    var texts = text.split('|');");
    list << QString("    local.searchNearby(texts, getPoint(center), radius);");
    list << QString("  }");
}

void MapBaiDu::getOverlayInfo(QStringList &list)
{
    //獲取覆蓋物信息 type = Marker Polyline 等
    list << QString("  function getOverlayInfo(type) {");
    list << QString("    var allOverlay = map.getOverlays();");
    list << QString("    var count = allOverlay.length;");
    list << QString("    for (var i = 0; i < count; ++i) {");
    list << QString("      var overlay = allOverlay[i];");
    //過濾不可見的
    list << QString("      if (!overlay.isVisible()) {");
    list << QString("        continue;");
    list << QString("      }");
    //拿到覆蓋物類型對應(yīng)字符串 toString() 以后的值是 [object Marker] [object Circle] [object Overlay]
    list << QString("      var objType = overlay.toString();");
    list << QString("      objType = objType.substr(8, objType.length - 9);");
    //過濾標注點和懸停工具
    list << QString("      if (objType == 'Marker' || objType == 'Overlay') {");
    list << QString("        continue;");
    list << QString("      }");
    //如果指定了覆蓋物類型則過濾掉不符合類型的
    list << QString("      if (type.length > 0 && objType != type) {");
    list << QString("        continue;");
    list << QString("      }");
    list << QString("      var path = overlay.getPath();");
    list << QString("      var points = getPathPoints(path);");
    //不同類型的有不同的信息 下面演示的是另外一種過濾方法 instanceof
    list << QString("      var info = objType;");
    list << QString("      if (overlay instanceof %1.Circle) {").arg(mapFlag);
    list << QString("        var center = overlay.getCenter();");
    list << QString("        var point = center.lng + ',' + center.lat;");
    list << QString("        var radius = overlay.getRadius();");
    list << QString("        info = objType + '|' + point + '|' + radius + '|' + points.join(';')");
    list << QString("      } else {");
    list << QString("        info = objType + '|' + points.join(';')");
    list << QString("      }");
    list << QString("      receiveData('overlayinfo', info);");
    list << QString("    }");
    list << QString("  }");
}

到此這篇關(guān)于Qt編寫地圖之實現(xiàn)覆蓋物坐標和搜索的文章就介紹到這了,更多相關(guān)Qt地圖覆蓋物坐標搜索內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論