注意:本文以iClient for Flex為例介紹有關WMTS圖層服務的對接使用情況,iClient的其他系列產品(如iClient for JavaScript/Silverlight)中具有相似的情況,可以參考本文的介紹。
TiledWMTSLayer是SuperMap iClient for Flex 提供的用於訪問WMTS服務的通用圖層。本文將主要介紹如何使用TiledWMTSLayer訪問WMTS服務,並就訪問第三方WMTS服務進行示范,希望為您的使用帶來方便之處。
1.WMTS服務與TiledWMTSLayer
WMTS (Web Map Tile Service) 是OGC 提出的緩存技術標准,即在服務器端緩存被切割成一定大小瓦片的地圖,對客戶端只提供這些預先定義好的單個瓦片的服務,將更多的數據處理操作如圖層疊加等放在客戶端,從而緩解 GIS 服務器端數據處理的壓力,改善用戶體驗。
WMTS 使用瓦片矩陣集(Tile matrix set)來表示切割后的地圖,如圖1所示。瓦片就是包含地理數據的矩形影像,一幅地圖按一定的瓦片大小被切割成多個瓦片,形成瓦片矩陣,一個或多個瓦片矩陣即組成瓦片矩陣集。不同的瓦片矩陣具有不同的分辨率,每個瓦片矩陣由瓦片矩陣標識符(一般為瓦片矩陣的序號,分辨率最低的一層為第0層,依次向上排)進行標識。

圖 1 瓦片矩陣集
TiledWMTSLayer是SuperMap iClient for Flex 提供的用於訪問WMTS服務的分塊緩存圖層,位於命名空間com.supermap.web.mapping下。TiledWMTSLayer具有通用性,支持任何符合ogc標准的WMTS服務。TiledWMTSLayer可通過HTTP KVP(Key-Value Pair)和 REST兩種方式訪問WMTS服務。
2. TiledWMTSLayer功能參數及使用
2.1 功能參數
要想成功訪問WMTS服務,需要為TiledWMTSLayer設置的參數有:WMTS服務地址(url)、要訪問的圖層名稱(layerName)、訪問方式(requestEncoding)和當前圖層(layerName)的具體信息參數。
l url必須是WMTS服務所在的根目錄,如
“http://192.168.169.63:8090/iserver/services/maps/wmts100”
l requestEncoding支持 HTTP KVP(Key-Value Pair)和 REST 兩種,由枚舉類RequestEncoding定義,默認值為RequestEncoding.REST。若想知道當前WMTS服務提供哪種訪問方式,可通過WMTS服務的Capabilities文檔查看。例如,訪問服務地址為: http://192.168.169.63:8090/iserver/services/maps/wmts100?SERVICE=WMTS&REQUEST=GetCapabilities,通過查看xml文檔的節點< ows:OperationsMetadata >可知曉該WMTS服務的操作GetCapablities和GetTile均支持KVP和REST問方式,如圖2所示。
這里,屬性TiledWMTSLayer.requestEncoding表示獲取瓦片GetTile的訪問方式。

圖 2 WMTS服務的訪問方式查看
l 當前圖層的具體信息設置參數,如表1所示。
表1被訪問圖層的參數設置
| 接口名稱 |
功能說明 |
| format : String |
請求的瓦片輸出格式,默認為:image/png |
| style : String |
被訪問圖層的風格 |
| tileMatrixSet : String |
瓦片矩陣集的唯一標識符。表示:訪問該圖層的哪個瓦片矩陣集? |
| tileMatrixIdentifiers : Array |
顯示級別名稱集合。表示:訪問tileMatrixSet對應的瓦片矩陣集的哪些級別?默認會顯示所有級別的地圖。 |
| wellKnownScaleSet : String |
標准比例尺集名稱。表示:客戶端出圖使用哪個標准對應的比例尺? 可選值有如下幾種:GlobalCRS84Scale、GlobalCRS84Pixel、GoogleCRS84Quad、GoogleMapsCompatible,這四種為 OGC WMTS 標准,若 wellKownScaleSet 值不屬於上述四種,則按默認值處理。 默認值為:中國地理信息公共服務平台電子地圖數據規范的比例尺級別以及屏幕分辨率。例如:天地圖WMTS服務就采用此默認值。 |

圖 3 圖層信息參數
對應於tileMatrixSet="GlobalCRS84Scale_World"的比例尺采用wellKnownScaleSet為"GlobalCRS84Scale",如圖4所示。

圖 4 瓦片矩陣信息
l 其余參數
version表示WMTS服務的版本,默認值為1.0.0。
enableGetCapabilities表示是否執行WMTS 服務的GetCapabilities 操作,從而獲取layerName對應的圖層信息(包括:bounds和layerName)和矩陣瓦片信息(包括:瓦片矩陣集標示符Identifier、當前圖層的坐標參考系CRS、標准比例尺名稱wellKnownScaleSet和瓦片矩陣數組tileMatrix)。
由此可知,當enableGetCapabilities為true時,TiledWMTSLayer的必設參數包括:layerName、tileMatrixSet、url,圖層的地圖范圍bounds采用GetCapabilities文檔表述中的值,如圖3所示;
當enableGetCapabilities為false時,TiledWMTSLayer的必設參數包括:tileMatrixIdentifiers、resolutions、layerName、tileMatrixSet、url,bounds采用默認值。有關 TiledWMTSLayer.bounds 屬性的默認值如表2所示。
表 2 TiledWMTSLayer.bounds 屬性的默認值

2.2如何使用
l 最簡單用法
| <ic:Map id="mymap" width="100%" height="100%"> <ic:TiledWMTSLayer url="http://192.168.169.63:8090/iserver/services/map-world/wmts100" layerName="World" tileMatrixSet="GlobalCRS84Scale_World"/> </ic:Map> |
l 完全參數設置
| <ic:TiledWMTSLayer url="http://192.168.169.63:8090/iserver/services/map-world/wmts100" requestEncoding="{RequestEncoding.REST}" layerName="World" tileMatrixSet="GlobalCRS84Scale_World" version="1.0.0" tileMatrixIdentifiers="{['0','1','2','3','4']}" format="image/png" style="default" wellKnownScaleSet="GlobalCRS84Scale"/> |
3.訪問第三方WMTS服務
TiledWMTSLayer是通用Layer,要求服務提供方的WMTS遵循ogc標准,表述文檔xml提供的服務參數正確、完整。若表述文檔不完整,或參數有誤,請與您的服務提供方聯系解決。
3.1訪問湖北天地圖WMTS服務
訪問湖北省天地圖公網WMTS服務,獲取圖層名為” hubeiVector”的xml文檔,摘出有用信息,如圖所5示。訪問地址:
http://www.tiandituhubei.com/newmapserver4/ogc/HBWMTS/hubeiVector/wmts?& SERVICE=WMTS&REQUEST=GetCapabilities 
圖5 天地圖湖北WMTS表述
天地圖WMTS服務表述未給出wellKnownScaleSet,應采用TiledWMTSLayer提供的默認值。示范代碼如下所示:
| <ic:TiledWMTSLayer url="http://www.tiandituhubei.com/newmapserver4/ogc/HBWMTS/hubeiVector/wmts" layerName="hubeiVector" tileMatrixSet="TileMatrixSet_0" tileMatrixIdentifiers="{['0','1','2']}" style="Default" /> |
編譯、運行上述代碼,不出圖!這是為什么呢?
具體查看湖北天地圖WMTS表述給出的瓦片矩陣是這樣描述的,如圖6所示。

圖6 湖北天地圖瓦片矩陣
而天地圖提供的比例尺數組(http://www.tianditu.com/guide/index.html)如圖7所示。

圖7 天地圖全球剖分比例尺數組
從圖7中,可以看到瓦片矩陣中第一個級別實際對應全球剖分比例尺數組中第15個級別,在數組中索引號為14。而TiledWMTSLayer第一次出圖,並未縮放到第15個級別(對應SuperMap iClient for Flex 中level=14),且地圖視野未在level=14的地圖范圍內,所以沒有出圖。
解決方法一:是不是使用Map.zoomToLevel()將地圖縮放到第14個級別就可以了呢?
在Map中圖層加載完成后,使用Map.zoomToLevel(level:int, point:Point2D=null)方法將地圖縮放到對應的級別,如下所示。其中參數point的可通過圖層的范圍中心取值,圖層范圍如圖8所示。
| protected function map_loadHandler(event:MapEvent):void { map.zoomToLevel(14,new Point2D(112.25,31)); } <ic:Map id="map" width="892" height="484" x="63" y="116" load="map_loadHandler(event)"> <ic:TiledWMTSLayer url="http://www.tiandituhubei.com/newmapserver4/ogc/HBWMTS/hubeiVector/wmts" layerName="hubeiVector" tileMatrixSet="TileMatrixSet_0" style="Default" tileMatrixIdentifiers="{['0','1','2']}"/> </ic:Map> |

圖8 圖層范圍
編譯、運行,這次出圖了!效果如圖9所示。

圖9 湖北天地圖WMTSLayer運行效果
但是,這個圖只有第14級別能正常出圖,放大到第15個級別就變成白圖了。這是因為TiledWMTSLayer在請求瓦片時,是根據瓦片的級別、行列號進行構建請求。具體過程為根據瓦片級別找到天地圖20個比例尺級別數組中對應的比例尺,從而與GetCapabilities得到的瓦片矩陣集比例尺數組匹配並得到瓦片矩陣級別符TileMatrix.Identifier。但是因為湖北天地圖第14個級別以后的比例尺數組與中國地理信息公共服務平台電子地圖數據規范的比例尺級別有差距,所以匹配不成功,導致瓦片請求錯誤。
解決方法二:因為天地圖湖北只有15、16、17三個級別的瓦片,且僅需顯示這三個級別,所以使用設置圖層分辨率數組的方式。需要設置的參數有:tileMatrixIdentifiers、resolutions、layerName、tileMatrixSet、url。這里需要特別注意,tileMatrixIdentifiers與resolutions是一一對應的。代碼如下所示:
| protected function map_loadHandler(event:MapEvent):void { map.panTo(new Point2D(112.25,31)); } <ic:Map id="map" width="892" height="484" x="63" y="116" load="map_loadHandler(event)"> <ic:TiledWMTSLayer url="http://www.tiandituhubei.com/newmapserver4/ogc/HBWMTS/hubeiVector/wmts" enableGetCapabilities="false" layerName="hubeiVector" tileMatrixSet="TileMatrixSet_0" style="Default" tileMatrixIdentifiers="{['0','1','2']}" resolutions="{[0.000042915344238281406,0.000021457672119140645,0.000010728836059570307]}"/> </ic:Map> |
編譯、運行,3個級別都出圖正確。
注:天地圖從0到19共20個級別的比例尺數組以及對應的分辨率數組分別為:
比例尺數組:
[295829355.45,147914677.73,73957338.86,36978669.43,18489334.72,
9244667.36,4622333.68,2311166.84,1155583.42,577791.71,
288895.85,144447.93,72223.96,36111.98,18055.99,
9028.00,4514.00,2257.00,1128.50,564.25]
分辨率數組:
[0.7031249999891485,0.35156249999999994,0.17578124999999997, 0.08789062500000014,0.04394531250000007,0.021972656250000007,
0.01098632812500002,0.00549316406250001,0.0027465820312500017,
0.0013732910156250009,0.000686645507812499,0.0003433227539062495,
0.00017166137695312503,0.00008583068847656251,0.000042915344238281406,
0.000021457672119140645,0.000010728836059570307,0.000005364418029785169,
0.000002682210361715995, 0.0000013411051808579975]
上述結果采用公式 換算得到。其中0.0254表示厘米與英寸之間的轉換關系,DPI為屏幕分辨率,DPI采用國家標准值96。
【注意】WMTS服務表述中瓦片矩陣集各級別的比例尺不是按嚴格全球剖分比例尺數組設置的,請按照方法二解決。而瓦片矩陣集各級別的比例尺形成的數組同全球剖分比例尺數組相同的,是可以正常出圖的。如WMTS服務地址為:http://2012api.tianditu.com/wmts/wmts?SERVICE=WMTS&REQUEST=GetCapabilities的表述就可正常出圖。
3.3訪問ArcGIS WMTS服務
訪問ArcGIS提供的在線WMTS服務,獲取圖層名為” WorldTimeZones”的xml文檔,摘出有用信息,如圖10、圖11所示。訪問地址:
http://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetCapabilities 
圖 10 訪問方式
由圖6可知,此WMTS服務支持Rest和KVP兩種訪問方式。但需要注意的是,Rest方式訪問切片地址不是WMTS的根目錄(關於WMTS的根目錄,請參見本文2.1節中參數url的介紹),所以在此采用KVP方式進行訪問緩存圖片。

圖 11 圖層信息參數
示范代碼如下所示:
| <ic:TiledWMTSLayer url="http://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS" version="1.0.0" layerName="WorldTimeZones" tileMatrixSet="GoogleMapsCompatible" style="default" wellKnownScaleSet="GoogleMapsCompatible" requestEncoding="{RequestEncoding.KVP}"/> |
運行效果如圖12所示。

圖12 運行效果
4.終了
雖然各家歷來對OGC的實現各有不同,慶幸還有有軟件兼容,要不然給開發人員帶來的痛苦絕對是血淋淋的,不相信你問問那些對接共享平台服務的兄弟們。
