越学习openlayer你会发现openlayer是真的很强大,今天记录一下学习的成果,需求是做那种室内的CAD的场景然后里面展示人员icon并且实时展示人员的位置信息,以及点击弹出对应人员的一些位置信息,姓名,电话等等,这个在工业互联网中是很常见的,接下来就开始操作了

由于我是在vue+ts中写的,所以下面的代码片段可能是基于vue来写的

第一步,我们需要建立一个底图,这个底图可以是谷歌地图也可以是我们拿到的cad渲染出来的静态底图

let extent = [pointer.x, pointer.y, pointer2.x, pointer2.y]; // 图片图层四至
// pointer pointer2分别是静态图片左下角和右上角的基于基站的坐标
console.log(extent)
let projection = new olprojProjection({
code: "xkcd-image",
units: "pixels",
extent: extent
});
this.map = new olMap({
target: DOM接点的ID,
layers: [
new ollayerImage({
source: new olsourceImageStatic({
url: 静态图片的地址, // 静态地图,如果是本地的,在vuecli3中将图片放在public里
projection: projection,
imageExtent: extent // 映射到地图的范围
})
})
],
view: new olView({
center: getCenter(extent),
projection: projection,
zoom: 2.2,
minZoom: 1,
maxZoom: 12
}),
// 加载控件到地图容器中
// 加载鼠标位置控件
controls: defaults().extend([mousePositionControl])
});

第二步,底图建立好之后,接下来绘制人员图标,我这边和后台的数据对接方式是ws,就是后台实时推送人员的位置信息,前端渲染,这个时候很刚入学者会每个icon建立一个layer,其实不是这样的,你可以先建立一个定位图层layer,一个layer一个source就可以了,

新建定位图层

 // 创建定位图层
this.positionLayer = new ollayerVector({
source: new olsourceVector(),
style: new olstyleStyle()
})
this.map.addLayer(this.positionLayer)

然后拿到数据之后,我这边获取的数据接口是一个list,也就是一个数组,需要for循环来添加icon

list.forEach((value: any, index: number) => {
let time = new Date().getTime()
if (!that.personListCache.has(value.id)) {
// 绘制人员定位信息
let personS = that.createPerson(value)
console.log(value)
console.log(personS)
that.personListCache.set(value.id, { spriteObj: personS, lastModified: time })
} else {
let personIn = that.personListCache.get(value.id)
// console.log(personIn.spriteObj.getGeometry().getCoordinates())
// var geometry = new olgeomPoint([value.x, value.y])
// personIn.spriteObj.setGeometry(geometry)
personIn.lastModified = time
if (personIn) {
personIn.oldObj = {
x: personIn.spriteObj.getGeometry().getCoordinates()[0],
y: personIn.spriteObj.getGeometry().getCoordinates()[1]
}
personIn.newObj = {
x: value.x,
y: value.y
}
if (personIn.oldObj.x === personIn.newObj.x && personIn.oldObj.y === personIn.newObj.y) {
// that.updataPersonPos(personIn)
} else {
that.updataPersonPos(personIn)
}
}
}
})

建立一个map的原因是,后台不确定是否会新增重复的人员给我,故建立一个map对象判断是否以及绘制在底图上,如果绘制在底图上了,那么只用改变他的位置也就是xy或者说是经纬度,如果没有就去调用createPerson方法去绘制icon

createPerson(value: any) {
var startMarker = new olFeature({
type: 'person',
msg: value,
geometry: new olgeomPoint([value.x, value.y])
})
let srcImg = value.type === 'type1' ? './images/type1.png' : value.type === 'type2' ? './images/type2.png' : './images/type3.png'
var startStyle = new olstyleStyle({
image: new olstyleIcon({
anchor: [0.5, 0.5],
scale: 0.3,
src: srcImg,
imgSize: [117, 158]
}),
text: new Text({
text: value.name,
// font: '14px font-size',
padding: [4, 7, 4, 7],
fill: new Fill({ color: '#fff' }),
backgroundFill: new Fill({ color: '#3737379e' }),
offsetY: -34
})
})
startMarker.setStyle(startStyle)
this.positionLayer.getSource().addFeature(startMarker)
return startMarker
}

注意红色部分,很关键,第一次的我是直接把startStyle放到了positionLayer上,导致绘制出来的所有的icon的信息都是一样的,至于上面的三目运算大家应该知道,icon的类型不一样绘制出来的图标也是需要不一样的

好了,自定义底图上添加静态icon就完成了,

接下啦看看效果图吧,底图我随便换了一个静态图片,icon也是

索嘎,完工

openlayers在底图上添加静态icon的更多相关文章

  1. Windows 系统cmd设置添加静态路由方式

    电脑上添加静态路由,cmd设置路由 方法/步骤 1.首先在“运行”窗口输入cmd(按WIN+R打开运行窗口),然后回车进入命令行,输入 route  add  10.253.251.0  mask   ...

  2. Windows 系统PowerShell或cmd设置添加静态路由方式

    电脑上添加静态路由,PowerShell或cmd设置路由 方法/步骤1.首先以管理员身份在“运行”窗口输入cmd或PowerShell(按WIN+R打开运行窗口),然后回车进入命令行,输入 route ...

  3. Redhat、CentOS添加静态路由的标准方法

    我们经常遇到需要在系统默认路由的基础上,额外添加静态路由的需求.为了使得下次系统启动这些静态路由依旧生效,我们可能采取在rc.loal里加入route命令追加静态路由的方法. 现在给大家推荐Redha ...

  4. google maps js v3 api教程(2) -- 在地图上添加标记

    原文链接 google maps javascript官方文档:https://developers.google.com/maps/documentation/javascript/ 我们在创建地图 ...

  5. 关于iOS上的静态库

    最近再进行项目的真机调试,然后发现了一个天坑.就此研究了一些iOS上的静态库的使用: 首先我们是直接拿一个可以运行的项目来制作静态库的,网上大部分都是先创建静态库然后再写内容,看看我的方法. 1.把子 ...

  6. 在地图上添加POI

    使用Tangram的Marker, 可以在地图上做各种标记, 效果图: Tangram是通过Marker在地图上添加标记的,Marker分Point, Polyline和Polygon三种, 分别对应 ...

  7. django添加静态文件

    最近做了一个todolist webapp,需要稍微添加css时候又忘记django的添加方法了,查看了以前的项目才想起来,所以记录一下. 1.settings.py 将以下代码放到最下面 STATI ...

  8. Android UI ActionBar功能-在 Action Bar 上添加按钮

    在ActionBar上添加按钮实现某些功能最常见的Application的功能如:在ActionBar上添加一个搜索按钮: 首先官方文档说明:http://wear.techbrood.com/tra ...

  9. 【百度地图API】建立全国银行位置查询系统(三)——如何在地图上添加银行标注

    原文:[百度地图API]建立全国银行位置查询系统(三)--如何在地图上添加银行标注 <摘要>你将在第三章中学会以下知识: 如何在地图上添加带银行logo的标注?(你也可以换成商场logo, ...

随机推荐

  1. strcspn()函数

    函数描述: 检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符. 函数声明: #include<string.h> size_t strcspn(const char ...

  2. Sharding-JDBC:查询量大如何优化?

    主人公小王入职了一家刚起步的创业公司,公司正在研发一款App.为了快速开发出能够投入市场进行宣传的版本,小王可是天天加班到很晚,忙了一段时间后终于把第一个版本赶出来了. 初期功能不多,表也不多,用的M ...

  3. geth 基本使用

    概要 geth 是以太坊的官方 golang 客户端. 通过 geth 的使用可以直观的了解以太坊, 乃至区块链的运作. 下面, 通过 geth 来构造一次搭建私链, 创建账户, 挖矿, 交易的流程. ...

  4. es6中reduce()方法和reduceRight()方法

    es6中reduce()方法从左往右开始 参数:prev:它是上一次调用回调时返回的结果,每次调用的结果都会给prev cur:当前的元素 index:当前的索引 arr:循环的数组 返回值:函数累计 ...

  5. javascript 写一个 map方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. C# 消息队列之 RabbitMQ 基础入门

    Ø  简介 C# 实现消息队列的方式有很多种,比如:MSMQ.RabbitMQ.EQueue 等,本文主要介绍使用 RabbitMQ 实现消息队列的基础入门.包括如下内容: 1.   什么是消息队列? ...

  7. 也作一下装配脑袋的Expression习题【转】

    一.习题 http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html 二.参考 http://msdn.micro ...

  8. Neo4j 第十篇:更新数据

    更新图包括图的节点和关系的创建.更新和删除,也能更新图的节点和关系的属性.节点标签和关系类型. 一,创建节点 1,创建空的节点 CREATE (n) CREATE (a),(b) 2,创建带标签的节点 ...

  9. webapi 导入excel处理数据

    参考资料     https://blog.csdn.net/pan_junbiao/article/details/82935992 https://www.cnblogs.com/dansedia ...

  10. 写入文件writelines 换行问题

    知识点:在python中没有数组的概念,有列表.元组.字典的概念 问题描述: 在写循环语句的时候,我需要把输出的列表存放到文件上,但是如果没有换行的话,存下的文件就是一坨的字. 所以在存入文件的时候就 ...