如何使用JS來開發室內三維地圖的軌跡回放功能

来源:https://www.cnblogs.com/esmap/archive/2019/02/22/10405478.html
-Advertisement-
Play Games

在製作完成室內三維地圖的功能後,最經常有的需求就是如何做人員的軌跡回放,一般流程都是從資料庫中查詢軌跡坐標後,經過後臺查詢介面返回給前端,接下來的事情都交給JS來完成。如果想做好一個性能好的軌跡回放功能,還是很有技術含量的,比如我要加一個時間軸,可以隨時拖動時間查詢,然後能快速響應顯示人的軌跡?這就... ...


 在製作完成室內三維地圖的功能後,最經常有的需求就是如何做人員的軌跡回放,一般流程都是從資料庫中查詢軌跡坐標後,經過後臺查詢介面返回給前端,接下來的事情都交給JS來完成。

如果想做好一個性能好的軌跡回放功能,還是很有技術含量的,比如我要加一個時間軸,可以隨時拖動時間查詢,然後能快速響應顯示人的軌跡?

這就需要借鑒視頻播放的思路了,每次從後臺請求人員位置數據的時候只請求30分鐘的(每分鐘3條),然後檢查軌跡隊列裡面是否少於10條,少於的時候就再次請求接下來30分鐘的,這樣就能保證後臺能夠每次只查小批量的數據,

能夠快速響應返回,當用戶拖動播放條時,浪費的人員查詢數據就會少很多,這樣給用戶體驗上會感覺好很多。

此篇文章先從實現使用ESMap地圖SDK開發一個人的軌跡回放功能開始,有時間軸的後期再分析介紹。

 

開發過程如下圖流程:

若有不足,歡迎指正。

首先創建好地圖後,我在地圖上增加了樓層控制控制項、放大縮小控制項和二三維切換控制項。如下圖:

 

做好初步準備工作後開始我的軌跡回放界面書寫。

1.創建後臺json數據,並引入數據

利用ESMap地圖平臺的地圖點擊事件在地圖上根據自己規劃的路線進行採點收集,然後整理成自己需要的json數據,我的json文件命名為data.json。

//根據地圖點擊事件 規劃路線 採點收集
map.on('mapClickNode', function (event) {
  console.log(event.hitCoord); //點擊地圖 控制台顯示坐標點
});

得到json數據後,引入到地圖:

var coordsData = null;
$.getJSON("data.json", function (data) {
            coordsData = data.points; //獲取json數據的數組對象
        });

2.封裝文字圖片標註函數

我創建的地圖是三層商場,為了免去在每層都要做創建標註刪除標註的重覆性操作,我將文字圖片標註封裝到一個函數中,哪一層使用到文字圖片標註就直接調用CreateMarker()函數:

        function CreateMarker(x, y, fnum) { //標註的坐標點, 所在樓層
            var layer = new esmap.ESLayer('textMarker'); //創建標註圖層
            floorLayer = map.getFloor(fnum); // 所在樓層
            tm = new esmap.ESTextMarker({
                x: x,
                y: y,
                name: "小張",
                showLevel: 20,
                height: 0.5,
                image: "image/user.png",
                imageAlign: "bottom",
                imageSize: 50,
                seeThrough: true,
                fillcolor: "1,6,7", //填充色
                fontsize: "8.0", //字體大小
                strokecolor: "255,255,0" //邊框色 
            });
            layer.addMarker(tm); //將標註添加到圖層
            floorLayer.addLayer(layer); //將圖層添加到樓層
        }

3.配置線標註樣式,封裝畫軌跡線函數

        //配置線標註樣式
        var lineStyle = {
            lineWidth: 3,
            alpha: 0.8,
            offsetHeight: 0,
            lineType: esmap.ESLineType.FULL //實線
        }

畫軌跡線函數drawLine();

        //畫軌跡線函數
        function drawLine(points) {
            if (points.length && points.length <= 1) return; //兩個點以上畫線
            map.clearLineMarkById("routes");
            //創建線標註對象
            line = new esmap.ESLineMarker("routes", points, lineStyle);
            //調用地圖的畫線方法
            map.drawLineMark(line);
        }

4.實時刷新軌跡線  END!

     function updateCoord() { //實時刷新軌跡線
            var points = [];
     var lastfnum = 0;
     timer = setInterval(updated, 100);
     function updated() {
             if (coordIndex >= coordsData.length) {
                    clearInterval(timer);
                    timer = -1;
                    map.clearLineMarkById("routes");
                map.getFloor(lastfnum).removeLayersByTypes(esmap.ESLayerType.TEXT_MARKER);
                    return;
                }
          var coord = coordsData[coordIndex]; //取坐標點
                     if (map.focusFloorNum != coord.fnum)
                  map.focusFloorNum = coord.fnum; //判斷聚焦樓層 
                     if (lastfnum != coord.fnum) {//如果切換樓層了
                        if (lastfnum > 0)                     
             map.getFloor(lastfnum).removeLayersByTypes(esmap.ESLayerType.TEXT_MARKER);//先移除上一個樓層的標註 CreateMarker(coord.x, coord.y, coord.fnum);//再在新樓層添加一個標註 lastfnum = coord.fnum; } tm.moveTo({ x: coord.x, y: coord.y, time: 0 }); //只保留16個點 畫軌跡線      if (points.length < 16) { points.push(coord); drawLine(points); //調用畫軌跡線函數 } else { points.shift(); //先踢掉第一個 points.push(coord); //在把新點加入進去 drawLine(points); } coordIndex++; } }

到這裡軌跡回放功能界面就完成啦!是不是很簡單。

單層軌跡回放效果圖:

 

多層軌跡回放效果圖:

 

以上就是我用ESMap的地圖製作平臺製作的軌跡回放功能,感興趣的小伙伴快試一下吧,也製作一個軌跡回放來看看!

以上內容體驗鏈接:訪問鏈接

Thank you for reading!

 


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

-Advertisement-
Play Games
更多相關文章
  • unordered collection of unique strings.set值是唯一的字元串的無序集合, 把握住兩個特點: 唯一, 無序. 清空所有的數據, 並清理顯示界面: 保存一條 set 數據, 鍵是 myset1, 值是 1, 2, 3, 4 四個數字: 查看鍵myset1 的值: ...
  • select * from dba_jobs ;select * from dba_scheduler_job_run_details t; >這個語句通過制定job名,來查看job的運行的詳細信息 select * from dba_scheduler_jobs; >這個語句可以查看所有job,及 ...
  • 正如前面所講的, redis 的數據結構就是一系列的鍵值對鍵 -> printable ASCII (可列印的 ASCII 碼, 最大值是 512MB)值 -> Primitives (基本的) string 字元串 (最大值是 512MB) Containers (of string) (以其他形 ...
  • 屏幕尺寸 #define kScreenWidth [UIScreen mainScreen].bounds.size.width #define kScreenHeight [UIScreen mainScreen].bounds.size.height 手機型號 #define kISiPhon ...
  • android 動畫分為兩類,View Animation(視圖動畫)和property Animation(屬性動畫),View Animation(視圖動畫)包含了Tween Animation和Frame Animation, property Animation包含Value Animati ...
  • 在iOS開發中經常遇到一些欄位和類型的定義,例如配置生產和測試不同環境的參數等,這時候經常用到#define、const以及typedef。那麼它們之間有什麼區別呢?我們接下來一個一個具體瞭解下。 一、基本概念 1.1、#define #define並不是定義全局變數,而是巨集定義。也就是說並不是真正 ...
  • EasyMessenger ====== "直達Github項目地址" 一款用於Android平臺的基於Binder的進程間通信庫,採用 生成IPC通信需要的代碼。 相對於 具備如下優勢: 採用Java聲明介面,更方便 介面方法支持重載 同時支持同步和非同步通信 目前支持如下數據類型: boolean ...
  • 前言: 代理模式是iOS中非常重要的一個模式,iOS SDK中的系統控制項幾乎都用到了代理模式。代理模式用來處理事件監聽、參數傳遞功能。 協議創建(Protocol): 可手打如下代碼,或者在代碼塊裡面搜索"protocol",然後把協議的代碼拖拽出來 @protocol FullcellDalega ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...