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

在Openlayers中同一源的WMS和WMTS层之间切换时可见的1像素偏移,openlayers,wms,Openlayers,Wms,我们有一个自定义的OSM-like tile源,我们在Openlayers查看器中使用Mapproxy和showcase作为WMTS和WMS服务 我们添加了一个层切换器控件在两个层之间进行切换,除了一个小的1像素偏移外,它们显示得很好。在使用“precompose”事件并设置WMS层的“event.frameState.pixelRatio”尝试弥补偏移量之后,我发现偏移量在某些缩放级别上有所不同 例如,在缩放3和6时,我们必须应用(0,-1)偏移,对于缩放7、10、11等,我们必须对WMS层应

我们有一个自定义的OSM-like tile源,我们在Openlayers查看器中使用Mapproxy和showcase作为WMTS和WMS服务

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

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

我想可能会有舍入误差,这是WMS呼叫无法避免的?或者这个1像素偏移问题可以解决吗


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

作为一个实验,您可能想看看使用基本XYZ源和自定义平铺URL构建的层在每个源中的行为。我没有您的层的详细信息,但是对于WMT,您可以使用tileUrlFunction坐标[0]索引矩阵id,[1]和[2]给出列和行。对于WMS,url中的参数可能是固定的,而BBOX可以从tileUrlFunction坐标计算出来。以下是以这种方式实施的WMT和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();
             },
         }),

当我将IGN France层定义为一个简单的XYZ时,我得到了质量明显更好的重投影。我怀疑这种差异可能是由于通常的WMTS设置使用ol.tilegrid.WMTS而不是ol.tilegrid.tilegrid造成的。了解这一点很有用,但我们的代码用于演示如何在WMTS和WMS实现中使用自定义映射。我将把它作为OL社区的bug请求。