天天看点

Mapbox Style 规范

Mapbox ( 中文官网 )致力于打造全球最漂亮的个性化地图。

这里记录下其 Web 端 API Mapbox GL JS 的地图样式规范 Style 的各个配置项:

必填项会加上 <code>*</code> ,方便根据目录进行查看

<code>version</code>:版本号(<code>必填</code>,且值必须为 <code>8</code>)

<code>name</code>:名称(<code>可选</code>,用于给 <code>style</code> 取名,方便阅读)

<code>metadata</code>:元数据(<code>可选</code>,用于给 <code>style</code> 附加一些任意属性。为避免冲突,为避免冲突,建议添加前缀,如 <code>mapbox:</code>)

<code>center</code>:地图的默认中心点(<code>可选</code>,由 <code>经度</code> 和 <code>纬度</code> 构成)

<code>zoom</code>:地图的默认缩放层级(<code>可选</code>,值越大,越靠近地表。<code>mapbox</code> 采用的是无极缩放,范围一般为 <code>0 ~ 24</code>)

<code>bearing</code>:地图的默认方位角(<code>可选</code>,表示 <code>地图视口正上方中心点</code> 在地图上 <code>北偏东</code> 的角度。默认值为 <code>0</code>)

<code>pitch</code>:地图的默认倾斜角度(<code>可选</code>,默认值为 <code>0</code>,范围为 <code>0 ~ 60</code>)

<code>sprite</code>:雪碧图(<code>可选</code>,用来指定获取雪碧图及其元数据的 URL)

<code>sprite</code> 的音译是 <code>雪碧</code>,直译是 <code>精灵</code>,表示不受地图旋转缩放影响的图标等,类似精灵漂浮在空中。

当有 <code>layer</code> 使用了 <code>background-pattern</code>、<code>fill-pattern</code>、<code>line-pattern</code>、<code>fill-extrusion-pattern</code>、<code>icon-image</code> 等属性时,<code>sprite</code> 必填。

当指定了 <code>sprite</code> 后,<code>mapbox</code> 会自动生成雪碧图的完整请求地址,分别如下:

如果浏览器进行了缩放,则会加上缩放 DPI 因子 <code>@2x</code>,如下:

<code>glyphs</code>:字形符号(<code>可选</code>,用来指定加载以 PBF 格式设置的 <code>有向距离场</code> 字形的 URL 模板)

URL 模板必须带有占位符 <code>{fontstack}</code> 和 <code>{range}</code>。

当有 <code>layer</code> 使用了 <code>text-field</code> 属性时,<code>glyphs</code> 必填。

<code>transition</code>:全局的过渡动画属性(<code>可选</code>,用来作为所有过渡动画属性的默认值)

<code>light</code>:全局的光源(<code>可选</code>)

<code>sources</code>:数据源集合(<code>必填</code>,用于包含一系列数据源 <code>source</code>,这些数据源提供了在地图上显示的数据)

<code>sources</code> 是对象 <code>{}</code> 的形式,其属性名就是 <code>数据源的名称</code>(或者说 <code>数据源的 id</code>),这样可以根据 <code>数据源的名称</code>(或者说 <code>数据源的 id</code>)快速获取数据源的信息。

每个数据源 <code>source</code> 都有一个 <code>type</code> 属性,用于指定其具体的类型:

<code>vector</code>:矢量

<code>raster</code>:栅格

<code>raster-dem</code>:栅格化的数字高程模型

<code>geojson</code>:GeoJSON 数据源

<code>image</code>:图片

<code>video</code>:视频

<code>vector</code>:矢量切片数据源

<code>raster</code>:栅格切片数据源(相比 <code>vector</code> 多了一个属性 <code>tileSize</code>)

<code>raster-dem</code>:栅格化的数字高程模型(相比 <code>raster</code> 多了一个属性 <code>encoding</code>)

<code>geojson</code>:GeoJSON 数据源(数据必须通过 <code>data</code> 属性指定,<code>data</code> 属性值就是一个 <code>GeoJSON</code> 或者 <code>GeoJSON</code> 的请求地址)

<code>image</code>:图片数据源

<code>video</code>:视频数据源

<code>layers</code>:图层集合(<code>必填</code>,包含了一系列图层 <code>layer</code>,这些图层指定了如何渲染数据源提供的数据)

每个图层 <code>layer</code> 都有 <code>id</code>(具有唯一性)和 <code>type</code> 属性,其中 <code>type</code> 属性指定了其具体的渲染类型:

<code>fill</code>:填充

<code>line</code>:线

<code>circle</code>:圆点

<code>symbol</code>:符号

<code>background</code>:背景

<code>heatmap</code>:热力图

<code>hillshade</code>:坡面阴影

<code>fill-extrusion</code>:三维填充

<code>fill</code>:填充(用于给多边形 <code>polygon</code> 进行填充和描边)

<code>line</code>:线(用于绘制成一条条线)

<code>circle</code>:圆点(用于绘制成一个个圆点)

<code>symbol</code>:符号(用于绘制成一个个图标或者文本标签等)

<code>background</code>:背景(用于绘制成整个地图的背景或者图案)

<code>raster</code>:栅格(用于绘制栅格地图,比如卫星影像)

<code>heatmap</code>:热力图(用于绘制成热力图的效果)

<code>hillshade</code>:坡面阴影(基于 <code>DEM</code> 数字高程模型进行坡面阴影的可视化渲染)

<code>fill-extrusion</code>:三维填充(用于给三维多边形进行填充和描边)

<code>Expressions</code>:表达式集合(并非 <code>style</code> 的属性,只是 <code>layer</code> 的任何 <code>layout</code> 布局属性和 <code>paint</code> 绘制属性,以及 <code>filter</code> 属性等,它们的值都可以指定成一个表达式 <code>Expression</code>)

一个 <code>Expression</code> 定义了一个公式,总体来说可以将公式中的操作符分为以下 <code>5</code> 种:

<code>Mathematical operators</code>:数学操作符,用来对数值进行数学运算

<code>Logical operators</code>:逻辑操作符,用来计算布尔值和条件控制

<code>String operators</code>:字符串操作符,用来操作字符串

<code>Data operators</code>:数据操作符,用来访问数据源中的要素 <code>feature</code>

<code>Camera operators</code>:照相机操作符,用来访问当前地图视图的各个参数

<code>Expressions</code> 是 <code>Expression</code> 的集合。而 <code>Expression</code> 是以 <code>JSON</code> 数组的形式来表示的,数组的第一个元素是 <code>Expression</code> 的操作符的名称,后续的元素表示操作的参数(也可以是一个 <code>Expression</code>)。

由以上 <code>5</code> 种操作符,相应地可以推出 <code>5</code> 种表达式集合 <code>Expressions</code>,并且相互之间可以组合使用:

<code>Mathematical expressions</code>

<code>Logical expressions</code>

<code>String expressions</code>

<code>Data expressions</code>

<code>Camera expressions</code>

这里主要讲述 <code>Data expressions</code> 和 <code>Camera expressions</code>。

一个 <code>data expression</code> 是可以访问要素数据的任何表达式。而这些表达式使用了以下至少一种数据操作符:

<code>get</code>:用于获取要素的属性值,格式为 <code>["get", "property_name"]</code>,余下具体的可以看 <code>Expression reference</code>

<code>has</code>

<code>id</code>

<code>geometry-type</code>

<code>properties</code>

<code>feature-state</code>

通过 <code>data expression</code> 可以实现区分同一个图层中的不同要素,并以不同的形式呈现。比如设置颜色 <code>circle-color</code>:

需要注意的是,并非所有的 <code>layout</code> 布局类属性和 <code>paint</code> 绘制类属性都支持 <code>data expression</code>:

具体可以看 <code>SDK Support</code> 中的 <code>data-driven styling</code> 那一行; 而且使用了 <code>feature-state</code> 操作符的 <code>data expression</code> 仅在 <code>paint</code> 绘制类属性中可用。

以下是官网中记录的暂不支持数据表达式 <code>data expression</code> 的属性:

一个 <code>camera expression</code> 是使用了 <code>zoom</code> 操作符的任何表达式。

通过 <code>camera expression</code> 可以实现图层 <code>layer</code> 根据地图的缩放层级 <code>zoom</code> 有不同的表现。 比如设置半径 <code>circle-radius</code>:

所有可以使用 <code>Expression</code> 的属性都支持 <code>camera expression</code>。不过当用于 <code>layout</code> 布局类属性和 <code>paint</code> 绘制类属性时,必须是以下几种格式:

为什么呢?因为 <code>["zoom"]</code> 在 <code>layout</code> 布局类属性和 <code>paint</code> 绘制类属性中仅作为 <code>interpolate</code> 或 <code>step</code> 操作的输入参数。

需要注意,<code>layout</code> 布局类属性和 <code>paint</code> 绘制类属性有一个很重要的区别:

<code>layout</code> 布局类属性中使用的 <code>camera expression</code> 只有在 <code>zoom</code> 的值是 <code>整数变化</code> 时才会重新计算。 <code>paint</code> 绘制类型属性中使用的 <code>camera expression</code> 在<code>zoom</code> 的值是 <code>小数变化</code> 时也会重新计算。比如 <code>zoom</code> 从 <code>4.1</code> 变为 <code>4.6</code>。

前面介绍了表达式集合 <code>Expressions</code>,简单地讲述了其中的 <code>Data expressions</code> 和 <code>Camera expressions</code>,而这些表达式里涉及和很多的操作符,这里就对每个操作符进行分类介绍,作为表达式的参考 <code>Expression reference</code>。

主要分为以下几类操作符:

<code>Types</code>

<code>Feature data</code>

<code>Lookup</code>

<code>Decision</code>

<code>Variable binding</code>

<code>String</code>

<code>Color</code>

<code>Math</code>

<code>Zoom</code>

<code>Heatmap</code>

<code>Types</code>:这类操作符用于 <code>断言</code> 和 <code>转换</code> 数据的类型,包含的操作符如下:

<code>Feature data</code>:这类操作符用于操作要素的数据。

<code>Lookup</code>:这类操作符用于查找并获取值

<code>Decision</code>:这类操作符用于条件判断

<code>Ramps, scales, curves</code>:这类操作符用于渐变、缩放、曲线等特殊效果的设置。

<code>Variable binding</code>:这类操作符用于变量绑定。

<code>String</code>:这类操作符用于操作字符串。

<code>Color</code>:这类操作符用于操作颜色。

<code>Math</code>:这类操作符用于数学运算。

<code>Zoom</code>:这类操作符只包含一个操作符 <code>zoom</code>,用于获取当前地图的缩放层级。

<code>Heatmap</code>:这类操作符只包含一个操作符 <code>heatmap-density</code>,用于获取热力图的密度(特定像素内有多少个数据点),只能在 <code>heatmap-color</code> 中使用。

之前介绍了表达式集合 <code>Expressions</code>,我们知道了 <code>layout</code> 布局类属性和 <code>paint</code> 绘制类属性的值都可以设为一个表达式 <code>Expression</code>。

同样地,函数 <code>Function</code> 也可以作为其 <code>layout</code>布局类属性和 <code>paint</code> 绘制类属性的属性值。

需要注意的是,在使用 <code>Function</code> 作为属性值时,实际上是一个对象 <code>{}</code>。 ps:不晓得 <code>Function</code> 翻译成 “函数” 对不对,还是说翻译成 “功能”......

<code>Functions</code> 是 <code>Function</code> 的集合。<code>Function</code> 可以用来根据 <code>地图缩放层级</code> 和 <code>地图要素的属性</code> 来控制地图要素的呈现。所以可以分为三类:

<code>Zoom functions</code>

<code>Property functions</code>

<code>Zoom-and-property functions</code>

一个 <code>zoom function</code> 允许地图的呈现根据 <code>地图的缩放层级</code> 而改变。

一个 <code>property function</code> 允许地图的呈现根据 <code>地图要素的属性</code> 而改变。

一个 <code>zoom-property function</code> 允许地图的呈现根据 <code>地图的缩放层级</code> 和 <code>地图要素的属性</code> 而改变。

(完)