概述

本文讲述如何结合WebSocket和Openlayers4实现地图内容的实时刷新。

需求概述

  1. 定时接受推送的数据(tif格式);
  2. 数据的预处理与加工(png格式);
  3. 推送到前端并展示。

实现效果

  1. 列表内容

实现思路

结合WebSocket实现数据加工完后,将结果推送到前端,并在前端展示。在本实例钟,使用了后台的定时刷新机制,模拟数据推送、数据加工这个流程。

实现代码

  1. pom配置
<dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>${springmvc.version}</version></dependency>
  1. SpringMVC中socket配置
    <!--websocket 配置--><bean id="websocket" class="com.lzugis.web.websocket.WebsocketEndPoint"/><websocket:handlers  allowed-origins="*"><websocket:mapping path="/websocket" handler="websocket"/><websocket:handshake-interceptors><bean class="com.lzugis.web.websocket.HandshakeInterceptor"/></websocket:handshake-interceptors></websocket:handlers>
  1. WebsocketEndPoint.java
package com.lzugis.web.websocket;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.Timer;
import java.util.TimerTask;@RequestMapping("/websocket")
public class WebsocketEndPoint extends TextWebSocketHandler {private Timer timer;private static int imgIndex = 0;private final String[] imgList = {"1.png","2.png","3.png","4.png","5.png","6.png"};@Overrideprotected void handleTextMessage(WebSocketSession session,TextMessage message) throws Exception {if(!session.isOpen()){timer.cancel();return;}super.handleTextMessage(session, message);session.sendMessage(message);}@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {timer = new Timer(true);long delay = 0;OrderTimeTask orderTimeTask = new OrderTimeTask(session);timer.schedule(orderTimeTask, delay, 5000);// 设定指定的时间time,此处为5s}class OrderTimeTask extends TimerTask{private WebSocketSession session;public OrderTimeTask(WebSocketSession session){this.session = session;}@Overridepublic void run() {try {String imgPath = imgList[imgIndex];TextMessage textMessage = new TextMessage(imgPath);handleMessage(session,textMessage);imgIndex++;if(imgIndex==imgList.length)imgIndex=0;} catch (Exception e){e.printStackTrace();}}}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {System.out.println("Connection Closed!");}
}
  1. HandshakeInterceptor.java
package com.lzugis.web.websocket;import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;import java.util.Map;public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request,ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes) throws Exception {return super.beforeHandshake(request, response, wsHandler, attributes);}@Overridepublic void afterHandshake(ServerHttpRequest request,ServerHttpResponse response, WebSocketHandler wsHandler,Exception ex) {super.afterHandshake(request, response, wsHandler, ex);}
}
  1. 前端代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>websocket</title><link rel="stylesheet" type="text/css" href="plugin/ol4/ol.css"/><style>body, #map {border: 0px;margin: 0px;padding: 0px;width: 100%;height: 100%;font-size: 13px;overflow: hidden;}#map{background: #000000;}</style>
</head>
<body>
<div id="map"></div>
<script src="plugin/ol4/ol.js"></script>
<script type="text/javascript">function getTdtSource(lyr) {var url = "http://t0.tianditu.com/DataServer?T=" + lyr + "&X={x}&Y={y}&L={z}";return new ol.source.XYZ({url: url});}var imgExtent = [12602145.594234122,4499928.8932888079,13294552.826968284,5266752.9429073939];var base_lyr = new ol.layer.Tile({source: getTdtSource("vec_w")});var anno_lyr = new ol.layer.Tile({source: getTdtSource("cva_w"),zIndex:1});var imgLayer = new ol.layer.Image({source: null,opacity:0.6});var projection = new ol.proj.Projection({code: 'EPSG:3857',units: 'm'});var map = new ol.Map({controls: ol.control.defaults({attribution: false}),target: 'map',layers: [base_lyr,anno_lyr,imgLayer],view: new ol.View({projection: projection,center: [12865951.743328119, 4887378.449630305],zoom: 8})});var websocket = null;//判断当前浏览器是否支持WebSocketif ('WebSocket' in window) {websocket = new WebSocket("ws://localhost:8081/lzugis-web/websocket");}else {alert('当前浏览器 Not support websocket')}//连接发生错误的回调方法websocket.onerror = function () {console.log("WebSocket连接发生错误");};//连接成功建立的回调方法websocket.onopen = function () {console.log("WebSocket连接成功");};//接收到消息的回调方法websocket.onmessage = function (event) {setMessageInnerHTML(event.data);};//连接关闭的回调方法websocket.onclose = function () {console.log("WebSocket连接关闭");};//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function () {closeWebSocket();};function setMessageInnerHTML(data) {var imgSource = new ol.source.ImageStatic({url: "imgs/"+data,imageExtent: imgExtent});imgLayer.setSource(imgSource);}//关闭WebSocket连接function closeWebSocket() {websocket.close();}
</script>
</body>
</html>

技术博客
CSDN:http://blog.csdn.NET/gisshixisheng
博客园:http://www.cnblogs.com/lzugis/
在线教程
http://edu.csdn.Net/course/detail/799
Github
https://github.com/lzugis/
联系方式

类型 内容
qq 1004740957
公众号 lzugis15
e-mail niujp08@qq.com
webgis群 452117357
Android群 337469080
GIS数据可视化群 458292378

结合WebSocket和Openlayers4实现地图内容的刷新相关推荐

  1. 用函数刷新页面内容比刷新页面要好

    用函数刷新页面内容比刷新页面要好 app中有时需要更新页面的内容,这个时候可以选择刷新该页面 但如果使用函数来更改页面的内容,效果会更好: 例如 转载于:https://www.cnblogs.com ...

  2. 加入依赖后刷新_和平精英海岛图神秘野区加入!地图没显示 刷新点在这儿

    海岛老司机,不浪不会玩斯基.各位好,我是难言的小跟班--浪斯基 随着和平精英新版本的更新,火力对决,P90冲锋枪,移动打药等新功能都已经加入到游戏中了,而新内容的上线也是受到了玩家的好评,尤其是火力对 ...

  3. Firefox浏览器中,input输入框输入的内容在刷新网页后为何还在?

    转自:http://www.webym.net/jiaocheng/473.html 这个问题比较容易解决,如果不希望浏览器保留以前输入的内容,只要给对应的 input 输入框加上以下参数: auto ...

  4. html中websocket获取数据,如何使用websocket从数据库中获取数据来刷新视图

    在标准的Web交互中,客户端(即您的Web浏览器)向您的服务器发送请求.您的服务器收到请求,然后发送回您的浏览器中显示的信息,然后终止连接. WebSockets是一种在客户端和服务器之间创建持久,双 ...

  5. span组件内容的刷新(笔记)

    span是最简单的容器,可以当作一个形式标签,其取值赋值方法有别于一般的页面元素.//赋值$("#spanid").html(value)//取值$("#spanid&q ...

  6. 清空div中的内容而不刷新整个页面_Vue中的$nextTick机制

    nextTick 出现的前提 因为Vue是异步驱动视图更新数据的,即当我们在事件中修改数据时,视图并不会即时的更新,而是等在同一事件循环的所有数据变化完成后,再进行视图更新.类似于Event Loop ...

  7. Swiper:无限循环滚动时出现空白页/页面内容不刷新

    问题描述 使用Swiper插件实现列表的无限循环滚动效果,记录遭遇的两个问题:①滚动到某页时界面显示空白:②用id唯一标识列表中需要动态改变的值,在改变某一id的div内容后,页面显示内容并未改变 问 ...

  8. java 不刷新页面_java – 更新jsp页面的内容而不刷新

    您应该考虑使用Ajax(jQuery是我的首选方法). 然后,这将触发一个控制器,该控制器将返回您想要的数据而不刷新页面. 所以,例如,如果你有一个login.jsp - Login Hello pl ...

  9. 高德地图android 缓存,高德地图定位不刷新,感觉有缓存

    /** * 仅获取定位(获取地址和经纬度) */ self.getAddr = function (callback) { //判断平台(安卓平台采用高德定位,ios平台采用系统定位)amapLBS ...

最新文章

  1. 管网环的闭合差c语言编程,最大环的闭合差管网平差
  2. 毕业使人头秃:发现自己的idea已经被人发表了,该怎么办?
  3. Arcgis mobile介绍
  4. hadoop 2.2.0 终于编译ok了
  5. 怎样用vc 做一个c语言,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  6. 区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一
  7. 获取标签的src属性兼容性
  8. Netty--Future和Promise
  9. SAP Spartacus 的会话管理 Session Management
  10. linux等陆不上ftp,vsftp连接不上解决方法
  11. 恐怖与暴力美学 + 妖魔化:《人皮客栈》观看笔记
  12. layui Form内容重置清空
  13. 找不到引道分区_惠普笔记本单固态分区教程
  14. CSP第23次 202109-4 收集卡牌 C语言答案
  15. java测试性能代码_关于性能:Java代码内部的基准测试
  16. 这几个方法让你学会PDF尺寸大小怎么调整
  17. 杨立昆怒怼机器人索菲娅:AI硬加人类意识是揠苗助长
  18. 23位华人学者入选!2022年ACM杰出会员名单公布!
  19. 收费短剧小剧场类影视小程序源码 支持多运营模式+详细搭建教程
  20. 世间安得双全法,不负如来不负卿。

热门文章

  1. ENVI 5.3 分类后类别合并
  2. 文件夹遍历的非递归实现
  3. 使用Vi编辑器编写Linux0.11程序并编译运行
  4. R语言时间序列分析小例
  5. java接受formdata文件上传_java后端发送formdata上传文件
  6. 写一段植物大战僵尸的代码用Python
  7. 提示:ERROR 1044 (42000): Access denied for user
  8. OpenEDX MOOC平台搭建笔记
  9. 华为《对话》德勤中国 探索数字经济新机遇、新思路
  10. C语言不挂科之我爱谭浩强——编程题拿高分(附例题答案和知识点详解)