地图样式总览
本文回答:vjmap 样式规范 / layer / paint / 表达式 / 数据驱动 / 主题 / 3D 拉伸 / Sprite Glyphs / 雾天空 —— vjmap 样式体系总览。
vjmap 采用 JSON 样式规范 描述地图外观,遵循业界主流 WebGL 地图样式格式。
分类
| 类别 | 目的 | 子文件 |
|---|---|---|
| Style Spec 基础 | version / sources / layers 结构 | style-spec |
| 图层样式 | background / fill / line / symbol / circle / fill-extrusion / heatmap / hillshade / raster | layer-styles |
| 表达式 | ["get", ...] / ["case", ...] / ["interpolate", ...] |
expressions |
| 数据驱动样式 | 根据 feature 属性动态变色变粗 | data-driven |
| 3D 拉伸 | fill-extrusion-height 建筑物 3D |
extrusion-3d |
| 雾/天空/大气 | SkyLayer / setFog / 光照 | fog-sky-atmosphere |
| Sprite/Glyphs | 图标集、字体、loadImage / addImage | sprite-glyphs |
| 主题切换 | vjmap.openMapDarkStyle / LightStyle / svc.cmdUpdateStyle | theme-switch |
核心结构
{
version: 8,
name: "my-style",
sprite: "https://.../sprite",
glyphs: "https://.../{fontstack}/{range}.pbf",
sources: {
"cad-raster": { type: "raster", tiles: ["https://..."], tileSize: 256 } // CAD 栅格瓦片是 256
},
layers: [
{ id: "bg", type: "background", paint: { "background-color": "#fff" } },
{ id: "cad", type: "raster", source: "cad-raster" }
]
}
修改样式的两套路径
- 前端修改 vjmap Layer:对 GeoJSON 图层 / 矢量瓦片图层用
setPaintProperty/setLayoutProperty。 - 后端修改 CAD 样式:对 CAD 栅格/矢量瓦片,用
map.updateStyle(svc, { backcolor, expression, ... })改后端表达式(内部调svc.cmdUpdateStyle并刷新瓦片;只调svc.cmdUpdateStyle不会刷新地图)。
主题级 Top 3 陷阱
paintvslayout:paint 属性(颜色、线宽)随小数 zoom 重算;多数 layout 属性按瓦片的整数 zoom 求值——但text-size/icon-size的 zoom 表达式会在小数 zoom 上插值。- 表达式类型不一致:
["==", ["get", "n"], 1]里 n 如果是字符串 "1",对比不成立;用["==", ["to-number", ["get", "n"]], 1]显式转换。 - CAD 栅格逐实体改色只能在后端:渲染在服务端完成,请用
map.updateStyle/svrStyleVar表达式。但整体反色 / 单色化前端就能做:本版引擎扩展了 raster 的raster-inverse(=1 时反色)与raster-monochrome(非黑色时按该色单色化),如map.setPaintProperty(svc.rasterLayerId(), "raster-inverse", 1)或map.setRasterInverse(svc.rasterLayerId(), 1)。