如何强制加载瓷砖以降低分辨率

时间:2017-04-21 09:02:19

标签: openlayers openlayers-3

当较低的缩放级别图块根本不可用时,如何在较低的缩放比例下从较高的缩放级别(较低的分辨率)加载图块?这可能吗 ?例如:我有缩放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(我已经注册的听众改变)与coord[0]中的缩放值(tileUrlFunction)不同。对于viewZoom = 6 - > gridZoom = 9,viewZoom = 7 - > gridZoom = 10,viewZoom = 8 - > gridZoom = 11

2 个答案:

答案 0 :(得分:1)

是的,这是可能的。您需要做的就是找出您需要使用的分辨率。 因此,假设您希望以所有可用分辨率显示OSM图块,并且您希望添加更多缩放级别,以便用户可以放大更多。

这是OSM的默认分辨率:

var osmRes = [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];

这是相同的决议+更多:

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

这是一个fiddle,可以看到它的实际效果。

如果您不确定拆分但是您知道要使用的秤,以下功能可能会对您有所帮助。

/**
 * 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;
}

答案 1 :(得分:0)