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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...