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

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

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

  1. let extent = [pointer.x, pointer.y, pointer2.x, pointer2.y]; // 图片图层四至
  2. // pointer pointer2分别是静态图片左下角和右上角的基于基站的坐标
  3. console.log(extent)
  4. let projection = new olprojProjection({
  5. code: "xkcd-image",
  6. units: "pixels",
  7. extent: extent
  8. });
  9. this.map = new olMap({
  10. target: DOM接点的ID,
  11. layers: [
  12. new ollayerImage({
  13. source: new olsourceImageStatic({
  14. url: 静态图片的地址, // 静态地图,如果是本地的,在vuecli3中将图片放在public里
  15. projection: projection,
  16. imageExtent: extent // 映射到地图的范围
  17. })
  18. })
  19. ],
  20. view: new olView({
  21. center: getCenter(extent),
  22. projection: projection,
  23. zoom: 2.2,
  24. minZoom: 1,
  25. maxZoom: 12
  26. }),
  27. // 加载控件到地图容器中
  28. // 加载鼠标位置控件
  29. controls: defaults().extend([mousePositionControl])
  30. });

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

新建定位图层

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

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

  1. list.forEach((value: any, index: number) => {
  2. let time = new Date().getTime()
  3. if (!that.personListCache.has(value.id)) {
  4. // 绘制人员定位信息
  5. let personS = that.createPerson(value)
  6. console.log(value)
  7. console.log(personS)
  8. that.personListCache.set(value.id, { spriteObj: personS, lastModified: time })
  9. } else {
  10. let personIn = that.personListCache.get(value.id)
  11. // console.log(personIn.spriteObj.getGeometry().getCoordinates())
  12. // var geometry = new olgeomPoint([value.x, value.y])
  13. // personIn.spriteObj.setGeometry(geometry)
  14. personIn.lastModified = time
  15. if (personIn) {
  16. personIn.oldObj = {
  17. x: personIn.spriteObj.getGeometry().getCoordinates()[0],
  18. y: personIn.spriteObj.getGeometry().getCoordinates()[1]
  19. }
  20. personIn.newObj = {
  21. x: value.x,
  22. y: value.y
  23. }
  24. if (personIn.oldObj.x === personIn.newObj.x && personIn.oldObj.y === personIn.newObj.y) {
  25. // that.updataPersonPos(personIn)
  26. } else {
  27. that.updataPersonPos(personIn)
  28. }
  29. }
  30. }
  31. })

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

  1. createPerson(value: any) {
  2. var startMarker = new olFeature({
  3. type: 'person',
  4. msg: value,
  5. geometry: new olgeomPoint([value.x, value.y])
  6. })
  7. let srcImg = value.type === 'type1' ? './images/type1.png' : value.type === 'type2' ? './images/type2.png' : './images/type3.png'
  8. var startStyle = new olstyleStyle({
  9. image: new olstyleIcon({
  10. anchor: [0.5, 0.5],
  11. scale: 0.3,
  12. src: srcImg,
  13. imgSize: [117, 158]
  14. }),
  15. text: new Text({
  16. text: value.name,
  17. // font: '14px font-size',
  18. padding: [4, 7, 4, 7],
  19. fill: new Fill({ color: '#fff' }),
  20. backgroundFill: new Fill({ color: '#3737379e' }),
  21. offsetY: -34
  22. })
  23. })
  24. startMarker.setStyle(startStyle)
  25. this.positionLayer.getSource().addFeature(startMarker)
  26. return startMarker
  27. }

注意红色部分,很关键,第一次的我是直接把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. golang--单元测试综合实例

    实例说明: (1)一个Monster结构体,字段Name,Age,Skill (2)Monster有一个Store方法,可以将一个Monster对象序列化后保存在文件中: (3)Monster有一个R ...

  2. 聊一下,前后分离后带来的跨域访问和cookie问题

    在谈前后分离前,我们先看看什么是前后一体的.当我们用javaweb开发网站时,最终我们渲染的jsp或者springthymeleaf.我们的页面其实是WEB-INFO或者templates下.当用户请 ...

  3. 我的周记13——”离开,是为了更好的回来"

    一点分享 生存是一种即时策略游戏,所有的人都是这场游戏的玩家.财务自由了,就是游戏赢家. 具体来说,又分成两种游戏:财富游戏和地位游戏.财富游戏的玩家追求更多的财富,地位游戏的玩家追求更高的地位. 古 ...

  4. JAVA 统计字符串中中文,英文,数字,空格,特殊字符的个数

    引言 可以根据各种字符在Unicode字符编码表中的区间来进行判断,如数字为'0'~'9'之间,英文字母为'a'~'z'或'A'~'Z'等,Java判断一个字符串是否有中文是利用Unicode编码来判 ...

  5. Logstash:处理多个input

    Logstash:处理多个input Logstash的整个pipleline分为三个部分: input插件:提取数据. 这可以来自日志文件,TCP或UDP侦听器,若干协议特定插件(如syslog或I ...

  6. yum 找不到程序,yum更换国内阿里源

    使用百度云服务器,发现百度yum源非常不稳定,果断采用阿里源,操作步骤如下: 一.备份 $ cd /etc/yum.repos.d/ $ mv baidu-bcm.repo baidu-bcm.rep ...

  7. 【Python】运算符

    python是强类型语言,某些场合下需要进行类型转换.关系运算符的结果是true或false.这里介绍一下基本的运算符,和几个使用实例,了解并掌握python中range()函数和math类库的引入和 ...

  8. keepalived+Nginx实现主备保障Nginx的高可用。

    1.什么是keepalived? Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障. Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工 ...

  9. ASP.NET Core快速入门(第2章:配置管理)--学习笔记

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务9:配置介绍 命令行配置 Json文件配置 从配置文件文本到c#对象实例的 ...

  10. 绑定 Binding Path=.,Binding.,Binding Source={StaticResource ResourceKey="Hello"} xmlns:sys="clr-namespace:System;assembly=mscorlib"

    xmlns:sys="clr-namespace:System;assembly=mscorlib" <Window.Resources> <Style Targ ...