zoukankan      html  css  js  c++  java
  • 后台第三方瓦片数据实时缓存方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

    1.背景

    一周前由于国家天地图升级,造成多个项目地图无法显示。问题原因在于前端直接在线请求的天地图WMTS服务,未进行缓存,所以当天地图服务关闭后我方也被波及。采用前端直接获取服务本身还是有不少优点:

    • 互联网服务本身已进行了各种加速优化
    • 与采用CDN原理相同,避免请求造成我方后台压力过大,并且可以规避浏览器对同一IP请求时并发数量限制

    但是为立刻处理业主提出的后续优化方案,我基于已有的瓦片趴取工具,提出了整体瓦片预先缓存的方案。将缓存工具提供给工程让其在天地图恢复后进行瓦片下载,后续所有请求均走本地瓦片。但是该方案是存在两个天然弊端的:

    • 如果需要展示的范围过大,下载数据非常耗时
    • 无法自动更新,数据更新后又要重新下载更新

    在必须采用缓存策略的情况下,如何可以减少现场实施同事的工作量?这里提出后台瓦片实时缓存方案。

    2.方案设计

    • 在线瓦片请求首先转发至后端
    • 后端根据传入的layername、level、col、row,去查找本地是否有对应的缓存瓦片
    • 若没有则根据传入的原始瓦片URL请求下载对应瓦片,将下载的瓦片缓存至本地对应的目录下,并同时将下载的数据返回前端
    • 若有则直接读取本地瓦片返回前端

    该方案对应的编码涉及到前端瓦片请求URL的重构和后端对应的瓦片缓存逻辑实现。

    3.方案实现

    3.1前端请求重构

    所谓瓦片请求只是一种泛称,具体到类型可以分为很多种,比如通用Webtile类型、百度地图类型、WMStile类型(用WMS服务来模拟瓦片请求)等等。以通用的Webtile为例:

    getTileUrl:function(level, row, col){
    	var tileUrl = "";
    	var levelValue = this._levelToLevelValue[level];			
    	var scale = this.tileInfo.lods[level].scale; 
    	tileUrl = this.urlTemplate.replace(/${level}/gi, levelValue).replace(/${row}/gi, row).replace(/${col}/gi, col).replace(/${scale}/gi, scale).replace(/${layer}/gi, this.layername);			
    	if(this.useProxy==1){
    		tileUrl=gis.global.tileCahceUrl+"?layerName="+encodeURI(this.layerName)+"&level="+
    		levelValue+"&col="+col+"&row="+row+"&raw="+encodeURIComponent(tileUrl);
    	}
    	tileUrl = this.addTimestampToURL(tileUrl);
    	return tileUrl;		
    }

    3.2后台对应模块实现

    BufferedInputStream bis = null;
    OutputStream os = null;
    byte[] buf = new byte[1024];
    int len = 0;
    bis = new BufferedInputStream(is);
    os = response.getOutputStream();
    FileOutputStream fos = null; 	
    if (!hasFile) {
    	// 若不存在,则判断文件路径中各文件夹是否存在,
    	if (!file.getParentFile().exists()) {
    		file.getParentFile().mkdirs();
    	}
    	fos = new FileOutputStream(file); 			  
    }
    
    while ((len = bis.read(buf)) != -1) {
    	os.write(buf, 0, len);
    	if(!hasFile){
    		fos.write(buf,0,len);
    	}
    }
    bis.close();
    is.close();
    os.close();
    if(!hasFile){
    	fos.close();
    }

    4.效果展示

    可见前端请求后的瓦片在后台都进行了缓存。再次请求时将直接获取缓存瓦片。

    5.几点优化

    • 设置清空缓存数据参数。当该参数开启时自动清除所有缓存,以最新瓦片进行再次缓存
    • 后端与地图图片自动生成相关的模块也均需调用缓存瓦片获取接口
    • 配置控制是否开启缓存机制,避免不必要的频繁瓦片请求给后端造成压力  

                     -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                  如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                                                                                         

  • 相关阅读:
    只有APE文件的情况下自己制作CUE文件的方法转,经过本人验证真实可靠good!20101128终极解决版
    无法加载登录用户界面DLL MyGina.dll 解决
    sql2000_简单入门,以前的笔记
    dell_又一例:raid的变化(断电后,可能没有电池造成)
    MSSQL使用帮助租赁空间后的数据库链接
    PS创建动作并利用批处理命令自动处理多图片转
    office2003修复安装,缺少SKU011.CAB文件_解决
    使用双wan口的企业/校园网解决方案初探
    我机也中病毒MS Driver Management Service(原创)
    win2003开机有问题:Windows 无法查询 {7B849a69220F451EB3FE2CB811AF94AE} 的 DllName 注册表项,它将不会被加载。最有可能的原因是注册错误。
  • 原文地址:https://www.cnblogs.com/naaoveGIS/p/8822362.html
Copyright © 2011-2022 走看看