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