Mapbox-- 实现图层 layer 根据地图的不同属性有不同的表现

1,286 阅读2分钟

需求:

地图上显示图标,品牌A图标要大于其他品牌图标显示

解决方案一:

使用 ['get', 'iconSize'],但是有个前提就是数据里面有 iconSize 值 如:

 properties: {
     brand"A"
     endAtnull
     iconSize0.06
     id"6902949f-545f-44c1-9b6a-73935e8533b2"
     name"小白楼"
     numnull
     startAt"2019/11/2"

添加Layer代码为:

  this.map.addLayer({
      id: 'symbolLayer',
      source: 'symbolData',
      type: 'symbol',
      layout: {
        'icon-image': ['get', 'brand'],
        'icon-allow-overlap': true,
        'icon-ignore-placement': true,
        'icon-size': ['get', 'iconSize'], 
         'icon-offset': [0, -0.5],
      },
});

解决方案二:

使用Camera expressions属性

代码如下:

this.map.addLayer({
      id: 'symbolLayer',
      source: 'symbolData',
      type: 'symbol',
      layout: {
        'icon-image': ['get', 'brand'],
        'icon-allow-overlap': true,
        'icon-ignore-placement': true,
        //品牌为A的icon-size为0.08,其余的为0.06
        'icon-size': ['match',['get', 'brand'],'A',0.08,0.06], 
        'icon-offset': [0, -0.5],
      },
});

介绍

通过 camera expression 可以实现图层 layer 根据地图的不同属性有不同的表现

  1. match

    • 用法
    [ "match",  ["zoom"],'A', 18,  12 ]
    
    • 示例
     //品牌为A和B的图标大小为0.08,品牌c的图标大小为0.06,其他品牌的图标大小为0.04
    'icon-size': ['match',['get', 'brand'],['A','B'],0.08,'C',0.06,0.04], 
    
    
    //品牌为A的图标大小为0.08,品牌B的图标大小为0.06,其他品牌的图标大小为0.04
    'icon-size': ['match',['get', 'brand'],'A',0.08,'B',0.06,0.04], 
    
    
  2. step

    • 用法
    [ "step",  ["zoom"], ...]
    

    注意:属性值为数字

    • 示例
    //<100,颜色'#51bbd6'
    //100< <750, 颜色'#f1f075'
    //<750 颜色'#f28cb1'
    ['step', ['get', 'point_count'], '#51bbd6', 100, '#f1f075', 750, '#f28cb1']
    
  3. let

    • 用法
    [ "let",  ["get", "class"], ]
    

    注意:属性值为String

  4. interpolate

    • 用法
    //当 zoom 为0 时,heatmap-radius 的值为 2
    //当 0 < zoom < 9时,heatmap-radius 的值在 2 ~ 8 之间线性分布
    //当 9 < zoom 时,heatmap-radius 的值为 8
    "heatmap-radius":[ "interpolate",  ["linear"],["zoom"],0, 2,9, 8]
    
    • 示例
    
    "heatmap-color": [
                "interpolate", ["linear"],
                ["heatmap-density"],
                0, "rgba(0, 160, 234,0)",
                0.2, "rgb(0, 160, 234)",
                0.4, "rgb(0, 200, 100)",
                0.6, "rgb(251, 239, 34)",
                0.8, "rgb(242, 141, 38)",
                1, "rgb(190, 49, 31)"
            ],
    
    
    
  5. 嵌套使用

"line-width": [
     "interpolate",
     ["exponential", 1.3],
     ["zoom"],9,
     ["match", ["get", "class"], 
     ["canal", "river"], 0.1, 0],20,
     ["match", ["get", "class"], ["canal", "river"], 8, 3]
 ],

参考链接