# 地图图层
# 概述
图层定义数据源中的数据内容在地图上的展现方式,每个图层都必须有唯一的 ID 标识,不能重复。
每个图层都必须要有指定一个数据源类型,图层类型范围如下:
背景类型:'background'
面几何对应类型:'fill'、'extrusion'
栅格图片对应类型:'raster'
线几何对应类型:'line'
点几何对应类型:'symbol'、'circle'、'heatmap'
2
3
4
5
# 图层规格
图层样式设置的结构为 JSON 结构,根级别结构如下:
{
"id": "road-layer-1",
"type": "line",
"source": "RoadSource",
"source-layer": "Road",
"layout": {...},
"paint": {...},
"minzoom": 6,
"maxzoom": 17.5,
"filter": [...]
}
2
3
4
5
6
7
8
9
10
11
字段定义说明如下:
id:图层 ID,必填项;说明:(值唯一,不能重复)
type:图层渲染类型,必填项;(值域范围,参考本章「概述」)
source:所使用的数据源 ID,说明:(当图层类型不为 background 时,该值为必填项)
source-layer:所使用的 vector 数据源中的图层标识,说明:(当数据源类型为 vector 时,该值为必填项;其它数据源类型,去除该参数)
layout:布局属性
paint:绘制属性
minzoom:图层可展示的最小缩放等级值,选填项;说明:(值为小数或整数,值域范围[0,24],不设置该参数则地图允许的最小缩放等级内都可显示)
maxzoom:图层可展示的最大缩放等级值,选填项;说明:(值为小数或整数,值域范围[0,24],不设置该参数则地图允许的最大缩放等级内都可显示)
filter:所使用数据源的 features 数据的过滤条件,选填项;说明:(当数据源 features 数据信息和 filter 条件匹配时图层才显示)
# filter 规格
fliter 表示从所有图层过滤出特定特征的图层,有以下几种过滤形式:
1、存在过滤:
表达式形式:[way, key]
存在过滤主要有“has”、“!has”两种形式
["has", "count"],表示过滤出存在属性"count"的所有的feature数据
["!has","count"],表示过滤出不存在属性"count"的所有的feature数据
2
3
4
2、比较过滤:
表达式形式:[way, key, value]
比较过滤有等于“==”、大于“>”、小于“<”、不等于“!=”、大于等于“>=”、小于等于“<=”几种形式
["==", "count", "1000"],表示过滤出属性"count"值为1000的feature数据,
// 注意此时数据源name存储的值为"1000"而不是1000 过滤时数据类型是严格匹配的
2
3
4
3、成员过滤:
计算形式:[way, key, v0,v1,…,vn]
成员过滤主要有"in"、"!in"两种形式
["in", "name", "point", "fill", "line"],
// 表示过滤出属性"name"值为"point", "fill", "line"其中任一一个的feature数据
2
3
4
4、匹配过滤:
选择标签值与输入值匹配的输出,如果找不到匹配项,则选择回退值。输入可以是任何表达式(例如["get", "building_type"])。每个标签label必须是:
单个文字值;要么 文字值数组,其值必须是所有字符串或所有数字(例如[100, 101]或["c", "b"])。如果数组中的任何值匹配,则输入匹配,类似于不推荐使用的"in"运算符。 每个标签必须唯一。如果输入类型与标签类型不匹配,则结果将是后备值。
"circle-color": [
'match', ['get', 'name'],
'点1', 'red',
'点2', 'yellow',
['点3','点4'], 'blue',
'#fff'
],
//获取feature's properties 中的name值,根据name值匹配对应的颜色,默认是(没有匹配到)#fff , ['点3','点4'] 表示是label是可以是数组类型,
2
3
4
5
6
7
8
9
10
5、组合过滤:
计算形式:[way, f0,f1,…,fn]
组合过滤主要有等于"all"、"any"、"none"三种形式
"all"表示满足所有过滤条件的数据,"any"表示满足任一一个过滤条件的数据,"none"表示过滤出不满足所有过滤条件的数据
["all", ["<=", "count", 34], ["like", "code", "101"]]
// 表示过滤出属性"count"满足大于等于34,属性"code"值包含101的feature数据
2
3
4
更多的表达式语法请查看文档 样式表达式
# 图层样式操作
图层样式操作常用方法,说明如下:
获取图层布局的一个具体的样式值:
参数说明:图层id、图层布局参数名称,example:
map.getLayoutProperty('my-layer-id', 'visibility')
2
设置图层布局的一个具体的样式值:
参数说明:图层id、图层布局参数名称、布局参数值,example:
map.setLayoutProperty('my-layer-id', 'visibility', 'none')
2
获取图层绘制的一个具体的样式值:
参数说明:图层id、图层绘制参数名称,example:
map.getPaintProperty('my-layer-id', 'fill-color')
2
设置图层绘制的一个具体的样式值:
参数说明:图层id、图层绘制参数名称、绘制参数值,example:
map.setPaintProperty('my-layer-id', 'fill-color', '#faafee')
2
设置图层的缩放区间:
参数说明:图层id、最小缩放级别、最大缩放级别,example:
map.setLayerZoomRange('my-layer-id', 6, 12)
2
获取图层的过滤器:
参数说明:图层id,example:
map.getFilter('my-layer-id')
2
设置图层的过滤器:
参数说明:图层id、过滤器内容,如果过滤器内容为null或是undefined,将清除图层上所有已有的过滤器,example:
map.setFilter('my-layer-id', ['==', 'name', 'myname'])
2
# 增加图层的三种写法
提示
以下三种写法效果一样,只是封装程度不同
以增加线图层为例
线数据示例如下
var geoLines = {
"type": "LineString",
"properties":{
"prop0": "value0"
},
"coordinates": [
[
10,
30
],
[
50,
30
],
[
110,
40
]
]
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 写法一
提示
属性用基于kebab-case
写法
map.addSource("lines", {
type: "geojson",
data: geoLines
});
map.addLayer({
id: 'route',
source: 'lines',
type: 'line',
"layout": {
"line-cap": "square", //butt 尖头,round 圆头,square平头
"line-join": "round" //bevel平拐,round 圆拐,miter棱拐
},
"paint": {
"line-width": 20, //宽度
"line-color": "#FF0000", //颜色
"line-opacity": 0.8 //透明度
}})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 写法二
提示
属性用驼峰式大小写,不用区分layout
还是paint
属性,更详细的写法参考数据源和图层
map.addGeoJSONSource("lines", geoLines);
map.addLineLayer("route", "lines", {
lineCap: "square", //butt 尖头,round 圆头,square平头
lineJoin: "round", //bevel平拐,round 圆拐,miter棱拐
lineWidth: 20, //宽度
lineColor: "#FF0000", //颜色
lineOpacity: 0.8 //透明度
})
2
3
4
5
6
7
8
9
# 写法三
提示
更进一步简化,封装省了传递sourceID和layerID
let polylines = new vjmap.Polyline({
data: geoLines,
lineCap: "square", //butt 尖头,round 圆头,square平头
lineJoin: "round", //bevel平拐,round 圆拐,miter棱拐
lineWidth: 20, //宽度
lineColor: "#FF0000", //颜色
lineOpacity: 0.8 //透明度
});
polylines.addTo(map);
2
3
4
5
6
7
8
9