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

时间:2018-08-13 10:10:18

标签: openlayers wms

我们有一个类似于OSM的自定义图块源,我们同时使用Mapproxy充当WMTS和WMS服务,并在Openlayers查看器中进行展示。

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

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

我猜想其中涉及一些舍入错误,这是WMS调用不可避免的吗?还是可以解决此1像素偏移问题?

在QGIS中,当我将两层都放入时,它们似乎完美对齐。

1 个答案:

答案 0 :(得分:1)

作为一个实验,您可能想了解从基本XYZ源和自定义图块网址构建的图层在每个源中的行为。我没有您图层的详细信息,但是对于WMTS,您将使用tileUrlFunction坐标[0]来索引矩阵ID,其中[1]和[2]给出列和行。对于WMS,URL中的参数可能会与BBOX固定,而BBOX可以从tileUrlFunction坐标计算得出。以下是以这种方式实现的WMTS和WMS源的示例:

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();
             },
         }),