使用室內三維地圖引擎ESMap來管理攝像頭設備、消防設備和人員軌跡展示

来源:https://www.cnblogs.com/esmap/archive/2020/04/03/12575940.html
-Advertisement-
Play Games

目前室內三維地圖如何輕量化,能夠在手機微信、電腦瀏覽器等平臺快速顯示地圖,顯示的地圖性能好,轉動地圖不卡是大家都要面對的問題, 使用室內三維地圖引擎ESMap後目前可以不用操心這方面的問題,開發只需要關心設備如何加到地圖上進行管理,本文章主要介紹攝像頭圖層、消防設備圖層和人員軌跡圖層進行介紹,方便大... ...


目前室內三維地圖如何輕量化,能夠在手機微信、電腦瀏覽器等平臺快速顯示地圖,顯示的地圖性能好,轉動地圖不卡是大家都要面對的問題,

使用室內三維地圖引擎ESMap後目前可以不用操心這方面的問題,開發只需要關心設備如何加到地圖上進行管理,本文章主要介紹攝像頭圖層、消防設備圖層和人員軌跡圖層進行介紹,方便大家直接整合到自己的項目中。

本文簡單的介紹使用ESmap的SDK開發地圖簡單的設備圖層管理的過程。若有不足,歡迎指正。

 

開發過程如下:

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

 

利用ESMap地圖平臺的地圖點擊事件在地圖上選取所有設備的位置坐標,然後整理成自己需要的json數據。

 //地圖載入完成回調

 //地圖載入完成回調
map.on('loadComplete', function () {
    floorControl = new esmap.ESScrollFloorsControl(map, ctlOpt);//創建樓層控制項
    var zoomControl = new esmap.ESZoomControl(map, ctlOpt1);//創建放大縮小控制項
    bingEvents();//綁定按鈕點擊事件
    loadDeviceData();//載入自己構造好的json格式數據
});

 

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

所有的設備真實項目中都採用資料庫後臺來管理,我們演示就直接省去後臺管理,直接使用設備基本信息數據存儲在JSON文件中,這樣就可以直接方便演示;

在地圖載入完成後獲取自己需要的數據:

json數據格式如下圖:

 

//載入圖層數據

 function loadDeviceData(){
            $.getJSON("device.json", function (data) {
                if(data){
                    var devices = data.devices;
                    for (let i = 0; i < devices.length; i++) {
                        const obj = devices[i];
                        addDeviceMarker(obj);//在地圖上添加設備marker
                    }
                }
            });  

            $.getJSON("baoan.json", function (data) {
                if(data){
                    var baoan = data.data;
                    for (let i = 0; i < baoan.length; i++) {
                        const obj = baoan[i];
                        addTextMarker(obj); //在地圖上添加安保人員marker
                    }
                }
            });  
        }

2.封裝載入設備圖層marker方法

將上面的數據解析後,直接寫代碼在室內三維地圖上進行相關圖片marker展示。

 //在地圖上添加設備marker
        function addDeviceMarker(obj){
            //通過名字區別創建不同的layer
            var floorLayer = map.getFloor(obj.fnum);  //獲取第一層的樓層對象
            var layer=floorLayer.getOrCreateLayerByName("device"+obj.type,esmap.ESLayerType.IMAGE_MARKER);//"device"+type 隱藏/刪除的時候用
            var url= 'image/'+obj.type+'.png';
            var angle=null;
            if(obj.hasOwnProperty("angle"))angle=obj.angle;
            im = new esmap.ESImageMarker({
                x:obj.x,                //坐標x
                y:obj.y,                //坐標y
                url:url,                //圖片標註的圖片地址
                size: obj.size,         //圖片大小 或者 size:{w:32,h:64},
                angle:angle,
                spritify:true,          //跟隨地圖縮放變化大小,預設為true,可選參數
                height:1,               //距離地面高度
                showLevel: 20,          //地圖縮放等級達到多少時隱藏,可選參數
                seeThrough: false,       //是否可以穿透樓層一直顯示,可選參數
                id: obj.id,             //id,可自定義
                name:obj.name           //name可自定義
            });
            im.deviceType=obj.type;     //自定義屬性-用於點擊事件中區分點擊的是什麼類型的設備
            layer.addMarker(im);        //將imageMarker添加到圖層
            floorLayer.addLayer(layer); //將圖層添加到樓層對象
        }

 效果如下圖:

3.封裝文字加圖片marker方法

//在地圖上添加安保人員marker
  function addTextMarker(obj){
            //通過名字區別創建不同的layer
            var floorLayer = map.getFloor(obj.fnum);  //獲取第一層的樓層對象
            var layer=floorLayer.getOrCreateLayerByName("device"+obj.type,esmap.ESLayerType.TEXT_MARKER);//"device"+type 隱藏/刪除的時候用
            var url= 'image/'+obj.type+'.png';
            var tm = new esmap.ESTextMarker({
                x:obj.x,                //坐標x
                y:obj.y,                //坐標y
                id: obj.id,             //id,可自定義
                image: url,             //圖片標註的圖片地址
                imageAlign:'bottom',    //圖片方位left,top,right,bottom
                imageSize:obj.size,         //圖片大小
                name:obj.name,          //文字名稱
                spritify:true,          //跟隨地圖縮放變化大小,預設為true,可選參數
                scale:1,                //文字等級縮放預設為1,可選參數,0.1表明縮小10倍
                height:1,               //距離地面高度
                showLevel: 20,          //地圖縮放等級達到多少時隱藏,可選參數
                fillcolor: "255,0,0",     //填充色
                fontsize: "18",           //字體大小
                strokecolor: "255,255,0", //邊框色
                strokewidth:2 //邊框厚度  0表示無邊框
            });

            tm.deviceType=obj.type;         //自定義屬性-用於點擊事件中區分點擊的是什麼類型的設備
            tm.routePoints=obj.routePoints; //人員的移動路徑
            baoanMakrker.push(tm);
            layer.addMarker(tm);        //將imageMarker添加到圖層
            floorLayer.addLayer(layer); //將圖層添加到樓層對象
            baoanMoveRoute();//控制保全的移動
        }

效果如下圖:

4.控制地圖marker移動

     //控制保全的移動
        function baoanMoveRoute(){
            if(baoanMakrker && baoanMakrker.length>0){
                var index=0;
                setInterval(function(){
                    for (let i = 0; i < baoanMakrker.length; i++) {
                       const bamarker = baoanMakrker[i];
                        var routePoints=bamarker.routePoints;
                        var point=routePoints[index];
                        bamarker.moveTo({x: point.x,y: point.y,time:0})//移動marker  
                    }
                    index++;
                    if(index==5){
                        index=0;
                    }
                },2000);
            }
        }

以上是將設備添加到地圖上的過程。

 

5.控製圖層的顯示和隱藏

在添加設備Marker的時候會取一個圖層name,可以根據這個name控製圖層的顯示和隱藏

封裝方法為:

//根據名字顯示或隱藏設備圖層
        function hideOrShowLayer(params,isshow){//params格式['device1','device2',...] isshow:true/fasle
            var fnums = map.floorNums;//獲取地圖所有樓層[1,2,3]
            for(var i=0;i<fnums.length;i++){
                var floor = map.getFloor(fnums[i]);
                var res = floor.getLayersByNames(params);
                if(res)
                    res.visible = isshow;
            }
        };

全部圖層顯示:

隱藏攝像頭:

6.點擊地圖marker彈出氣泡信息

首先在點擊事件回調中判斷點擊的是否是自己添加的marker

//地圖點擊事件回調
        map.on('mapClickNode', function(event) {
            console.log(event);
            if(event && event.hasOwnProperty("deviceType")){//這裡判斷點擊的是否是自己新增的設備marker
                showPop(event);
            }
        });

封裝彈出氣泡標註方法:

      var popMarker=null;
        function showPop(data) {//點擊marker 彈出基本信息
            if(popMarker) popMarker.close();
            var types={"1":"攝像頭","2":"消防設備","3":"保全"};
            var className = "close-"+data.ID; //生成唯一的class,用於關閉
            if(data.deviceType!=1){//如果點擊的不是攝像頭
                popMarker = new esmap.ESPopMarker({
                mapCoord: {
                   //設置彈框的x軸
                    x: data.x,
                    //設置彈框的y軸
                    y:data.y,
                    height: 3.5, //控制信息窗的高度
                    //設置彈框位於的樓層
                    fnum: data.FloorNum
                },
                className:"rock-box m-pop",  //自定義popMarker樣式。在css里配置
                //設置彈框的寬度
                width: 300,
                //設置彈框的高度
                height: 150,
                //    marginTop:10,  //彈框距離地面的高度
                //設置彈框的內容
               content:
                `
                <div class="title"><span style="margin: 20px;">信息彈框</span></div>
                    <div class="m-box">
                        <div class="m-text">
                       <p>                            
                <span class="m-span">id</span> <span class="m-span">名稱</span> <span class="m-span">類型</span> </p> <p> <span class="m-span2">${data.ID}</span> <span class="m-span2 status">${data.name}</span> <span class="m-span2 ">${types[data.deviceType]}</span> </p> </div> </div> <div class="myPopClose ${className}"></div> `, closeCallBack: function () { //信息窗點擊關閉操作 }, created: function (e) { //創建完成鉤子 $("."+className).on('click',function(){ //為自定義關閉按鈕綁定隱藏事件 popMarker.close(); }) } }); }else{//點擊攝像頭 popMarker = new esmap.ESPopMarker({ mapCoord: { //設置彈框的x軸 x: data.x, //設置彈框的y軸 y:data.y, height: 3.5, //控制信息窗的高度 //設置彈框位於的樓層 fnum: data.FloorNum }, className:"rock-box m-pop", //自定義popMarker樣式。在css里配置 //設置彈框的寬度 width: 300, //設置彈框的高度 height: 220, // marginTop:10, //彈框距離地面的高度 //設置彈框的內容 content: ` <div class="title"><span>${data.name}</span></div> <div class="m-box"> <video style="width: 100%;height: 100%;" controls autoplay> <source src="1.mp4" type="video/mp4"> </video> </div> <div class="myPopClose ${className}"></div> `, closeCallBack: function () { //信息窗點擊關閉操作 }, created: function (e) { //創建完成鉤子 $("."+className).on('click',function(){ //為自定義關閉按鈕綁定隱藏事件 popMarker.close(); }) } }); } }

彈框樣式可以自定義修改

彈框效果如下:

 

 

 

 

以下是整體效果圖:

 

 

以上就是我用ESMap的地圖開發的圖層控制功能,感興趣的小伙伴快試一下吧!

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

可用使用手機微信測試我們的室內三維地圖載入速度和展示性能。

Thank you for reading!

 


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

-Advertisement-
Play Games
更多相關文章
  • 嵌套路由 嵌套路由:一個路由配置中嵌套其他的路由配置。 嵌套路由挺常用的,比如導航欄有首頁、文章、想法、留言4個模塊,我們以嵌套路由的形式集成這些模塊,在導航欄中點擊對應的條目,就會路由到對應的頁面(下方顯示對應的頁面),和html的<iframe>效果差不多。 demo 嵌套路由 <!DOCTYP ...
  • ES6 函數 引言: 函數在任何語言中偶讀很重要,java裡面的函數通常叫做方法,其實是一個東西,使用函數可以簡化更多的代碼,代碼結構看著更加清晰。今天我們來學學ES6語法中,函數有什麼變化。 雖然現在的有比ES6更高的版本,但是主流一般都是ES6。es6中的函數相對於之前的版本提升了很多,相對來說 ...
  • //強弱密碼校驗,密碼至少包含大寫字母,小寫字母,數字,且不少於8位 var tx = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$/; var pass = 'aaaa12345' if(!tx.test(pass)){ alert("弱密碼"); }els ...
  • 註:腦容量有限,本筆記主要記錄本人認為較為有用的js方法 1、sessionStorage :用於臨時保存同一視窗(或標簽頁)的數據,在關閉視窗或標簽頁之後將會刪除這些數據。(如需長期保存可用 localStorage) 語法:window.sessionStorage 保存數據:essionSto ...
  • 在程式開發中,如何快速的查找定位問題是一項非常重要的基本功。在實際開發過程中,或多或少都會遇到程式出現問題導致無法正常運行的情況,因此,調試代碼就變成了一項無法避免的工作。這裡簡單介紹下如何調試 node.js 程式。 ...
  • 網頁設計中經常用到標題之間的分隔符的樣式,即用短豎線分隔幾個關鍵詞,最近發現了一種簡單可行的方式,即通過vertical-align屬性來實現分隔符樣式,在這邊分享給大家: <!DOCTYPE html> <html> <head> <title></title> <style> div { hei ...
  • 前言 前端的小伙伴在面試的時候,幾乎都會遇到一道這樣的面試題: add(1)(2)(3)(4)輸出結果為10。在第一次看到這道面試題的時候,很多小伙伴感到了迷茫!借用王寶強在《人在囧途》中的表演:啥啥啥,這寫的都是啥?下麵胡哥為各位小伙伴帶來這道題的揭秘。 一、核心點 基礎函數的變種 函數柯里化 我 ...
  • vertical-align屬性主要用於改變行內元素的對齊方式,對於行內佈局影響很大,如果不瞭解的話,我們開發調整樣式的時候很容易出錯。 網上關於這個屬性的原理說得很是複雜,看一眼就讓人覺得望而生畏,而且大可不必完全理解其原理,只要懂得其規律,我們足夠使用即可,下麵把我的理解分享給大家: 基線 要了 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...