文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/前端
一周前因为国家天地图升级,形成多个项目地图没法显示。问题缘由在于前端直接在线请求的天地图WMTS服务,未进行缓存,因此当天地图服务关闭后我方也被波及。采用前端直接获取服务自己仍是有很多优势:后端
可是为马上处理业主提出的后续优化方案,我基于已有的瓦片趴取工具,提出了总体瓦片预先缓存的方案。将缓存工具提供给工程让其在天地图恢复后进行瓦片下载,后续全部请求均走本地瓦片。可是该方案是存在两个自然弊端的:浏览器
在必须采用缓存策略的状况下,如何能够减小现场实施同事的工做量?这里提出后台瓦片实时缓存方案。缓存
该方案对应的编码涉及到前端瓦片请求URL的重构和后端对应的瓦片缓存逻辑实现。微信
所谓瓦片请求只是一种泛称,具体到类型能够分为不少种,好比通用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; }
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(); }
可见前端请求后的瓦片在后台都进行了缓存。再次请求时将直接获取缓存瓦片。工具
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/优化
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^ui