Mapbox GL JS:在不隐藏地图图层的情况下更改地图样式?

Mapbox GL JS: Change a map's style without hiding map layer?

我正在使用 Mapbox GL JS,我希望允许用户将地图的背景样式从街道更改为卫星,同时在地图背景上方显示一个多边形图层。

我已调整 the Mapbox example,但我不知道如何阻止 map.setStyle 在我的多边形图层上方设置新样式(并因此隐藏)。我希望它在不隐藏多边形层的情况下进行更改。

切换图层前:

切换图层后 - 缺少多边形叠加层,想继续显示它:

这是我的完整代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' />
    <title></title>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.33.1/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.33.1/mapbox-gl.css' rel='stylesheet' />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
    </style>
</head>
<body>
<style>
    #menu {
        position: absolute;
        background: #fff;
        padding: 10px;
        font-family: 'Open Sans', sans-serif;
    }
</style>
<div id='map'></div>
<div id='menu'>
    <input id='basic' type='radio' name='rtoggle' value='basic' checked='checked'>
    <label for='basic'>basic</label>
    <input id='satellite' type='radio' name='rtoggle' value='satellite'>
    <label for='satellite'>satellite</label>
</div>
<script>
mapboxgl.accessToken = 'pk.eyTOKEN';
var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/basic-v9',
    zoom: 5,
    center: [-3.0, 54.6]
});
map.on('load', function () {
    map.addSource('xxx', {
        type: 'vector',
        url: 'mapbox://xxx.xxx'
    });
    map.addLayer({
        'id': 'xxx',
        'source': 'xxx',
        'type': 'fill',
        'paint': {
            'fill-color': 'red'
        },
        'source-layer': mylayer
    }, 'road'); // Note that I'd like this to display above the OSM 'roads' layer
    var layerList = document.getElementById('menu');
    var inputs = layerList.getElementsByTagName('input');
    function switchLayer(layer) {
        var layerId = layer.target.id;
        map.setStyle('mapbox://styles/mapbox/' + layerId + '-v9');
    }
    for (var i = 0; i < inputs.length; i++) {
        inputs[i].onclick = switchLayer;
    }
});
</script>
</body>
</html>

Mapbox GL JS 没有"base layer" 和"overlays." 的概念,所有地图的所有层都使用相同的基本图元绘制。

如果您需要在提供的 Mapbox 样式之间切换时保留一个或多个自定义层,您可以选择

  • 分叉 Mapbox 样式并在 Studio 中添加您的自定义图层
  • 切换样式后重新添加自定义图层
  • 在浏览器中将 Mapbox 样式下载为 JSON 并将您的自定义图层添加到浏览器中的样式