web端百度地圖API實現實時軌跡動態展現

来源:https://www.cnblogs.com/qiantao/archive/2019/11/11/11834780.html
-Advertisement-
Play Games

最近在工作中遇到了一個百度地圖api中的難題,恐怕有的程式員可能也遇到過。就是實時定位並顯示軌跡,網上大部分都是通過創建polyline對象貼到地圖上。當然,百度地圖的畫線就是這樣實現的,但是好多人會發現,如果數據量超過四五千的話,瀏覽器可能就要卡了,後面可能就直接因為瀏覽器記憶體不足直接崩潰。按理講 ...


最近在工作中遇到了一個百度地圖api中的難題,恐怕有的程式員可能也遇到過。就是實時定位並顯示軌跡,網上大部分都是通過創建polyline對象貼到地圖上。當然,百度地圖的畫線就是這樣實現的,但是好多人會發現,如果數據量超過四五千的話,瀏覽器可能就要卡了,後面可能就直接因為瀏覽器記憶體不足直接崩潰。按理講面對這麼少的數據,百度地圖肯定會考慮到這一點,所以肯定有解決的方法。下麵將介紹本人的方法供大家參考:

1、數據準備

這方便的數據我是ajax請求從後臺獲取的就不說了。畫線的話我們就得用到百度地圖api中的polyline類了,因為我們是實時定位,以前的歷史路徑是存在,但是我們不能每次都要new一個polyline對象貼到地圖上,所以就需要用到polyline的setPath(path: Array<Point>),我們把整條路徑的數據全部塞進去就可以了。這裡我用一個json格式的數組保存每個歷史路徑的所有路徑數據,後面就是來數據更新數組再找到地圖上相應的polyline對象塞進去就可以了。

var polylineArray = [];//此數組專門存儲歷史路徑
var PolylineJson = {};
PolylineJson["Id"] = Id;//存儲相應的polyline對象
PolylineJson ["PathArray"] = polylineArray ;
polylineArray.push(PolylineJson);

備註:Polyline是個覆蓋物對象,可以和其他對象一樣自定義屬性的,比如在聲明以後設置polyline的id屬性直接用polyline.id=content就可以了

var polyline = new BMap.Polyline([ startPoint, endPoint ], {
        strokeColor : color,
        strokeWeight : weight,
        strokeOpacity : opacity,
        strokeStyle : style // 實線solid或虛線dashed
    });
polyline.id = Id;
map.addOverlay(polyline);

2、路徑更新

if(PolylineArray != ""){
        for(var i = 0; i < PolylineArray.length; i++){
                        if(PolylineArray[i].Id == Id){//此條路徑存在
                            var PathArray = PolylineArray[i].PathArray;
                            PathArray.push(endPoint);//更新數組中的數據
                            var allOverlay = map.getOverlays();// 獲取地圖上的覆蓋物
                            for (var j = 0; j < allOverlay.length; j++) {
                                // 判斷標註物是否是Polyline類型
                                if (allOverlay[j].toString() == "[object Polyline]") {
                                    if (allOverlay[j].id == Id) {
                                        allOverlay[j].setPath(PathArray);
                                        break;
                                    }else{//數組中存在,但地圖上不存在
                                        if(j == allOverlay.length - 1){
                             var polylineTemp = new BMap.Polyline(PathArray, { 
                                                    strokeColor : color, 
                                                    strokeWeight : weight, 
                                                    strokeOpacity : opacity, 
                                                    strokeStyle : style // 實線solid或虛線dashed  
                                                  });
                                            polylineTemp.id = Id;//為這條路徑賦值唯一的id
                                            map.addOverlay(polylineTemp); // 添加折線到地圖上
                                        }
                                    }
                                }
                            }
                            break;
                        }else{//不存在
                            if(i == PolylineArray.length - 1){
                                var PathArray = [];
                                PathArray.push(startPoint);
                                PathArray.push(endPoint);
                                var polylineTemp = new BMap.Polyline(PathArray, { 
                                             strokeColor : color, 
                                             strokeWeight : weight, 
                                             strokeOpacity : opacity, 
                                             strokeStyle : style // 實線solid或虛線dashed  
                                           });
                                polylineTemp.id = Id;//為這條路徑賦值唯一的id
                                map.addOverlay(polylineTemp); // 添加折線到地圖上
                                var PolylineJson = {};
                                PolylineJson["Id"] = Id;
                                PolylineJson["PathArray"] = PathArray;
                                PolylineArray.push(Polyline);
                                break;
                            }
                        }
                    }
}else{//數組為空
            var PathArray = []; 
            PathArray.push(startPoint); 
            PathArray.push(endPoint);
            var polylineTemp = new BMap.Polyline(PathArray, { 
                  strokeColor : color, 
                  strokeWeight : weight, 
                  strokeOpacity : opacity, 
                strokeStyle : style // 實線solid或虛線dashed  
              });
            polylineTemp.id = Id;//為這條路徑賦值唯一的id
            map.addOverlay(polylineTemp); // 添加折線到地圖上
            var PolylineJson = {};
            PolylineJson["Id"] = Id;
            PolylineJson["PathArray"] = PathArray;
            PolylineArray.push(Polyline);
}

備註:本方法在載入輕量級的數據還是可以的,不會使瀏覽器崩潰,如果每次實時定位載入許多路徑數據,成百上千的那種,在載入的時候瀏覽器中地圖卡一下是正常現象。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下麵介紹Element-ui中Upload組件如何把圖片上傳的七牛雲(免費版本,有流量限制) 一、準備工作 1.去七牛雲註冊賬號,並實名認證,不認證無法創建存儲空間 2.瞭解Element-ui組件 二、創建上傳頁面(這裡直接使用官方的代碼片段) 三、上傳憑證(Token)如何獲得:https:// ...
  • 網頁加入視頻可以用h5自帶的video標簽,這裡用一個jQuery封裝優化好的video視頻組件videojs。 videojs官方網站:https://docs.videojs.com/index.html videojs下載:https://github.com/videojs/video.js ...
  • 問題:文本框輸入完成後點擊回車頁面刷新問題出在form上,當表單中只有一個文本框的時候獲取焦點並點擊回車之後會提交表單內容,就會發生刷新事件。 解決方法: 1、增加一個隱藏的輸入框 增加了一個隱藏的輸入框之後,表單的文本框不再是唯一的,回車不會觸發提交事件 2、去掉輸入框的回車事件 但是有的需求又要 ...
  • 國瑞前端: js確定取消,在html界面中,有css模擬的模態框,這樣顯示的就會更好看一些,那麼javascript有沒有自帶的彈框呢,當然是有的,接下來我就來給大家介紹一下把: js確定取消-警告框alert() 起到警告作用 js確定取消-確認框confirm() 123456789101112 ...
  • 響應式佈局 一個網站能夠相容多個終端,並且在各個終端都可以很好展示體驗。 媒體類型 在何種設備或者軟體上將頁面打開 123456789 all:所有媒體braille:盲文觸覺設備embossed:盲文印表機print:手持設備projection:印表機預覽screen:彩屏設備speech:'聽 ...
  • 小程式由來 當初結婚,為了給媳婦驚喜,藉助雲開發的推廣,自己做了一個結婚用的邀請函小程式,結完婚後,趁著空閑時間,希望把之前使用的邀請函小程式留存下來,所以做了一次整體改版。改版後的小程式我自己定義為相冊類小程式,主要放一些自己喜歡的照片。 小程式功能 首頁相冊 愛的空間相冊 陌生人的到訪 陌生人的 ...
  • 中間件是什麼呢? 中間件就是客戶端http請求發起傳送到伺服器和伺服器返迴響應之間的一些處理函數。 為什麼要使用中間件? 通過中間件,可以對數據進行操作使得我們能方便地操作請求數據編寫伺服器響應。如body-parse中間件對post請求的參數進行處理讓我們可以通過res.body快速獲取請求參數, ...
  • 一、項目簡介 uni-liveShow是一個基於vue+uni-app技術開發的集小視頻/IM聊天/直播等功能於一體的微直播項目。界面仿製抖音|火山小視頻/陌陌直播,支持編譯到多端(H5、小程式、App端) 且相容效果一致。 二、效果預覽 在H5、小程式、App端測試效果如下:(後續大圖均為APP端 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...