当前位置: 首页 > 知识库问答 >
问题:

我不能在Mapbox gl js中更改地图样式后添加新图层

况繁
2023-03-14

首先,我是Mapbox的初学者,我对改变地图样式有意见。更改样式时,我正在上载源,但无法向地图添加新图层。

我正在这样创造我的资源。

function addRoadsSource(){
    map.addSource('roads3',{
        'type':'geojson',
        'data': datas.roadsInfo // datas --> roadsInfo includes roads geoFile Data
    });
}

并将它们作为图层添加到uploadRoads()的地图中

function uploadRoads() {
    map.on('load',function() {
                addRoadsSource();
                showRoads();
                });
            }

这里还有showRoads()函数

function showRoads() {
    map.addLayer({
        'id': 'roadsLayer',
        'type': 'line',
        'source': 'roads3',
        'filter': ['==', '$type', 'LineString'],
        'paint' : {
        'line-color' : '#33cc33',
        'line-width' : 5
        }
        });
}     

但当我将地图样式从streets-v11更改为dark-v10时,所有来源都消失了。根据我的研究,这是因为mapbox的结构(mapbox GL setStyle删除图层)。每个人都说我需要再次上传资源。但是我已经用addRoadsSource()函数上传了我的资源。然后,当我使用uploadRoads()将新图层添加到新样式时,道路不会显示在地图上。当我用地图寻找新风格的来源时。风格sources()我可以看到源已正确加载,但图层未显示。我希望我能解释我的问题。我查看了许多来源,包括Github问题,但没有一个对我有用。如果您需要我的代码或geojson文件中的任何内容,我可以添加它。

共有1个答案

上官英哲
2023-03-14

如果您可以提供一个最小的可重复的示例,那么识别代码中的错误就更容易了,因为您包含的代码不足以诊断问题的根源。

阅读您的问题时,我的第一感觉是,您没有在样式加载事件之后创建源代码和图层,因为更改样式不应该是一个问题,正如您在本文中所看到的,我为测试您的case fiddle所做的工作显示了如何更改mapbox样式以保持源代码和图层。

    mapboxgl.accessToken = 'PUT HERE YOUR TOKEN';
    var map = new mapboxgl.Map({
      container: 'map',
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [-122.486052, 37.830348],
      zoom: 14
    });
    var l = 'routeL';
    var s = 'routeS';
    var layerList = document.getElementById('menu');
    var inputs = layerList.getElementsByTagName('input');

    function addSource() {
      map.addSource(s, {
        'type': 'geojson',
        'data': {
          'type': 'Feature',
          'properties': {},
          'geometry': {
            'type': 'LineString',
            'coordinates': [
              [-122.48369693756104, 37.83381888486939],
              [-122.48348236083984, 37.83317489144141],
              [-122.48339653015138, 37.83270036637107],
              [-122.48356819152832, 37.832056363179625],
              [-122.48404026031496, 37.83114119107971],
              [-122.48404026031496, 37.83049717427869],
              [-122.48348236083984, 37.829920943955045],
              [-122.48356819152832, 37.82954808664175],
              [-122.48507022857666, 37.82944639795659],
              [-122.48610019683838, 37.82880236636284],
              [-122.48695850372314, 37.82931081282506],
              [-122.48700141906738, 37.83080223556934],
              [-122.48751640319824, 37.83168351665737],
              [-122.48803138732912, 37.832158048267786],
              [-122.48888969421387, 37.83297152392784],
              [-122.48987674713133, 37.83263257682617],
              [-122.49043464660643, 37.832937629287755],
              [-122.49125003814696, 37.832429207817725],
              [-122.49163627624512, 37.832564787218985],
              [-122.49223709106445, 37.83337825839438],
              [-122.49378204345702, 37.83368330777276]
            ]
          }
        }
      });
    }

    function addLayer() {
      map.addLayer({
        'id': l,
        'type': 'line',
        'source': s,
        'layout': {
          'line-join': 'round',
          'line-cap': 'round'
        },
        'paint': {
          'line-color': '#888',
          'line-width': 8
        }
      });

    }

    map.on('style.load', function() {
      addSource();
      addLayer();
    });

    function switchLayer(layer) {
      var layerId = layer.target.id;
      map.setStyle('mapbox://styles/mapbox/' + layerId);
    }

    for (var i = 0; i < inputs.length; i++) {
      inputs[i].onclick = switchLayer;
    }
 类似资料:
  • 我正在用html/jsp页面主体中的Google地图做一个web动态项目。 我制作了一个函数,可以创建一个标记(lat、lng、map),并在标记的参数中使用一个特殊的image.png作为图标。 在我的地图中,我制作了两种不同的样式(地图的颜色…)“白天”和“夜晚”。 我想知道当用户点击夜间更改样式时,我如何更改标记的图标。事实上,标记的颜色不适合这种风格的地图... 我尝试用相同的名称初始化不

  • 我得到了这个错误: 线程“main”java.lang.NullPointerException在GUI上的javax.swing.ImageIcon(未知源)。(Gui.java:22)在test.main(test.java:7)

  • 我的Dynamodb中有一个类型为'List of Maps'的属性。例如,List=[{key1:value1},{key2:value2},{key3:value3},...]我想用current_key更新列表(来自我的python脚本)以添加一个新键,或者如果current_key已经存在,则替换该值。

  • 我正在使用geojson数据处理Google地图中的图层。 我现在有一个有四个不同多边形的图层,当你点击它们时,它们会从灰色变成绿色。但是当我再次点击时,它不会变回灰色,这就是点击功能的目的。 在我的情况下,它适用于我的编辑器,https://embed.plnkr.co/hi4MtjO8f0PN6rCW70rE/。这是完整的代码段。 我修好了!!我更改了几行的位置,并将其设置为false或tru

  • 我是一个尝试使用Highcharts maps用JavaScript实现交互式地图的新手(http://www.highcharts.com/products/highmaps). 我已经设法绘制了海地的基本地图。请参阅:http://jsfiddle.net/mattbowlby/P8KZQ/2/ 我将地图的JavaScript放在一个名为海地的文件中。js。这是该文件的内容: 现在,我很难在我