文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處: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