最近有這樣一個需求,需要將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重定位,直接指向瓦片的物理路徑