代码之家  ›  专栏  ›  技术社区  ›  wuk986

传单:刷新不带缓存的tilelayer

  •  4
  • wuk986  · 技术社区  · 6 年前

    我正在将一个平铺层作为覆盖加载到我的传单地图中,我的目标是每n分钟刷新一次该层。

    我使用 redraw(); 方法,但我发现数据总是来自缓存,而不是服务器。 放大或缩小地图后,有时会从服务器请求平铺。

    图层和刷新的代码如下所示:

    var TomTom_Incident = L.tileLayer('https://api.tomtom.com/traffic/map/4/tile/incidents/s3/{z}/{x}/{y}.png?key=<APIKEY>', {
        maxZoom: 18,
        attribution: '&copy; <a href="https://www.tomtom.com/" target="_blank">TomTom</a>',
        opacity: 0.85
    });
    
    var TomTom_Incident_intervall = "";
    
    function refresh_TomTom_Incident() {
    
        TomTom_Incident.redraw();
    
        console.log(consoleLogTime.getHours()+':'+consoleLogTime.getMinutes()+':'+consoleLogTime.getSeconds()+'TomTom_Incident Intervall active');
    }
    
    
    TomTom_Incident.on('add', function(e) {
    
        TomTom_Incident_intervall = setInterval(refresh_TomTom_Incident, 300000);
    
        console.log('TomTom_Incident added');
    });
    
    if (map.hasLayer(TomTom_Incident)) {
        console.log('TomTom_Incident present');
    
        TomTom_Incident_intervall = setInterval(refresh_TomTom_Incident, 300000);
    
    }   else {
        console.log('TomTom_Incident not present');
    }
    
    TomTom_Incident.on('remove', function(e) {
        clearInterval(TomTom_Incident_intervall);
        console.log('Intervall active');
    });
    

    是否有一种方法可以始终在 重画(); 或者禁用此平铺层的缓存?

    链接到文档: https://developer.tomtom.com/online-traffic/online-traffic-documentation-online-traffic-incidents/traffic-incident-tiles

    提前感谢!

    1 回复  |  直到 6 年前
        1
  •  5
  •   djkern    6 年前

    从签出开始: http://leafletjs.com/reference-1.3.0.html#tilelayer 。如您所见,您可以“在模板中使用自定义键,这将从TileLayer选项中进行评估”。

    您应该做的是定义您的层,以便它将随机自定义键附加到您的URL。这样,浏览器将无法识别先前已缓存的磁贴。

    我为您实现了一个关于Plunker的示例: http://plnkr.co/edit/Bux8bM30WtVCklOL7ndr?p=preview

    以下是手术部分:

    var generateRandInt = function() {
        return Math.floor( Math.random() * 200000 ) + 1;
    };
    
    L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?{randint}, {
    		randint: generateRandInt,
    		maxZoom: 18,
    		attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
    			'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
    			'Imagery © <a href="http://mapbox.com">Mapbox</a>',
    		id: 'mapbox.streets'
    }).addTo(mymap);

    当然,这将为每个磁贴请求生成一个新的随机整数。如果要对每个重画操作使用不同的整数,可以想象这样做:

    var redrawint = Math.floor( Math.random() * 200000 ) + 1
    var getRedrawInteger = function() {
        return redrawint;
    };
    var incrementRedrawInteger = function() {
        redrawint += 1;
    };
    
    L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?{randint}, {
    		randint: getRedrawInteger,
    		maxZoom: 18,
    		attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
    			'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
    			'Imagery © <a href="http://mapbox.com">Mapbox</a>',
    		id: 'mapbox.streets'
    }).addTo(mymap);

    因此,您需要在每次重画之前调用incrementRedrawInteger()。这实际上会使重绘的缓存无效。