使用室內三維地圖引擎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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...