Возможно ли с OpenLayers (или другим способом) иметь отказоустойчивый источник WMS? - PullRequest
1 голос
/ 02 апреля 2020

Наша ситуация: основной поставщик WMS иногда отключается по разным причинам. Если они отключены от сети, все наши решения выглядят ужасно (без карты, только значки на пустом фоне). Поэтому мы хотели бы использовать OpenStreet Map в качестве аварийного переключения для подобных ситуаций. Мы используем Open Layers и Leaflet (разные интерфейсы) и используем Geoserver для некоторых сервисов WFS.

Можно ли использовать один из них (или что-то еще) для полуавтоматической обработки этого? Или мы должны были бы создать нашу собственную службу прокси WMS? Там, конечно, мы могли обнаружить, что основной не работает, и переключиться на аварийное переключение. Но даже лучше, если для этого есть встроенный способ.

1 Ответ

4 голосов
/ 02 апреля 2020

На слое плиток есть событие tileerror: https://leafletjs.com/reference-1.6.0.html#tilelayer -wms-tileerror

Вы можете проверить, сколько плиток загружено / вышло из строя, а затем использовать запасной TileLayer.

  var loaded = 0;
  var errors = 0;
  var fallbackloaded = false;
  osm.on('tileerror',function(e){
    errors++;
  });
  osm.on('tileload',function(e){
    loaded++;
  });
  osm.on('load',function(e){
    if(loaded == 0 || (errors != 0 && (loaded / errors) > 70)){ //More then 70% wrong
      console.log("WMS is down");
      if(!fallbackloaded){ //prevent infinit loop
        fallbackloaded =true;
        map.removeLayer(osm); //Remove old TileLayer
        osm = L.tileLayer('https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png', {
          maxZoom: 17,
          attribution: 'Map data: &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
        });
        map.addLayer(osm); //Add fallback TileLayer
      }
    }
  });

Пример: https://jsfiddle.net/falkedesign/r28zojgu/

Также вы можете проверить при запуске с помощью JS, достижим ли URL, а затем использовать запасной слой.

...