Tengo un mapa en OpenLayers con fuente TileWMS que no es muy fiable. En casi todas las cargas de página completa hay algunos azulejos que no se cargan con el estado 503 - Service Unavailable
. Cuando intento cargar el azulejo fallido un poco más tarde 'manualmente', se carga sin problemas. Eso me llevó a la idea de volver a cargar el azulejo fallido si el primer intento no tiene éxito.
No pude encontrar ninguna forma "oficial" de OpenLayers de hacer eso, así que traté de lograrlo usando tileLoadFunction
donde inicio la recarga del mosaico con 2 segundos de retraso y antes de la recarga compruebo si el mosaico ya se ha cargado correctamente. La recarga se activa asignando primero una fuente de imagen ficticia para el mosaico y luego la original. El éxito de la carga de la baldosa se comprueba por enganche en tileloadend
y configuración de la bandera personalizada evt.tile._loaded = true
.
He aquí el código correspondiente:
proj4.defs('EPSG:3912',
'+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=-5000000 +ellps=bessel +towgs84=682,-203,480,0,0,0,0 +units=m +no_defs');
var proj3912 = ol.proj.get('EPSG:3912');
proj3912.setExtent([374371.84, 30513.32, 624119.18, 195517.48]);
var tileGridResolutions = [1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 0.5];
var dofLayer = new ol.layer.Tile({
source: new ol.source.TileWMS({
url: 'https://prostor4.gov.si/ows2-m-pub/wms',
attributions: ['<a href="http://www.gu.gov.si/">GURS</a>'],
params: {
'LAYERS': 'SI.GURS.ZPDZ:DOF050_D48',
'FORMAT': 'image/png',
'VERSION': '1.3.0'
},
tileGrid: new ol.tilegrid.TileGrid({
extent: proj3912.getExtent(),
resolutions: tileGridResolutions,
tileSize: 256
}),
tileLoadFunction: tileLoadFunction,
projection: proj3912
}),
title: 'Ortofoto',
type: 'base'
});
function tileLoadFunction(imageTile, src) {
imageTile.getImage().src = src;
if (typeof imageTile._retry == 'undefined') {
imageTile._retry = 0;
imageTile._loaded = false;
}
if (imageTile._retry < 3) {
imageTile._retry++;
setTimeout(function() {
if (!imageTile._loaded) {
imageTile.getImage().src = 'img/empty.png';
tileLoadFunction(imageTile, src);
}
}, 2000);
}
}
dofLayer.getSource().on('tileloadend', function(evt) {
evt.tile._loaded = true;
});
Por desgracia, este método sólo funciona en el venerable IE11, pero no en Firefox y Chrome. No hay ningún error, sólo parece que la imagen no se transfiere desde el elemento de imagen al lienzo. Dado que trabajo en ES5 JS, no puedo depurar los componentes internos de OpenLayers para ver dónde está el problema.
¿Hay alguna manera de hacer que el método anterior funciona en Firefox y Chrome o algún otro enfoque para tratar de recarga falló TileWMS
¿Teja?