nginx在代理轉發地圖瓦片數據中的應用


最近有這樣一個需求,需要將arcgis server發布的地圖瓦片放在移動硬盤中,系統演示的時候,直接調用本地的地圖瓦片,而非遠程的,主要是為了系統演示的時候加快地圖訪問速度。

而且需要在任意電腦運行,這就要求不能安裝笨重的arcgis server。

那么在不修改前端地圖代碼的情況下,如何做到這種效果呢?

在此,我們又想到了代理大佬nginx。

1、地圖瓦片請求URL規律

地圖瓦片可以用兩種形式的url

1)rest風格

http://IP:PORT/arcgis/rest/services/myMapServer/MapServer/tile/{TileMatrix}/{TileRow}/{TileCol}

2)  GET參數形式

http://IP:PORT/arcgis/rest/services/myMapServer/MapServer/WMTS?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE=Default&FORMAT=image%2Fpng&LAYER=myMapServer&TILEMATRIXSET=default028mm&TileMatrix={TileMatrix}&TileCol={TileCol}&TileRow={TileRow}

其中TileMatrix表示zoom層級,TileRow表示行號,TileCol表示列號,myMapServer是服務名稱

2、arcgis server 瓦片命名規律

arcgis server 的瓦片默認存儲在 arcgisserver\directories\arcgiscache\myMapServer\圖層\_alllayers 目錄下

其目錄結構為:

zoom層級文件夾命名規則:"L" + 長度為2位前面補零的10進制TileMatrix

行號文件夾命名規則:“R” + 長度為8位前面補零的16進制TileRow

列號文件夾命名規則:“C” + 長度為8位前面補零的16進制TileCol

     

3、nginx配置

nginx的工作就是:一旦發現有 前綴是 arcgis/rest/services/myMapServer 的HTTP請求,就先用正則表達式,找到URL重要的三個參數,TileMatrix、TileRow和TileCol

然后就按照上面列舉的地圖瓦片命名規則進行轉換

這里我們用到了openresty,而非官網的nginx,openresty的優勢在於可以用lua語言編寫腳本,讓nginx可能輕松編程。

下面是nginx配置中的核心代碼

location /arcgis/rest/services/MapServer/ {
  if ($request_uri ~* "TileMatrix=(.*)&TileCol=(.*)&TileRow=(.*)") {
    set_by_lua $TileMatrix "return string.format('%02d', ngx.arg[1]);" $1;
    set_by_lua $TileCol "return string.format('%08x', ngx.arg[1]);" $2;
    set_by_lua $TileRow "return string.format('%08x', ngx.arg[1]);" $3;
  }
  rewrite ^.*.*$ /data/MapServer/圖層/_alllayers/L$TileMatrix/R$TileRow/C$TileCol.png last;
}

 

其中:set_by_lua就是openresty中的語法,用lua語句塊設置變量值,可以看到,用lua很方便的將行列號轉換成了16進制的8字符串

           然后再利用rewrite實現url重定位,直接指向瓦片的物理路徑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM