基于SuperMap iClient加载WMTS服务
注意:本文以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的实现各有不同,庆幸还有有软件兼容,要不然给开发人员带来的痛苦绝对是血淋淋的,不相信你问问那些对接共享平台服务的兄弟们。