Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mapbox GL setStyle删除图层_Javascript_Mapbox Gl_Mapbox Gl Js - Fatal编程技术网

Javascript Mapbox GL setStyle删除图层

Javascript Mapbox GL setStyle删除图层,javascript,mapbox-gl,mapbox-gl-js,Javascript,Mapbox Gl,Mapbox Gl Js,我正在使用Mapbox GL构建一个映射web应用程序。它有很多很酷的功能。我已经按照上的示例设置了切换基础地图(即卫星、地形等)的按钮 我遇到的问题是,当我更改样式时,它会删除作为图层加载的多边形并重新加载贴图。我根据用户查询将多边形从Mongo数据库加载为层。我希望能够更改底图并保留这些图层 有没有办法在不重新加载地图或至少不删除图层的情况下更改样式 这是我的切换器代码,与示例相同,但我为自定义样式添加了一个条件: var layerList = document.getElementBy

我正在使用Mapbox GL构建一个映射web应用程序。它有很多很酷的功能。我已经按照上的示例设置了切换基础地图(即卫星、地形等)的按钮

我遇到的问题是,当我更改样式时,它会删除作为图层加载的多边形并重新加载贴图。我根据用户查询将多边形从Mongo数据库加载为层。我希望能够更改底图并保留这些图层

有没有办法在不重新加载地图或至少不删除图层的情况下更改样式

这是我的切换器代码,与示例相同,但我为自定义样式添加了一个条件:

 var layerList = document.getElementById('menu');
    var inputs = layerList.getElementsByTagName('input');

    function switchLayer(layer) {
        var layerId = layer.target.id;
        if (layerId === 'outdoors') {
            map.setStyle('/outdoors-v8.json');
        } else {
        map.setStyle('mapbox://styles/mapbox/' + layerId + '-v8');
        }
    }

    for (var i = 0; i < inputs.length; i++) {
        inputs[i].onclick = switchLayer;
    }
var layerList=document.getElementById('menu');
var inputs=layerList.getElementsByTagName('input');
功能切换层(层){
var layerId=layer.target.id;
如果(layerId==“户外”){
map.setStyle('/outdoors-v8.json');
}否则{
map.setStyle('mapbox://styles/mapbox/“+layerId+”-v8');
}
}
对于(变量i=0;i
以下是一个示例,演示了:


与Leaftlet这样的映射库不同,Mapbox GL JS没有“basemap”与“其他层”的概念。所有层都是同一实体的一部分:样式。因此,您需要保留数据层的某些状态,并在每次更改时调用其源/addLayer。

也许我迟到了,但只是为了记录:

  • style.load
    不是公共API的一部分
  • 使用
    map.on('styledata')
    监视样式更改
请参考:


其他答案表明,
map.on('styledata')
是正确的方法。但它发射可靠,相关的
isStyleLoaded
不准确


看起来我们一直在使用
样式。现在加载

太棒了!谢谢你的帮助@tristen。我希望您可以交换底图,但是Mapbox GL有点不同。我用你的例子作为灵感。基本上,我必须将加载的数据保存到一个变量中,然后使用
map.on('style.load')…
函数重新加载它。它工作得很好。感谢@tristen提供的示例和解释。感谢@tristen。关于如何对来自平铺服务器(例如localhost/{z}/{x}/{y}.pbf)的矢量平铺执行此操作的任何提示?geojson可以存储在一个变量中,但如果您有大量数据,并且只想显示当前边界框的矢量图块,我不确定如何保存相同的数据…@jondelli听起来像是另一个问题?请参阅向地图添加第三方矢量数据。本示例演示的唯一一件事是使用
s交换基础层etStyle
@paolov
mapboxgl.accessToken
下的令牌已被释放。该示例应通过复制代码并提供您自己的访问令牌来工作!这是2020年任何人的正确答案。这不是答案。