目前室内三维地图如何轻量化,能够在手机微信、电脑浏览器等平台快速显示地图,显示的地图性能好,转动地图不卡是大家都要面对的问题,

使用室内三维地图引擎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!

使用室内三维地图引擎ESMap来管理摄像头设备、消防设备和人员轨迹展示的更多相关文章

  1. 如何使用JS来开发室内三维地图的轨迹回放功能

     在制作完成室内三维地图的功能后,最经常有的需求就是如何做人员的轨迹回放,一般流程都是从数据库中查询轨迹坐标后,经过后台查询接口返回给前端,接下来的事情都交给JS来完成. 如果想做好一个性能好的轨迹回 ...

  2. [GitHub开源]基于HTML5实现的轻量级Google Earth三维地图引擎,带你畅游世界 【转】

    http://blog.csdn.net/iispring/article/details/52679185 WebGlobe HTML5基于原生WebGL实现的轻量级Google Earth三维地图 ...

  3. [原创.数据可视化系列之二]使用cesium三维地图展示美国全球军事基地分布

    基于浏览器的三维地图还算是一个比较高冷的东西,最主要的技术难点是如何在浏览器上 多快好省 的显示三维数据,很遗憾,还真的没有太好的的方案,只能说还有可行的方案. 很久之前用过skyline,使用CS居 ...

  4. 使用ESMap的地图平台开发三维地图

      本文简单的介绍使用ESmap的SDK开发(DIY自己地图的)一个地图的过程.若有不足,欢迎指正. 一.创建地图 只需四步,从无到有,在浏览器中创建一个自己的三维地图,炫酷到爆! 第一步:引入ESM ...

  5. 三维GIS引擎地图可视化渲染方案设计

    1.GIS地图可视化流程 GIS地图可视化就是将空间数据转化为地图数据再进行交互处理的方法,下图一展示了地图可视化的可编程渲染的典型管道,原始空间数据必须处理为图形API支持基础图元用以地图渲染.下图 ...

  6. [比较老的文章]三维渲染引擎 OGRE 与 OSG 的比较综述

    1 .引言随着计算机可视化.虚拟现实技术的飞速发展,人们对实时真实感渲染以及场景复杂度提出了更高的要求.传统的直接使用底层图形接口如OpenGL.DirectX开发图形应用的模式越来越暴露出开发复杂性 ...

  7. SkylineGlobe 7.0.1 & 7.0.2版本Web开发 如何正确使用三维地图控件和工程树控件

    Skyline TerraExplorer Pro目前正式发布的7.0.1&7.0.2版本,还只是64位的版本, 在Web开发的时候,如何在页面中正确嵌入三维地图控件,让一些小伙伴凌乱了. 下 ...

  8. GIS中的引擎:地图引擎

    什么是地图引擎?它和地图软件有什么区别? 引擎一词是英文单词engine的音译,通常指发动机,就是动力输出设备.诸如汽车.轮船.飞机的动力提供的核心设备就是引擎.IT领域中,常听说的有搜索引擎.图形引 ...

  9. eCharts二三维地图总结

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 最近多个项目中的登录页面陆续提出了不少地图需求,主要围绕地图的 ...

随机推荐

  1. eggjs+vue+nginx配置

    安装node https://github.com/nodesource/distributions#installation-instructions-1 注意使用No root privilege ...

  2. 使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解

    使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解 背景:这几天从阿里云上面购买了云服务器,最垃圾的那种,还送oss和EDS数据库服务器,只不过EDS数据库服务器只有一个 ...

  3. 身为 Java 程序员必须掌握的 10 款开源工具!

    本文主要介绍Java程序员应该在Java学习过程中的一些基本和高级工具.如果你是一位经验丰富的Java开发人员,你可能对这些工具很熟悉,但如果不是,现在就是是开始学习这些工具的好时机.Java世界中存 ...

  4. 从头认识js-函数表达式

    定义函数的方式有两种: 1.函数声明(特征:函数声明提升,在执行代码之前会先读取函数声明,这就意味着可以把函数声明放在调用它的语句之后) 2.函数表达式(函数表达式与其他表达式一样,使用之前必须先声明 ...

  5. 手摸手教你在vue-cli里面使用vuex,以及vuex简介

    写在前面: 这篇文章是在vue-cli里面使用vuex的一个极简demo,附带一些vuex的简单介绍.有需要的朋友可以做一下参考,喜欢的可以点波赞,或者关注一下,希望可以帮到大家. 本文首发于我的个人 ...

  6. 浅析SIEM、态势感知平台、安全运营中心

    近年来SIEM.态势感知平台.安全运营中心等概念炒的火热,有的人认为这都是安全管理产品,这些产品就是一回事,有人认为还是有所区分.那么到底什么是SIEM.什么是态势感知平台.什么是安全运营中心,他们之 ...

  7. 第三章、vue基础精讲

    3.1VUE实例 组件:全局组件,局部组件,vue的每个组件也是一个实例,有自己的实例属性和实例方法. 在console中调试vue,vm为vue的实例,凡是以$开头的都是vue的实例属性或者vue的 ...

  8. 【vue】---- 图片懒加载

    1.作用 在图片较多的页面中,页面加载性能较差.使用图片懒加载可以让图片出现在可视区域时再进行加载,从而提高用户体验. 2.原理 设置img标签的src属性为空或统一的图片路径(如加载中样式),监听页 ...

  9. Overt.GrpcTemplate.Service 模板使用教程

    阅读这篇文章需要先阅读我的另外一篇文章,目前还未发布出来,待发布中... 1. Overt.GrpcTemplate.Service .Net Core 3.1 版本 模板名称改成 Overt.Grp ...

  10. C++ 理解类 和 类中的public、protected、private

    我们要明确,不只是C++有类,很多语言也会用到类,因为现在很多都是面向对象编程... 在c++中,关于类的理解,个人理解是这样的,具有共同属性的一个集合被称为类, 比如说人这个集合,具有性别,年龄,出 ...