後臺第三方瓦片數據實時緩存方案

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

                                                              若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^ui

                                                                                                     

相關文章
相關標籤/搜索