Style Specification
Style Specification 定义 Mapbox GL JS 中地图的视觉外观和行为。它是一个结构化的 JSON 格式,描述地图视觉呈现的所有方面,包括数据源、渲染图层、相机位置、光照、地形和其他视觉元素。本文档概述了样式规范的结构和组件,解释它们如何相互关联以及与渲染管道的关系。
有关规范内用于数据驱动样式的表达式系统的信息,请参阅 Expression System。
样式文档结构
Mapbox GL 样式是一个具有特定必需和可选属性的 JSON 对象。在最基本的级别上,样式必须包括 version(必须为 8)、sources(定义要显示的数据)和 layers(定义数据应如何渲染)。
以下是样式文档的一些关键组件:
| Property | Type | Description |
|---|---|---|
version | Number | 必须为 8. |
name | String | 样式的人类可读名称. |
sources | Object | 样式中使用的数据源. |
layers | Array | 定义数据如何可视化的图层. |
sprite | String | sprite 图像和元数据的 URL. |
glyphs | String | 加载字体字形的 URL 模板. |
center | Array | 默认地图中心位置 [longitude, latitude]. |
zoom | Number | 默认缩放级别. |
bearing | Number | 默认方位角(旋转),单位为度. |
pitch | Number | 默认俯仰角(倾斜),单位为度. |
数据流和处理
使用 Style Specification 时,数据通过几个处理步骤流动:
Sources
Sources 定义将在地图上显示的数据。每个源都有唯一的 ID 和类型,以及类型特定的属性。
Source Types
| Source Type | Description |
|---|---|
vector | 分块矢量数据,通常为 MVT 格式 |
raster | 分块栅格图像 |
geojson | GeoJSON 数据 |
image | 单个栅格图像 |
video | 视频源 |
raster-dem | 数字高程模型(DEM)栅格数据 |
Layers
Layers 定义来自 sources 的数据如何在地图上样式化和渲染。每个图层引用一个源并应用样式属性来渲染数据。
Layer Types
| Layer Type | Description | Source Types |
|---|---|---|
background | 有色或图案背景 | None (no source) |
fill | 填充多边形 | vector, geojson |
line | 描边线条 | vector, geojson |
symbol | 图标和文本标签 | vector, geojson |
raster | 栅格图像 | raster |
circle | 小圆圈 | vector, geojson |
fill-extrusion | 拉伸(3D)多边形 | vector, geojson |
hillshade | DEM 数据的山体阴影可视化 | raster-dem |
sky | 天空(大气)渲染 | None (no source) |
model | 3D 模型 | model |
Layer Properties
每种图层类型有两种属性:
- Layout Properties:定义要素的放置和外观(例如,符号的可见性、文本字段)
- Paint Properties:定义视觉方面(例如,颜色、不透明度、宽度)
Style Implementation
样式规范主要通过代码库中的 Style 类实现,该类管理样式的加载、解析和应用。
Expressions 和数据驱动样式
虽然样式规范的核心结构是基于 JSON 的,但 Mapbox GL JS 使用表达式进行高级数据驱动样式。有关此内容的更多详细信息,请参阅 Expression System 文档。
图层绘制属性中表达式的示例:
{
"id": "roads",
"type": "line",
"source": "mapbox-streets",
"source-layer": "road",
"paint": {
"line-color": [
"match",
["get", "type"],
"motorway", "#009de0",
"trunk", "#f44",
"primary", "#f70",
"secondary", "#fbb",
"#ccc"
],
"line-width": [
"interpolate", ["linear"], ["zoom"],
10, 1,
14, 5
]
}
}特殊功能和全局属性
样式规范包括几个影响整个地图的特殊功能和全局属性:
光照和照明
地形
雾
投影
高级功能
Imports
样式规范支持从其他源导入样式,允许组合和重用。
Configuration Options
样式可以包含配置选项,允许在不更改基础样式的情况下进行自定义。
Featuresets
Featuresets 是一项实验性功能,允许定义用于查询、交互和状态管理的要素集。
使用 Style Specification
Style Specification 以几种方式使用:
加载样式:可以从 URL 或直接作为 JSON 对象加载样式
map.setStyle('mapbox://styles/mapbox/streets-v11'); // 或 map.setStyle({ version: 8, sources: { ... }, layers: [ ... ] });修改样式:各种方法允许在加载后修改样式
map.addSource('new-source', { type: 'geojson', data: { ... } }); map.addLayer({ id: 'new-layer', type: 'circle', source: 'new-source' }); map.setPaintProperty('new-layer', 'circle-color', 'red');查询要素:可以查询样式的图层以查找渲染的要素
const features = map.queryRenderedFeatures(point, { layers: ['my-layer'] });与要素交互:样式规范和 featuresets 可用于与特定要素交互
map.addInteraction('click', { type: 'click', target: { featuresetId: 'buildings' }, handler: (e) => { // 处理建筑物的点击 } });
实现细节
样式规范由 Mapbox GL JS 通过几个关键类处理:
Style 类
Style 类是样式规范的中央实现。它处理:
- 加载样式 JSON
- 创建和管理数据源和图层
- 更新样式属性
- 协调样式转换
- 处理样式以进行渲染
StyleLayer 类
StyleLayer 类表示样式规范中的单个图层。它处理:
- 存储图层属性
- 评估图层属性中的表达式
- 渲染图层的要素
- 查询图层中的要素
SourceCache 类
SourceCache 类管理源的数据。它处理:
- 加载和缓存瓦片
- 跟踪视口
- 根据需要使瓦片失效和刷新
结论
Style Specification 是 Mapbox GL JS 样式系统的基础。它提供了一个结构化的、基于 JSON 的格式来定义地图视觉呈现的所有方面,从数据源到渲染图层到光照和地形等全局效果。理解规范的结构和组件是使用 Mapbox GL JS 创建自定义地图的关键。