如何使用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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...