Openlayers4+servlet实现切片的本地缓存
来源:互联网 发布:网上免费打电话软件 编辑:程序博客网 时间:2024/05/22 13:53
概述
本文实现的是结合Openlayers4和java servlet实现公网资源切片的本地缓存。
优点
相比较其他下载利器,本实例具有以下优点:
1. 实现简单,操作简单;
2. 不会出现IP被封;
3. 结合web,看到哪下到哪,主动保存未缓存的切片;
4. 可通过修改URL和代码缓存多种地图切片。
缺点
鉴于web的实现,该切片缓存的方式具有以下缺点:
1. 被动式缓存,需要用户浏览需要下载的区域;
2. 无法批量缓存。
3. 主要是针对开发人员的,非开发人员使用有困难;
实现效果
实现思路
实现代码
页面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>切片下载</title> <link rel="stylesheet" href="https://openlayers.org/en/v4.1.1/css/ol.css" type="text/css"> <style type="text/css"> body, #map { border: 0px; margin: 0px; padding: 0px; width: 100%; height: 100%; font-size: 13px; overflow: hidden; } </style> <script src="https://openlayers.org/en/v4.1.1/build/ol.js"></script> <script type="text/javascript" src="plugin/jquery/jquery-3.1.1.min.js"></script> <script type="text/javascript"> var map; function init(){ var cva_w = getGeoheyLayer("blue"); var province = new ol.layer.Image({ source: new ol.source.ImageWMS({ ratio: 1, url: 'http://localhost:6080/geoserver/bj_grid/wms', params: { 'FORMAT': 'image/png', 'VERSION': '1.1.1', STYLES: '', LAYERS: 'bj_grid:bou2_4p', } }) }); map = new ol.Map({ controls: ol.control.defaults({ attribution: false }), target: 'map', layers: [cva_w, province], view: new ol.View({ center: ol.proj.transform([104.214, 35.847], 'EPSG:4326', 'EPSG:3857'), zoom: 4 }) }); } function getGeoheyLayer(style){ var url = "http://localhost:8081/lzugis-web/tile?layer="+style+"&z={z}&x={x}&y={y}"; var layer = new ol.layer.Tile({ source: new ol.source.XYZ({ url:url }) }); return layer; } </script></head><body onLoad="init()"><div id="map"></div></body></html>
servlet代码
package com.lzugis.web.servlet;import com.lzugis.web.helper.CommonConfig;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.image.BufferedImage;import java.io.*;import java.net.HttpURLConnection;import java.net.URL;/** * Created by admin on 2017/9/10. */@WebServlet(description = "wms services", urlPatterns = {"/tile"})public class TileServiceServlet extends HttpServlet { private String url = "https://s4.geohey.com/s/mapping/"; private String tilepath = "d:/tile/geohey/"; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String x = request.getParameter("x"), y = request.getParameter("y"), z = request.getParameter("z"), layer = request.getParameter("layer"); StringBuffer tileUrl = new StringBuffer(); tileUrl.append(url); tileUrl.append(layer+"/all?"); tileUrl.append("z="+z+"&x="+x+"&y="+y); tileUrl.append("&retina=&ak=MGUxMmI2ZTk4YTVhNDEzYmJhZDJkNDM3ZWI5ZDAwOGE"); String tilefile = tilepath+layer+"/"+z+"/"+x+"_"+y+".png"; File tile = new File(tilefile); byte[] tileByte = null; /** * 如果文件存在,则直接读取文件 * 如果文件不存在,在先保存 */ if(tile.exists()){ tileByte = getFileBytes(tilefile); } else{ tileByte = getUrlBytes(tileUrl.toString()); saveTileFile(tileByte, tilefile); } OutputStream os = response.getOutputStream(); InputStream is = new ByteArrayInputStream(tileByte); try { int count = 0; byte[] buffer = new byte[1024 * 1024]; while ((count = is.read(buffer)) != -1) { os.write(buffer, 0, count); } os.flush(); } catch (IOException e) { e.printStackTrace(); } finally { os.close(); is.close(); } } private void saveTileFile(byte[] tileByte, String tilefile){ try { BufferedImage bi = null; bi = ImageIO.read(new ByteArrayInputStream(tileByte)); //判断文件夹是否存在,否则创建 File filetile = new File(tilefile); if (!filetile.getParentFile().exists()) { filetile.getParentFile().mkdirs(); } ImageIO.write(bi, "png", filetile); }catch (Exception e){ e.printStackTrace(); } } private byte[] getFileBytes(String tilefile){ byte[] buffer = null; try { File file = new File(tilefile); FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); byte[] b = new byte[1000]; int n; while ((n = fis.read(b)) != -1) { bos.write(b, 0, n); } fis.close(); bos.close(); buffer = bos.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer; } private byte[] getUrlBytes(String tilurl){ try { //new一个URL对象 URL url = new URL(tilurl); //打开链接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置请求方式为"GET" conn.setRequestMethod("GET"); //超时响应时间为5秒 conn.setConnectTimeout(5 * 1000); //通过输入流获取图片数据 InputStream inStream = conn.getInputStream(); //得到图片的二进制数据,以二进制封装得到数据,具有通用性 ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 while ((len = inStream.read(buffer)) != -1) { //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输入流 inStream.close(); //把outStream里的数据写入内存 return outStream.toByteArray(); } catch (Exception e) { e.printStackTrace(); } return null; }}
技术博客
CSDN:http://blog.csdn.NET/gisshixisheng
博客园:http://www.cnblogs.com/lzugis/
在线教程
http://edu.csdn.Net/course/detail/799
Github
https://github.com/lzugis/
联系方式
阅读全文
0 0
- Openlayers4+servlet实现切片的本地缓存
- openlayers4加载矢量切片
- Openlayers4中风场的实现
- openlayers4中闪烁点的实现
- 使用REST API 地图服务无法访问非本地的缓存切片
- openlayers4
- java对象本地缓存机制的实现
- Java 本地缓存的实现(转)
- Java8简单的本地缓存实现
- 分布式本地缓存的一种实现
- Openlayers4中地图的导出
- 一种缓存切片更新问题的解决方法
- iOS 本地缓存实现
- java实现本地缓存
- java本地缓存实现
- guava实现本地缓存
- 简单实现本地缓存
- GoogleMap切片下载的实现
- ios8随机mac功能
- 利用Echarts实现堆叠柱状图
- Path to Python(2)
- Linux虚拟机的登陆以及基础指令
- 顺序栈
- Openlayers4+servlet实现切片的本地缓存
- springboot学习笔记(八) Swagger2
- 提供读配置文件的监控服务器程序
- 详述 Mac 系统下安装及卸载 Python 的方法
- 老生常谈PHP位运算的用途
- React native 自定义弹窗(android使用原生ios弹窗)
- 大型站点SEO优化的核心重点
- 将注记feature添加到map中的方法。
- linux下nginx安装