OpenLayers(或其他方式)是否有可能拥有故障转移 WMS 源?

Is it possible with OpenLayers (or other way) to have a failover WMS source?

我们的情况:主要的WMS提供商有时会因为各种原因离线。如果他们离线,我们所有的解决方案看起来都很糟糕(没有地图,只有空白背景上的图钉)。所以我们想使用 OpenStreet Map 作为这种情况的故障转移。我们正在使用 Open Layers 和 Leaflet(不同的前端),并为某些 WFS 服务提供 Geoserver。

是否可以使用其中任何一个(或其他任何东西)来半自动处理这个问题?或者我们是否必须构建自己的 WMS 'proxy' 服务?在那里我们当然可以检测到主节点已关闭并切换到故障转移。但如果有一种内置的方法可以做到这一点,那就更好了。

tilelayer 上有一个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/

如果 url 可以访问,您还可以使用 JS 检查启动,然后使用回退层。