OpenLayers加载不同WMTS服务

作者: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值,这样的话就能正常加载显示了。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的例子,展示如何使用OpenLayersWMTS服务: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>OpenLayers WMTS Example</title> <link rel="stylesheet" href="https://openlayers.org/en/latest/css/ol.css" type="text/css"> <script src="https://openlayers.org/en/latest/build/ol.js"></script> </head> <body> <div id="map" class="map"></div> <script type="text/javascript"> var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }), new ol.layer.Tile({ source: new ol.source.WMTS({ url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS', layer: 'WorldTimeZones', matrixSet: 'GoogleMapsCompatible', format: 'image/png', projection: 'EPSG:3857', tileGrid: new ol.tilegrid.WMTS({ origin: ol.extent.getTopLeft(ol.proj.transform([-180, 90], 'EPSG:4326', 'EPSG:3857')), resolutions: [ 156543.0339280410, 78271.51696402048, 39135.75848201023, 19567.87924100512, 9783.93962050256, 4891.96981025128, 2445.98490512564, 1222.99245256282, 611.49622628141, 305.7481131407048, 152.8740565703525, 76.43702828517624, 38.21851414258813, 19.10925707129406, 9.554628535647032, 4.777314267823516, 2.388657133911758, 1.194328566955879, 0.5971642834779395, 0.2985821417389697, 0.1492910708694849, 0.0746455354347424 ], matrixIds: [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21' ] }) }) }) ], view: new ol.View({ center: ol.proj.fromLonLat([0, 0]), zoom: 2 }) }); </script> </body> </html> ``` 在这个例子中,我们首先创建了一个OpenLayers地图对象。我们添了两个图层。第一个图层是使用OpenStreetMap数据源的瓦片图层。第二个图层是使用WMTS数据源的瓦片图层。 我们使用`ol.source.WMTS`类创建WMTS数据源。我们指定了WMTS服务的URL,图层名称,矩阵集,格式和投影。我们还指定了一个自定义瓦片网格,其中包含瓦片的分辨率和矩阵ID。 最后,我们在地图视图中设置了中心点和缩放级别。我们使用`ol.proj.fromLonLat`函数将经纬度坐标转换为Web Mercator投影坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值