[3] Mapbox-gl Source & Layer

1,582 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

Source

sources 和 layers 决定了哪儿些元素将要显示到地图上,以及这些元素的具体表显形式。
在 mapbox-gl 中基本所有的可视化都是依靠添加图层 (layer) 去实现的,并且图层的显示也基本都是依托于相应的数据源去渲染的。这里Source指的就是这个数据源。

Source 有4种类别,分别是:geojson、image、video、vector

geojson

geojson 是一种用于编码各种地理数据结构的格式。这也是最常用的一种源数据。

    map.addSource("geojson-id", {
        type: "geojson",
        data: {
            "type": "FeatureCollection",
            "features": [{
                "type": "Feature",
                "geometry": {
                    "type": "",
                    "coordinates": []
                },
                "properties": {}
            }]
        }
    })

当然这里的data值也可以是一个geojson的网络地址。

类型为geojson的数据源有一个很常用的方法:setData(data),其参数可以是一个geojson对象,也可以是一个url地址。 该方法可以动态更新数据源。

    geojsonSource.setData(geojson)

image

图片数据源,可以将图片展示到地图上

    map.addSource('image-id', {
        type: "image",
        url: "图片url",
        coordinates: [
            [], [], [], []
        ]
    })

url:必须的图片url地址

coordinates: 四个地理坐标, 用于定义图片的四角

video

视频数据源,将视频展示到地图上

   map.addSource('image-id', {
        type: "image",
        url: [
            "视频url"
        ],
        coordinates: [
            [], [], [], []
        ]
    }) 

基本和图片数据源一样

vector

矢量瓦片数据源。其实初始化地图时设置的style,其本质就是设置一种矢量瓦片数据源。

在解决地图离线的问题时,可以看到,设置底图样式本身就是在修改设置vector类型的Source,以及各种不同的layer。

    map.addSource('vector-id', {
        type: 'vector',
        // url: "url.api"
        tiles: "url.mvt\url.pbf",
    })

url: 表示离线底图服务接口。

tiles: 提供.pbf或.mvt文件。

Layer

layer 决定元素展现形式与样式。一共有10种类型的图层:

  • background 背景
  • fill  区域
  • line  线
  • symbol    图标或文本
  • raster 栅格
  • circle    点、圆
  • fill-extrusion    3d挤压
  • heatmap   热图
  • hillshade 山体阴影
  • sky   天空

其中除了背景(background)和天空(sky)不需要指定数据源,其他图层都需要指定一个数据源。

layer示例:

    let layer = {
        "id": "my-layer",
        "source": "source-id",
        "type": "fill",
        "paint": {
            
        },
        "layout": {
            
        },
        "filter": []
    }

具体的配置可以直接看 官网说明

这里着重记录下filter属性。

filter,顾名思义,它是一个过滤器,通过一些表达式来显示与过滤条件匹配的数据。

    filter: ["!=", "name", "Chengdu"]

其值通常为一个长度为3的列表。第一个元素为判断行为、第二个元素为判断依据、第三个元素为判断条件。

所以上面filter的含义就是:当前图层只显示name != "Chengdu"的数据。

filter可以判断的行为:

  • == 和 != 相同或不同

  • >、>=、 < 、<= 比较大小的判断方式,这里的判断字段需要数字类型,或者可以转为数字类型的字段。

  • in 和 match 可以根据某个字段进行多值过滤

最后filter也支持多条件过滤,其写法如下:

    // 表示选择 age > 18且type != school的数据
    filter: [
        "all",
        [">", "age", 18 ],
        ["!=", "type", "school"]
    ]

geojson

最后记录下geojson中的7种几何类型,分别是:

  • Position
  • Point
  • MultiPoint
  • LineString
  • MultiLineString
  • Polygon
  • MultiPolygon
  • GeometryCollection