首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Openlayers中的同一来源的WMS和WMTS图层之间切换时,可见的1像素偏移

在Openlayers中的同一来源的WMS和WMTS图层之间切换时,可见的1像素偏移
EN

Stack Overflow用户
提问于 2018-08-13 18:10:18
回答 1查看 178关注 0票数 1

我们有一个自定义的类似OSM的瓦片源,我们在Openlayers查看器中使用Mapproxy和showcase作为WMTS和WMS服务。

我们添加了一个图层切换控件来在两个图层之间切换,除了一个小的1像素偏移量外,它们显示得很好。在尝试使用"precompose“事件并设置WMS层的"event.frameState.pixelRatio”来弥补偏移量之后,我发现偏移量在某些缩放级别下是不同的。

例如,在缩放3和6时,我们必须应用(0,-1)偏移量,而对于缩放7,10,11等,我们必须将(0,1)偏移量应用于WMS层以匹配WMTS层。

我猜其中涉及一些舍入误差,这在WMS调用中是不可避免的?或者这个1像素的偏移量问题可以解决吗?

在QGIS中,当我引入两个图层时,它们似乎完全对齐。

EN

回答 1

Stack Overflow用户

发布于 2018-08-29 21:15:03

作为一个实验,您可能想要查看从基本XYZ源构造的层与每个源之间的行为。我没有你的层的细节,但是对于WMTS,你可以使用tileUrlFunction坐标来索引矩阵id,1和2表示列和行。对于WMS,除了BBOX之外,url中的参数可能是固定的,BBOX可以从tileUrlFunction坐标计算出来。以下是以这种方式实现的WMTS和WMS源代码的示例:

代码语言:javascript
运行
复制
source1: new ol.source.XYZ({
             attributions: [attribIGN],
             tileGrid: new ol.tilegrid.TileGrid({ resolutions: resolutions,
                                                  origin: origin, tileSize: tileSize }),
             tileUrlFunction: function(coordinate) {
                 return "https://wxs.ign.fr/" + keyIGN +
                        "/geoportail/wmts?layer=GEOGRAPHICALGRIDSYSTEMS.MAPS" +
                        "&style=normal&tilematrixset=PM&Service=WMTS&Request=GetTile&Version=1.0.0" +
                        "&Format=image%2Fjpeg&TileMatrix=" + ignMatrixIds[coordinate[0]] +
                        "&TileCol=" + coordinate[1] + "&TileRow=" + (-(coordinate[2]+1));
             },
         }),

source2: new ol.source.XYZ({
             attributions: [attribOSM],
             tileGrid: new ol.tilegrid.TileGrid({ resolutions: resolutions,
                                                  origin: origin, tileSize: tileSize }),
             tileUrlFunction: function(coordinate) {
                 return "http://129.206.228.72/cached/osm?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng" +
                        "&TRANSPARENT=true&LAYERS=osm_auto%3Aall&WIDTH=256&HEIGHT=256&SRS=EPSG%3A900913&STYLES=&BBOX=" +
                        this.getTileGrid().getTileCoordExtent(coordinate).toString();
             },
         }),
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51819909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档