Openlayers 如何强制加载分幅以降低分辨率

Openlayers 如何强制加载分幅以降低分辨率,openlayers,openlayers-3,Openlayers,Openlayers 3,当较低缩放级别的平铺根本不可用时,如何在较低缩放级别上从较高缩放级别(较低分辨率)加载平铺?这可能吗?例如:我有缩放8和更高的瓷砖,需要缩放6,7上的贴图从缩放8加载瓷砖并在浏览器中缩放 var countedResoultions = [650251.6299617786, 325125.8149808893, 162562.90749044466, 81281.45374522233, 40640.726872611165, 20320.363436305583, 10160.181

当较低缩放级别的平铺根本不可用时,如何在较低缩放级别上从较高缩放级别(较低分辨率)加载平铺?这可能吗?例如:我有缩放8和更高的瓷砖,需要缩放6,7上的贴图从缩放8加载瓷砖并在浏览器中缩放

    var countedResoultions = [650251.6299617786, 325125.8149808893, 162562.90749044466, 81281.45374522233, 40640.726872611165, 20320.363436305583, 10160.181718152791, 5080.090859076396, 2540.045429538198, 1270.022714769099, 635.0113573845495, 317.5056786922747];

    var customExtent = [-491187.1897463986, -53831.96192823257, 890456.9786693857, 877455.310353267];

    var layers = [new ol.layer.Tile({
        source: new ol.source.XYZ({
            projection: 'EPSG:2180',
            tileGrid: new ol.tilegrid.TileGrid({
                origin: [101235.72703025967, 781405.7611248483],
                extent: customExtent,
                resolutions: countedResolutions, 
            }),
            tileUrlFunction: function(coord){
                console.log('gridZoom' coord[0]);
                // not standard OSM url
                // ...
            }
        })
    })];


    var map = new ol.Map({
        layers: layers,
        target: 'map',
        view: new ol.View({         
            center: ol.proj.transform([20.92,52.23], 'EPSG:4326', 'EPSG:3857'),
            zoom: 6,
            maxZoom: 14
        })
    });

对我来说奇怪的是,缩放
ol.View
(我在更改时注册了侦听器)与
tileUrlFunction
中的缩放值(
coord[0]
)不同。对于viewZoom=6->gridZoom=9、viewZoom=7->gridZoom=10、viewZoom=8->gridZoom=11,这是可能的。你所需要做的就是找出你需要使用的解决方案。 所以,假设您想以所有可用的分辨率显示OSM平铺,并且希望添加更多缩放级别,以便用户可以放大更多

以下是OSM的默认分辨率:

var osmRes=[156543.033978271.5169539135.75847519567.8792375、9783.93961875、4891.96980975、2445.9849046875、1222.99245234375、611.496226171875、305.7481130859375、152.87405654296876、76.43702827148438、38.21851413574219、19.109257067871095、9.55462853335547、4.77747、4.777314266777774、2.388341947、2839717];代码

以下是同样的决议,还有一些:

var customRes=[156543.0339, 78271.51695, 39135.758475, 19567.8792375, 9783.93961875, 4891.969809375, 2445.9849046875, 1222.99245234375, 611.496226171875, 305.7481130859375, 152.87405654296876, 76.43702827148438, 38.21851413574219, 19.109257067871095, 9.554628533935547, 4.777314266967774, 2.388657133483887, 1.1943285667419434, 0.5971642833709717,0.41999977320012255,0.279998488000817,0.13999992440004086,0.08399995464002451,0.05599996976001634,0.02799998488000817]

现在,您只需将所需的分辨率传递到地图视图,如下所示:

var raster = new ol.layer.Tile({
  source: new ol.source.OSM()
});

var map = new ol.Map({
  layers: [raster],
  target: 'map',
  view: new ol.View({
    resolutions : customRes,
    center: [-11000000, 4600000],
    resolution    : 156543.0339
  })
});
下面是一个例子,看看它的实际效果

如果您不确定重新着色,但知道要使用的刻度,以下功能可能会对您有所帮助

/**
 * get the resolution out of scale
 * @param {number} scale as declared in the config eg 50000
 * @returns {window.webGisApp.main.resolutions}
 */
function getResolutionFromScale(scale){
var dpi = 25.4 / 0.28;  
var mpu = ol.proj.METERS_PER_UNIT['m'];
var res = scale / (mpu * 39.37 * dpi); 
return res;
}
/**
 * get the resolution out of scale
 * @param {number} res the resolution
 * @returns {webGisApp.main.resolutions}
 */
function getScaleFromResolution(res){
var dpi = 25.4 / 0.28;  
var mpu = ol.proj.METERS_PER_UNIT['m'];
var scale = res * mpu * 39.37 * dpi; 
return scale;
}

我想你可以使用图层的
预加载
选项


我有更复杂的情况,因为我有自定义
ol.source.XYZ
源,在
ol.tilegrid.tilegrid
选项中有计数的
分辨率
。它工作正常,但当缩放低于某个值时,没有要获取的平铺,需要贴图使用更高缩放比例的平铺(获取更多平铺并将其缩小)。您应该使用额外的分辨率配置地图视图,并将这些分辨率保留在tilegrid中。Ol3应该执行客户端的瓷砖缩放。我过去也做过同样的操作,效果很好。如果您提供了代码,我可能会帮到您,您可能缺少矩阵。请检查此小提琴-->我已将
ol.tilegrid.tilegrid
替换为
>ol.tilegrid.WMTS
和set选项
matrixIds
,但没有任何更改。不幸的是,我无法测试您的代码,因为您的磁贴url缺失。但我提供的示例使用了非标准的磁贴服务,因此它应该像在我的小提琴上一样工作。地图视图中的
maxZoom:14
是什么,可能是这导致了您的故障。