作者:yyy
前言
WMTS,Web地图瓦片服务(Web Map Tile Service)当前版本是1.0.0。WMTS标准定义了一些操作,这些操作允许用户访问瓦片地图。WMTS可能是OGC首个支持RESTful访问的服务标准。SuperMap iServer支持发布WMTS 1.0.0标准的服务,同时提供一个兼容《地理信息公共服务平台电子地图数据规范》中地图分级标准的服务。
WMTS服务包含的信息介绍
在常规的WMTS服务中会包含以下参数和信息:
<ows:Get> | wmts服务地址 |
<ows:Title> | 图层名 |
<ows:Identifier> | 标识符 |
<ows:LowerCorner> <ows:UpperCorner> | 显示范围 |
<TileWidth> <TileHeight> | 瓦片大小 |
<ScaleDenominator> | 比例尺分母 |
<ows:Identifier> | 显示级别 |
<Resolution> | 分辨率 |
在openlayers中我们主要是需要用到下面这些参数:
resolutions | 分辨率数组 |
layer | 图层 |
matrixSet | 瓦片矩阵集 |
origin、extent | 源点、范围 |
一、OpenLayers加载iServer发布的WMTS服务
1、加载标准wmts100、wmts-china服务
这里以加载iServer发布的wmts100服务为例,我们通过使用固定公式求出的分辨率加载来设置自定义resolutions分辨率数组加载。
在iServer发布的wmts服务中,每个层级都会带有当前级别下的resolution分辨率值,我们可以通过直接获取该值后在前端使用,也可以通过下面公式用wmts服务中已知的比例尺分母ScaleDenominator值来转换得到分辨率数组。
var resolutions = [156543.0339280409, 78271.51696402059,39135.75848201029, 19567.879241005117, 9783.939620502559, 4891.969810251267, 2445.9849051256388, 1222.9924525628205, 611.4962262814089, 305.7481131407058, 152.87405657035237, 76.43702828517618, 38.218514142588226]; var matrixIds = []; for(var z=0; z<13; ++z){ // resolutions[z] = 156543. 033928041 / Math.pow(2, z); matrixIds[z] = z; } |
加载显示效果:
2、自定义wmts服务加载
通过在iServer中新建wmts服务接口,然后自定义比例尺集,选择发布为新建的wmts服务类型,最后再在前端加载。
然后我们会在已经发布的wmts服务的服务接口处再勾选自定义的wmts11接口保存后,会出现一个新的wmts服务,在这个wmts服务中我们可以再通过获取Resolution来得到一个新的分辨率数组,然后我们拿到这个新的分辨率数组在前端加载。
加载显示效果:
PS:与1中使用默认的wmts100服务相比,因为两者加载使用的比例尺、分辨率不同,所以两者的显示效果也有明显不同。
二、OpenLayers加载非iServer发布的WMTS服务
在平常项目中我们获得到的wmts服务并不是通过iServer发布的wmts服务,那这个时候应该怎么用openlayers使其能正常加载显示出来呢?下面我们可以从两个方面来实现。
1、通过iServer转发获得到的wmts服务后再加载
在iServer中,我们可以转发其他平台提供的wmts服务,只需要填写相应的wmts服务地址后就可以得到一个新的wmts服务。然后我们就可以从这个新的wmts服务中获取到Resolution,然后再在前端加载并配置相应参数即可正常显示了。
加载显示效果:
2、直接加载wmts,需手动转换参数后再加载
如果不想再通过iServer转发,直接加载当前的wmts服务,我们需要注意在加载时的一些参数设置问题。比如在非iServer发布的wmts服务地址中,我们只能得到相应的参数ScaleDenominator比例尺分母,那么这里就需要我们手动将参数进行转换得到我们想要的resolutions分辨率数组。
按照公式 Scale = 1 : (Resolution * PPI/0.0254) 重新获取resolutions再在前端加载,这里由于添加的是wmts服务,PPI值选择90.7142857142857。
注意:通过公式 Scale = 1 : (Resolution * PPI/0.0254) 得到的Scale跟在wmts服务中显示的ScaleDenominator参数不是一个意思。Scale表示的是比例尺,ScaleDenominator表示的是比例尺分母,而前端最终设置的resolutions集合。(Scale = 1/ScaleDenominator)
总结
当我们拿到一个wmts服务时,我们需要先对这个wmts服务做判断,拿到其相应的参数信息,然后再对这个参数进行调整,使其能够在前端中调用加载。
注1:如果加载的wmts服务坐标系是4326时我们该怎么调整呢?
openlayers默认情况下加载的是3857坐标系服务(以米为单位),当加载的是4326坐标系服务时(以度为单位),就需要先计算后再转单位。
比例尺、分辨率计算公式:Scale = 1 : (Resolution * PPI/0.0254)
Scale = 1/ScaleDenominator
度、米转换公式:degree = meter / (2 * Math.PI * 6371004) * 360; 其中Math.PI可以取3.14
通过这两个公式,我们就可以得到一个全新的分辨率数组值,然后我们再拿到这个值在前端使用,就可以正常加载显示了。
注2:当我们需要将这个wmts服务在前端加载,并将其叠加到其他地图或底图时出现偏移该怎么解决呢?
出现叠加wmts服务偏移的情况主要是因为DPI(PPI)屏幕分辨率问题导致的,默认情况下DPI为96,但对于 WMTS 1.0.0接口而言,DPI≈90.714。对于这里我们可以通过以下两个方面来调整:
1)可以将这个服务在iServer中转发,然后手动调整DPI的值,然后直接拿到前端中再加载后就可以去调整了,如果调整完DPI后还是有偏移,建议您根据当前的偏移量来调整您的DPI值。
2)按照注1中的比例尺与分辨率计算公式,手动调整PPI(DPI)的值,然后获取到新的分辨率值后再做叠加操作。
注3:当出现上述的注1、注2调整后wmts服务还是无法加载时,还能从哪方面来定位问题呢?
如果按照上述的方法还是无法加载,这个时候我们就需要去判断当前加载不出来的wmts服务其参数中的TileWidth和TileHeight值是否是256*256,因为在一般的wmts服务中,<TileWidth>和<TileHeight>默认块大小都是256,但有的wmts服务其默认的<TileWidth><TileHeight>却是其他值,比如这里的wmts服务其默认值就是512*512,那么这个时候我们就需要在前端中手动调整其块大小tileSize值,这样的话就能正常加载显示了。