@anov/gis-skills-cli 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +618 -0
- package/INSTALL.md +478 -0
- package/LICENSE +15 -0
- package/README.md +148 -2
- package/RELEASING.md +160 -0
- package/bin/anov-gis-skills.mjs +408 -0
- package/lib/mcp-config.mjs +273 -0
- package/package.json +42 -4
- package/skills/anovgis-analysis/SKILL.md +585 -0
- package/skills/anovgis-effects/SKILL.md +260 -0
- package/skills/anovgis-imagery-terrain/SKILL.md +505 -0
- package/skills/anovgis-layers/SKILL.md +627 -0
- package/skills/anovgis-materials/SKILL.md +635 -0
- package/skills/anovgis-models-3dtiles/SKILL.md +448 -0
- package/skills/anovgis-pitfalls/SKILL.md +561 -0
- package/skills/anovgis-popup-widget/SKILL.md +474 -0
- package/skills/anovgis-primitives/SKILL.md +482 -0
- package/skills/anovgis-vector-graphics/SKILL.md +602 -0
- package/skills/anovgis-viewer/SKILL.md +618 -0
- package/skills/using-anovgis/DEMO-MAP.md +64 -0
- package/skills/using-anovgis/DEMO-SKILL-MAP.md +248 -0
- package/skills/using-anovgis/DOMAINS.md +183 -0
- package/skills/using-anovgis/REFERENCE.md +114 -0
- package/skills/using-anovgis/SKILL.md +392 -0
- package/skills/using-anovgis/templates/README.md +154 -0
- package/skills/using-anovgis/templates/combo1-vue3-vite.md +295 -0
- package/skills/using-anovgis/templates/combo2-vue2-cli.md +119 -0
- package/skills/using-anovgis/templates/combo3-html-cdn.md +107 -0
- package/skills/using-anovgis/templates/combo4-vanilla-webpack.md +91 -0
- package/skills/using-anovgis/templates/wizard-profiles.md +105 -0
- package/vendor/cesiumjs-skills/LICENSE +201 -0
- package/vendor/cesiumjs-skills/NOTICE +18 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-3d-tiles/SKILL.md +465 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-camera/SKILL.md +500 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-core-utilities/SKILL.md +403 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/REFERENCE.md +397 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/SKILL.md +351 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/01-diffuse-tint.js +38 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/02-texture-swap.js +42 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/03-feature-id-tileset.js +29 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/04-translucent-override.js +37 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/05-vertex-displacement.js +49 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/06-metadata-ramp.js +34 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/07-voxel-shader.js +27 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/README.md +19 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-custom-shader/examples/_sandcastle-template.html +9 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-entities/SKILL.md +389 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-imagery/SKILL.md +471 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-interaction/SKILL.md +423 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-materials-shaders/SKILL.md +292 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-models-particles/SKILL.md +423 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-primitives/SKILL.md +537 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-spatial-math/SKILL.md +358 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-terrain-environment/SKILL.md +401 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-time-properties/SKILL.md +353 -0
- package/vendor/cesiumjs-skills/skills/cesiumjs-viewer-setup/SKILL.md +434 -0
- package/vendor/cesiumjs-skills/skills/using-cesiumjs-skills/SKILL.md +35 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: using-anovgis
|
|
3
|
+
description: anov-gis skill 入口路由。涵盖 CDN/npm 引入、setBaseUrl 时机、最小 Viewer 构造、4 步工作流、12 skill 路由表、Demo 场景路由表、引导式初始化(AskUserQuestion 向导:底图 / 控件 / 部署,技术栈固定 Vue 3 + Vite)、POI 标绘选型(默认 DivIcon,>100 个问用户)。触发关键词:ANOVGIS、@anov/gis、新建项目、初始化、从零开始、应该用哪个 skill、quickstart、demo、xxx.html、帮我改、加载、引导、引导式初始化、init wizard、setup wizard、初始化向导、vite、vue3、POI、标绘、标点、点位、divIcon。Use when 第一次接触 @anov/gis、需要从空白工程初始化 Viewer、不知道该跳到哪个具体 skill、要把现有工程迁移到 @anov/gis、看到 demo 文件名想知道怎么改、想用向导方式生成项目骨架、从 0 创建 vite+vue3 项目、做 POI 标绘。
|
|
4
|
+
anov-gis-baseline: 1.8.6
|
|
5
|
+
cesium-baseline: 1.143.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# anov-gis Skill 入口
|
|
9
|
+
|
|
10
|
+
为基于 `@anov/gis` SDK(Cesium 1.143 封装)开发二三维 WebGIS 应用时使用。本 skill 是 **12 个子 skill** 的入口路由,回答"我从哪开始 / 应该用哪个 skill / 这个 demo 改 X 怎么改 / 怎么从零搭一个项目"。
|
|
11
|
+
|
|
12
|
+
> ⚠️ **优先级**:本 skill 优先于 SDK 源码 / `node_modules/@anov/gis/`。
|
|
13
|
+
> 遇到 API 行为疑问先查本 skill 与 `anovgis-pitfalls` 各章节。**严禁**主动 Glob/Grep `node_modules/@anov/gis/src/...` / `dist/...`;除非用户明确要求并承担风险。
|
|
14
|
+
|
|
15
|
+
> 🔧 **调试流程**:见下方「§ 默认调试流程」——Chrome DevTools 仅在第 5 级兜底,前 4 级用本 skill / cesiumjs-skills / 读 demo / grep 解决。
|
|
16
|
+
|
|
17
|
+
锁定版本:**`@anov/gis` v1.8.6**(Cesium **1.143.0**)。
|
|
18
|
+
|
|
19
|
+
> **两种上手路径二选一**:
|
|
20
|
+
> - **A. 引导式(推荐新手)**:直接说"使用 anov-gis 初始化三维地球",AI 通过 AskUserQuestion 引导你选底图 / 控件 / 部署(**技术栈固定 Vue 3 + Vite**),输出完整可运行骨架。详见下文「引导式初始化」章节。
|
|
21
|
+
> - **B. 自助式**:根据下方的 `12 skill 路由表` + `Demo 路由表` 自己挑 skill,跳到对应章节的代码模板。
|
|
22
|
+
|
|
23
|
+
## 12 skill 路由表
|
|
24
|
+
|
|
25
|
+
按"用户意图"组织。回答"做 X"先看本表,确定跳到哪个 skill:
|
|
26
|
+
|
|
27
|
+
| 你的问题 | 跳到 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| 不知道该用哪个 skill / 从零开始建项目 / 想用引导式向导生成骨架 | `using-anovgis`(本 skill,看「引导式初始化」章节) |
|
|
30
|
+
| 配置 Viewer 控件 / 坐标系转换 / 订阅鼠标事件 / flyTo / 天空盒 / 默认视角 | [`anovgis-viewer`](../anovgis-viewer/SKILL.md) |
|
|
31
|
+
| 加载 / 切换影像底图 / 天地图 key / WMS / WMTS / 地形 / 卷帘 / 暗色主题 / 离线部署 | [`anovgis-imagery-terrain`](../anovgis-imagery-terrain/SKILL.md) |
|
|
32
|
+
| 加载 GeoJSON / 3D Tiles 容器 / CZML / KML / GPX / TopoJSON / 聚合层 / DOM 叠加 / 4490 矢量瓦片 | [`anovgis-layers`](../anovgis-layers/SKILL.md) |
|
|
33
|
+
| 创建点 / 线 / 面 / 图标 / 文字 / 立方体 / 球 / Model / Tileset 加载 + 拾取 + 抽壳 + 调色 | [`anovgis-models-3dtiles`](../anovgis-models-3dtiles/SKILL.md)(v0.2.0 新增) |
|
|
34
|
+
| 创建点 / 线 / 面 / 图标 / 文字 / 自定义 shader 模型 / ThreeLayer 桥接 / divInfo 弹窗 | [`anovgis-vector-graphics`](../anovgis-vector-graphics/SKILL.md) |
|
|
35
|
+
| Primitive 19 类(雷达扫描 Primitive / 尾迹线 Primitive / 流动线 Primitive / 扩散墙 Primitive / 动态水面 Primitive / 云 / 光柱 / 弹跳图标) | [`anovgis-primitives`](../anovgis-primitives/SKILL.md)(v0.2.0 新增) |
|
|
36
|
+
| Popup / Tooltip / 信息框 / bindPopup / bindTooltip / highlight / tilesetpopup / imagerylayerpopup / divInfo | [`anovgis-popup-widget`](../anovgis-popup-widget/SKILL.md)(v0.2.0 新增) |
|
|
37
|
+
| 配置流动线 / 水面 / 雷达 / 扩散波 / 导航线 / 渐变线 / 抛物线 / 图片扫描材质 | [`anovgis-materials`](../anovgis-materials/SKILL.md) |
|
|
38
|
+
| 标绘 / 测量 / 剖切 / 热力图 / 风场 / 水淹 / 三轴编辑 / PositonEditor / Geocoder / WFS | [`anovgis-analysis`](../anovgis-analysis/SKILL.md) |
|
|
39
|
+
| 下雨 / 下雪 / 起雾 / 卷云 / 漫游 / 环绕 / 航线 / 全球自转 / 后期处理(Bloom / 夜视 / 景深)/ 天空盒 | [`anovgis-effects`](../anovgis-effects/SKILL.md) |
|
|
40
|
+
| 黑屏 / 白屏 / 报错 / 改值不生效 / Workers 404 / AMD / 自定义图元编译报错 | [`anovgis-pitfalls`](../anovgis-pitfalls/SKILL.md) |
|
|
41
|
+
|
|
42
|
+
**v0.3.0 候选(暂未上线)**:`anovgis-three-layer`(ThreeLayer 桥接)、`anovgis-custom-primitive-worker`(DrawCommand / GLSL / WebWorker)、`anovgis-offline-deployment`(WFS / 4490 / 内网)、`anovgis-roaming-editor-time`(漫游 / 编辑控件 / 时间轴)。
|
|
43
|
+
|
|
44
|
+
## Out-of-scope
|
|
45
|
+
|
|
46
|
+
- ❌ 不要在本 skill 写具体 API 用法 → 各归对应领域 skill(见 § 12 skill 路由表 + `DOMAINS.md` § 1 权威归属表)
|
|
47
|
+
- ❌ 不要在本 skill 写完整工程脚手架 → 见 `templates/`
|
|
48
|
+
- ❌ 不要引用本机绝对路径或外部 HTML → 见 § skill 自包含铁律
|
|
49
|
+
- ❌ 不要写 Cesium 原生 API 细节 → 归 `cesiumjs-skills` 插件(见 `anovgis-pitfalls` P0)
|
|
50
|
+
|
|
51
|
+
## Demo 场景 → Skill 路由表
|
|
52
|
+
|
|
53
|
+
> 已拆到 [`DEMO-MAP.md`](DEMO-MAP.md)(按业务场景 → skill,58 行)。
|
|
54
|
+
> 具体 demo **文件名** → skill 的完整矩阵(137 个 demo)见 [`DEMO-SKILL-MAP.md`](./DEMO-SKILL-MAP.md)。
|
|
55
|
+
## ⚠️ 第 0 铁律:写代码前**查 skill 里嵌入的代码**(v0.2.4 加)
|
|
56
|
+
|
|
57
|
+
> 这是 skill 体系的**最高优先级规则**。`ceshi2` 项目反馈原文:
|
|
58
|
+
> > "不是只有让加 POI 的时候才想起来读一下 examples,其他功能也需要参考。比如我说加载暗色系地图,你将如何应对。"
|
|
59
|
+
|
|
60
|
+
### 3 步强制流程(**绝不依赖外部文件**)
|
|
61
|
+
|
|
62
|
+
每次接到"做 X 功能"的需求,**严格按 3 步走**,不允许跳过:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
步骤 1 — 关键词提取
|
|
66
|
+
└─ 用户原话:"加载暗色系地图"
|
|
67
|
+
└─ 提炼关键词:theme / dark / invert / invertColor / ImageryThemeGL / maptheme
|
|
68
|
+
|
|
69
|
+
步骤 2 — 查 skill 里的「关键词 → 章节」速查表(REFERENCE.md)
|
|
70
|
+
└─ 命中「暗色 / 夜间 / 反色」行 → 对应章节 anovgis-imagery-terrain § S10
|
|
71
|
+
└─ S10 已嵌入完整 setTheme 代码,直接抄
|
|
72
|
+
|
|
73
|
+
步骤 3 — 写入代码 + 在注释里写「SDK v1.8.6 API,anongis-imagery-terrain § S10」
|
|
74
|
+
└─ 严禁凭印象 / 凭空写「暗色系 = brightness=-1 / saturation=0」之类的野路子
|
|
75
|
+
└─ 严禁引用外部 E:/.../examples/.../*.html 路径(本机路径,别人访问不到)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### ⚠️ skill 自包含铁律(本节最重要)
|
|
79
|
+
|
|
80
|
+
> **skill 必须是自包含的**——所有「写 X 功能」需要的代码,都已嵌入对应 skill 章节的 snippet。
|
|
81
|
+
> 速查表的「对应章节」列指向**本 skill 体系内的章节**,不是外部 HTML 文件。
|
|
82
|
+
>
|
|
83
|
+
> - ✅ 引用方式:用对应章节的标题(如 `anovgis-imagery-terrain § S10`)或锚点
|
|
84
|
+
> - ❌ **绝对禁止**引用 `E:/zhf/gitlab/ANOV-GIS/...` 或其他本机路径(用户机器上不存在)
|
|
85
|
+
> - ❌ **绝对禁止**用 `// 来源: examples/.../foo.html L78-105` 后**省略代码**——必须把核心代码嵌入 skill
|
|
86
|
+
> - ✅ 保留 `// SDK v1.8.6 examples/basemap/maptheme.html L61-L78` 作为**追溯来源注释**,**但代码必须已在 skill 里**
|
|
87
|
+
|
|
88
|
+
### 用户关键词 → skill 章节速查表
|
|
89
|
+
|
|
90
|
+
> 接到需求时**先查速查表**,按「对应章节」跳到 skill 体系内对应位置,**代码已嵌在那**,不要再去找外部文件。
|
|
91
|
+
|
|
92
|
+
**必须 Read [`REFERENCE.md`](REFERENCE.md)(64 条关键词 → 章节对照,每条带可点击锚点)后再定位具体章节** —— 不要凭印象猜章节号。
|
|
93
|
+
|
|
94
|
+
<a id="poi-selection"></a>
|
|
95
|
+
|
|
96
|
+
### POI 标绘选型(DivIcon 默认)
|
|
97
|
+
|
|
98
|
+
> **规则(v0.2.13)**:做 POI 标绘 / 批量点位时,**默认用 `DivIcon`(DOM 路线)**,不要直接上 Cesium 原生 `Billboard`。
|
|
99
|
+
> **只有 POI 数量 > 100 时**,先 `AskUserQuestion` 问用户选哪种渲染方式(涉及性能,用户自己更清楚数据规模与样式需求)。
|
|
100
|
+
|
|
101
|
+
| POI 数量 | 走哪条路 | 容器 | 类 |
|
|
102
|
+
|---|---|---|---|
|
|
103
|
+
| **≤ 100** | **默认,直接做,不问** | `HtmlLayer` | `new ANOVGIS.DivIcon(position, html)` |
|
|
104
|
+
| **> 100** | **先 `AskUserQuestion` 问用户** | ↓ 见下方 | ↓ |
|
|
105
|
+
|
|
106
|
+
**为什么默认 DivIcon**:POI 标绘的样式需求通常是「图标 + 文字 + 富文本卡片」,`DivIcon` 直接吃 HTML 字符串,能做多层嵌套结构、CSS 动画、`<img>` 贴图、内嵌按钮;`Billboard` 只能贴一张图片(canvas / URL),要做富样式得先画进 canvas,反而更绕。
|
|
107
|
+
**为什么 >100 要问**:`HtmlLayer` 每帧通过 `scene.postRender` 把 `cartesianToCanvasCoordinates` 写进 DOM `transform`,**DOM 节点 > 1000 会掉帧**;而 `Billboard` 走 Cesium 原生 GPU 渲染,样式受限但性能稳。100 是个保守起点(远低于 1000 的掉帧线),够用又不至于误伤。
|
|
108
|
+
|
|
109
|
+
#### > 100 个:问用户(`AskUserQuestion`)
|
|
110
|
+
|
|
111
|
+
```js
|
|
112
|
+
AskUserQuestion({
|
|
113
|
+
questions: [{
|
|
114
|
+
question: "POI 数量 500,选哪种渲染方式?",
|
|
115
|
+
header: "POI 渲染",
|
|
116
|
+
multiSelect: false,
|
|
117
|
+
options: [
|
|
118
|
+
{ label: "DivIcon (DOM)", description: "样式最自由,可嵌富文本/按钮/图片;数量大时可能掉帧" },
|
|
119
|
+
{ label: "Billboard (Cesium 原生)", description: "GPU 渲染性能稳;样式受限,只能贴一张图" }
|
|
120
|
+
]
|
|
121
|
+
}]
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
> 用户明确说「用 billboard」「性能优先」「数量上万」→ 直接走 Billboard,不问。
|
|
126
|
+
> 用户明确说「要富文本」「带卡片」「带按钮」→ 直接走 DivIcon,不问。
|
|
127
|
+
|
|
128
|
+
#### 方案 A:DivIcon(默认,≤100 个)
|
|
129
|
+
|
|
130
|
+
```js
|
|
131
|
+
// 来源: examples/public/examples/html/graphics/divInfo.html L111-L135
|
|
132
|
+
const layer = new ANOVGIS.HtmlLayer({ layerName: 'poi' });
|
|
133
|
+
viewer.addLayer(layer);
|
|
134
|
+
|
|
135
|
+
pois.forEach(poi => {
|
|
136
|
+
const div = new ANOVGIS.DivIcon(
|
|
137
|
+
new ANOVGIS.Position(poi.lng, poi.lat, poi.height ?? 0),
|
|
138
|
+
`<div class="poi-card">
|
|
139
|
+
<img class="poi-img" src="${poi.iconUrl}" />
|
|
140
|
+
<div class="poi-name">${poi.name}</div>
|
|
141
|
+
</div>`
|
|
142
|
+
);
|
|
143
|
+
div.setOptions({
|
|
144
|
+
horizontalOrigin: 'CENTER', verticalOrigin: 'TOP',
|
|
145
|
+
offsetX: 0, offsetY: -60,
|
|
146
|
+
pointerEvents: true, // 开启后 DOM 可交互
|
|
147
|
+
scaleByDistance: { near: 0, nearValue: 1.0, far: 10000, farValue: 0.0 }
|
|
148
|
+
});
|
|
149
|
+
div.addEventListener(ANOVGIS.MouseEventType.CLICK, () => selectPoi(poi));
|
|
150
|
+
layer.addGraphic(div);
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
#### 方案 B:Billboard(用户选了性能优先时)
|
|
155
|
+
|
|
156
|
+
```js
|
|
157
|
+
// 来源: examples/public/examples/html/graphics/point.html L54-122
|
|
158
|
+
// Point 内嵌 billboard + label,是 SDK 的标准 POI 组合
|
|
159
|
+
const layer = new ANOVGIS.VectorLayer();
|
|
160
|
+
viewer.addLayer(layer);
|
|
161
|
+
|
|
162
|
+
pois.forEach(poi => {
|
|
163
|
+
const p = new ANOVGIS.Point([poi.lng, poi.lat, poi.height ?? 0], {
|
|
164
|
+
billboard: {
|
|
165
|
+
image: poi.iconUrl, // 贴图 URL / canvas
|
|
166
|
+
scale: 1.0,
|
|
167
|
+
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
|
168
|
+
scaleByDistance: new ANOVGIS.NearFarScalar(0, 1.0, 10000, 0.5)
|
|
169
|
+
},
|
|
170
|
+
label: {
|
|
171
|
+
text: poi.name,
|
|
172
|
+
font: '14px sans-serif',
|
|
173
|
+
fillColor: '#ffffff',
|
|
174
|
+
outlineColor: '#000000',
|
|
175
|
+
outlineWidth: 2,
|
|
176
|
+
pixelOffset: new Cesium.Cartesian2(0, -24),
|
|
177
|
+
scaleByDistance: new ANOVGIS.NearFarScalar(0, 1.0, 10000, 0.5)
|
|
178
|
+
},
|
|
179
|
+
infoData: { title: poi.name, fieldsMap: [{ nameC: '编号', value: poi.id }] }
|
|
180
|
+
});
|
|
181
|
+
p.bindPopup({ viewer, showTitle: true });
|
|
182
|
+
layer.addGraphic(p);
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
> `Billboard` 路线想再快一档可改用 `anovgis-primitives` 的 `BillboardPrimitive`(`BillboardCollection`,走 Primitive 体系避开 Entity);上万纯色点用 `PointPrimitive`。见 [`anovgis-primitives`](../anovgis-primitives/SKILL.md)。
|
|
187
|
+
|
|
188
|
+
### 反模式(违规信号)
|
|
189
|
+
|
|
190
|
+
- ❌ **凭想象造**:"暗色系 = brightness=-1,saturation=0" → **错的**,SDK 有专门的 `ImageryThemeGL.invert: true`(见 anovgis-imagery-terrain § S10)
|
|
191
|
+
- ❌ **跳过查表**:看到"加载 X"直接写代码 → **错的**,先查速查表跳到对应章节
|
|
192
|
+
- ❌ **引用本地路径**:`new Cesium.UrlTemplateImageryProvider({url: 'E:/zhf/gitlab/...'})` 或 `// 来源: E:/zhf/...` → **错的**,其他用户访问不到
|
|
193
|
+
- ❌ **skill 章节只写路径不嵌代码**:`// 见 examples/foo.html` 后省略 snippet → **错的**,代码必须嵌入
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## ⚠️ 框架集成 3 条铁律(Vue/React/Svelte 必读)
|
|
198
|
+
|
|
199
|
+
> 这 3 条是 hainan/neimengnongken 等 Vue 项目反复踩坑总结的,写在前 4 行章节之前。
|
|
200
|
+
|
|
201
|
+
1. **3D 大对象严禁进响应式**。`viewer` / `scene` / `camera` / `entity` / `primitive` / `imageryLayers` / `viewer.clock` / `viewer._cesiumWidget`
|
|
202
|
+
一律放**模块级 `let`**(Composition API 用文件级 `let`,**不要 wrap `ref()`**)。
|
|
203
|
+
进 Vue 的 `data()` / `reactive()` / `ref()` / `computed()` 会触发每帧 setter,60fps 直接变 5fps,甚至把 main thread 阻塞到无响应。
|
|
204
|
+
2. **Cesium 命名空间走 `window.Cesium`**(**唯一推荐**)。`@anov/gis` SDK 启动时主动 `window.Cesium = Cesium`。
|
|
205
|
+
- ❌ 不要写 `ANOVGIS.Cesium`(v1.8.6 SDK 未把 Cesium 对象本身挂到顶层,会报 `undefined`)
|
|
206
|
+
- ❌ 不要写 `import Cesium from 'cesium'`(SDK 已封装 Cesium,重复装包)
|
|
207
|
+
- 详见 `anovgis-viewer` § 1 命名空间速查 + `anovgis-pitfalls` § P7
|
|
208
|
+
3. **ANOVGIS 全局化(仅调试用)**。在入口处 `window.ANOVGIS = ANOVGIS` 便于 devtools 调试;
|
|
209
|
+
但**业务代码用 import 进来的局部变量**,不要写 `window.ANOVGIS.Viewer` / `window.ANOVGIS.setBaseUrl`。
|
|
210
|
+
|
|
211
|
+
**Vue 骨架对照**(❌ 错误 vs ✅ 正确)见 [`templates/combo1-vue3-vite.md`](templates/combo1-vue3-vite.md) § 变体 —— 铁律 1 的具体写法。
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 🔧 默认调试流程(按优先级,禁止越级)
|
|
216
|
+
|
|
217
|
+
遇到 anov-gis 问题,按下面 5 级顺序排查;**前 4 级没解决才用 Chrome DevTools**。
|
|
218
|
+
|
|
219
|
+
| 优先级 | 工具 | 何时用 |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| 1 | 读本 skill 的「陷阱」章节([`anovgis-pitfalls`](../anovgis-pitfalls/SKILL.md)) | 覆盖 90% 常见报错(黑屏 / 不生效 / 报错 / 改值无变化 / Workers 404) |
|
|
222
|
+
| 2 | 读 `cesiumjs-skills` 插件的 `using-cesiumjs-skills` skill(未安装见 anov-gis-skills INSTALL.md §方式 B.5) | 14 个子 skill,按需路由;覆盖 Cesium 原生 API 行为。**API 名与写法通用,但取法不同**:其 `import { X } from "cesium"` 一律换成 `const Cesium = window.Cesium` 后取 `Cesium.X`。**不要用相对路径找 cesiumjs-skills 的文件** —— 两个插件独立装到各自的缓存目录,目录不相邻;按 skill 名引用即可 |
|
|
223
|
+
| 3 | 读已存在的 demo 源码(`examples/public/examples/html/...` 或用户项目 `src/`) | 参考成熟写法 |
|
|
224
|
+
| 4 | Grep / Read 用户项目代码 | 定位上下文 |
|
|
225
|
+
| 5 | Chrome DevTools MCP(`mcp__plugin_cesiumjs-skills_chrome-devtools__evaluate` / `navigate` / `screenshot`) | **仅当**用户明确说「打开页面看看」「截图给我看」「页面上 console 有 X 报错」才用 |
|
|
226
|
+
|
|
227
|
+
**禁止用法**:
|
|
228
|
+
|
|
229
|
+
- ❌ 写代码前先 `navigate` 到 demo URL 验证语法(用 Read skill 即可)
|
|
230
|
+
- ❌ 解释 API 时 `evaluate` 一段代码探测运行态(用 skill snippet 即可)
|
|
231
|
+
- ❌ 每次回答都 `screenshot`(用户没要求截图就别截)
|
|
232
|
+
- ❌ 在 Write 工具之前 `evaluate` 探测 API 行为(应该用 skill / Read SDK 类型定义)
|
|
233
|
+
|
|
234
|
+
**实战数据**:hainan 项目 session 中 Chrome DevTools 累计调用 **922 次**(最大会话单次 537 次),响应慢到分钟级。按本流程可降到 < 50 次。
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 快速上手
|
|
239
|
+
|
|
240
|
+
**先判定走哪条路**(完整判定表与「已有项目接入 NPM」的写法见 [`templates/README.md`](templates/README.md)):
|
|
241
|
+
|
|
242
|
+
| 项目现状 | 走哪条路 |
|
|
243
|
+
|---|---|
|
|
244
|
+
| `package.json` 含 `@anov/gis`(Vite / Webpack / Vue CLI / Next) | **NPM**(首推)—— 见 [`templates/README.md`](templates/README.md) |
|
|
245
|
+
| 只有 `index.html` + 静态目录 | **CDN** —— 仅 demo / 内网单文件调试,见 [`templates/combo3-html-cdn.md`](templates/combo3-html-cdn.md) |
|
|
246
|
+
| 内网部署、无外网 CDN | NPM + `vite-plugin-static-copy` 把 `node_modules/@anov/gis/dist/resources/` 拷到 `public/anov-gis-sdk/` |
|
|
247
|
+
| 已用 CDN 引入要迁移到 NPM | 先看 [`anovgis-imagery-terrain`](../anovgis-imagery-terrain/SKILL.md) 离线部署,再按 NPM 走 |
|
|
248
|
+
|
|
249
|
+
> **首推 NPM**:90% 项目是 Vite/Vue/Webpack 工程,CDN 仅用于 demo 验证或内网单文件调试。
|
|
250
|
+
## 最小 Viewer
|
|
251
|
+
|
|
252
|
+
```js
|
|
253
|
+
ANOVGIS.setBaseUrl('/anov-gis-sdk/resources/'); // 必须在 new Viewer 之前
|
|
254
|
+
const viewer = new ANOVGIS.Viewer('cesiumContainer', { geocoderType: ANOVGIS.GeocoderType.TIANDITU });
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
完整参数(17 个)见 [`anovgis-viewer` § 2](../anovgis-viewer/SKILL.md#viewer-params);`setBaseUrl` 时机见 [`anovgis-pitfalls` P3](../anovgis-pitfalls/SKILL.md#p3-setbaseurl)。
|
|
258
|
+
## 集成方式与场景变体
|
|
259
|
+
|
|
260
|
+
| 场景 | 去哪看 |
|
|
261
|
+
|---|---|
|
|
262
|
+
| UMD 全局方式(`<script>` 引入) | [`templates/combo3-html-cdn.md`](templates/combo3-html-cdn.md) § 变体 |
|
|
263
|
+
| ESM 模块方式(`import` 引入) | [`templates/combo1-vue3-vite.md`](templates/combo1-vue3-vite.md) § 变体 |
|
|
264
|
+
| Vue 2 + vue-cli | [`templates/combo2-vue2-cli.md`](templates/combo2-vue2-cli.md) § 变体 |
|
|
265
|
+
| Vue 3 + Vite | [`templates/combo1-vue3-vite.md`](templates/combo1-vue3-vite.md) § 变体 |
|
|
266
|
+
## 引导式初始化(交互向导)
|
|
267
|
+
|
|
268
|
+
**触发关键词**(满足任一即进入):「使用 anov-gis 初始化三维地球」「新建 anov-gis 项目」「从头搭一个 Cesium 工程」「anov-gis 引导式」「init wizard」「setup wizard」。
|
|
269
|
+
|
|
270
|
+
**机制**:当用户在 prompt 中说以上任一关键词时,**主动调用 `AskUserQuestion` 工具**按下面 3 个问题并行询问,根据用户回答**一次性输出完整可运行的项目骨架**(含 `package.json` / 构建配置 / 入口文件 / 静态资源链接)。
|
|
271
|
+
|
|
272
|
+
### 步骤 0(必读):先判定该不该进入引导(v0.2.14 强化为双条件 AND)
|
|
273
|
+
|
|
274
|
+
> ⚠️ **v0.2.14 关键改动**:skill_test 项目(2026-10-28,"参考图片 1.png 实现智慧水利数字孪生大屏")实测,Claude 误判为「单 HTML + CDN 最快」,绕开了技术栈默认 Vue 3 + Vite 的约定。**根因**:原步骤 0 只看"项目是否空白",没看"用户是否表达了三维地球意图"。
|
|
275
|
+
>
|
|
276
|
+
> **v0.2.14 改双条件触发(AND)**:
|
|
277
|
+
|
|
278
|
+
#### 0.1 双条件判定(先做这步,再决定是否进入引导)
|
|
279
|
+
|
|
280
|
+
| 条件 | 判定方式 |
|
|
281
|
+
|---|---|
|
|
282
|
+
| **空白项目** | 当前工作目录 `package.json` 不含 `@anov/gis` 依赖 **且** 代码全文无 `new ANOVGIS.Viewer` / `Cesium.Viewer` / `Cesium.CesiumWidget` 初始化痕迹 |
|
|
283
|
+
| **明确意图** | 用户 prompt 含 `anov` / `@anov/gis` / `Cesium` / `三维地球` / `数字孪生` / `智慧XX` / `大屏` 等任意关键词 |
|
|
284
|
+
|
|
285
|
+
| 满足情况 | 走什么流程 |
|
|
286
|
+
|---|---|
|
|
287
|
+
| 双条件都满足 | 进入「引导式初始化」(步骤 1~5,输出 Vue 3 + Vite 骨架) |
|
|
288
|
+
| 仅空白项目,无明确意图 | **不触发引导**(用户可能在做别的事,硬引导反而打断) |
|
|
289
|
+
| 仅明确意图,无空白项目 | 走「修改现有项目」流程(按 Demo 路由表或用户已有代码改) |
|
|
290
|
+
| 都不满足 | 不进引导,正常回答 |
|
|
291
|
+
|
|
292
|
+
> **设计意图**:参考图只描述业务 UI,不暗示技术栈——**单 HTML + CDN 不是默认路径**。数字孪生大屏 / 应急指挥 / 智慧 XX / 大屏 等场景统一走 Vue 3 + Vite 骨架(参见组合 1 模板)。HTML+CDN 仅在用户**明确**说「单文件 / 不用 npm / 没构建工具」时才走组合 3。
|
|
293
|
+
|
|
294
|
+
#### 0.2 已确定要进引导后 → 跳过哪些问
|
|
295
|
+
|
|
296
|
+
> 用户在 prompt 里说了具体技术栈 / 已有项目上下文时,**直接用该信息,不要再弹问**。
|
|
297
|
+
|
|
298
|
+
| 用户 prompt 包含 / 项目现状 | 跳过哪些问 | 必问哪些 |
|
|
299
|
+
|---|---|---|
|
|
300
|
+
| `vue3`/`vite` + `本目录`/`本地`/`当前`(或任何技术栈 + 部署词) | **跳过全部 3 问**(直接出默认组合 1 骨架) | 无 |
|
|
301
|
+
| `vue3`/`vite` 等具体技术栈(无部署词) | 跳过 Q1 底图(已指定时) | Q1 底图(如未指定)/ Q2 控件 / Q3 部署 |
|
|
302
|
+
| 项目 `package.json` 已含 `@anov/gis` | 跳过 Q3(如未提及离线/CDN) | 仅 Q1 底图 / Q2 控件 |
|
|
303
|
+
| 用户说「最小骨架」/「quickstart」/「3 行跑起来」/「hello world」 | 跳过 Q2(默认「极简」profile) + 跳过 Q3(默认「本地 SDK」) | 仅 Q1 底图 |
|
|
304
|
+
| 完全空白,无任何线索(「帮我做个三维地球」) | 不跳过 | 全部 3 问 |
|
|
305
|
+
|
|
306
|
+
**默认底图 key**:当用户选「天地图」时,**直接用 ANOV-GIS 官方 demo key** `b832b9764939cbb0919148c548b669ba`(SDK examples/src/mixins/mixin.js 硬编码)。**不要让用户去天地图控制台申请**,除非用户明确说「要自己的 key」或「正式部署」。
|
|
307
|
+
|
|
308
|
+
**默认组合**(当步骤 0 跳过全部 3 问时直接用):
|
|
309
|
+
- 技术栈:**Vue 3 + Vite(固定,不再问)**
|
|
310
|
+
- 底图:天地图(demo key)
|
|
311
|
+
- 控件:标准 demo profile(顶部全开 / 时间轴关)
|
|
312
|
+
- 部署:本地 SDK 包(`vite-plugin-static-copy` 拷贝 `dist/resources` → `public/anov-gis-sdk/`,**无需 `@anov/vite-plugins`**)
|
|
313
|
+
- 对应模板见下方「§ 组合 1:Vue 3 + Vite + 推荐控件 + 天地图 + 内网本地 SDK ⭐ 推荐」
|
|
314
|
+
|
|
315
|
+
**实战数据**:claude方式 项目 v0.2.2 / v0.2.6 修复前平均要问 3 问 + 引导 5+ 步,**用户每次都得回头指导修复**。skill_test v0.2.13 之前走单 HTML+CDN 路线 → 部署到内网 HTTP 失败 + 地球黑屏(baseLayerPicker:false 没显式 addImageryProvider,见 `anovgis-pitfalls` § P12)。按 v0.2.14 双条件触发 + 默认组合 1,1 轮 `Write` 即可得到可运行骨架。
|
|
316
|
+
|
|
317
|
+
### 步骤 1:发起 3 个并行问题(一次 `AskUserQuestion` 调用)
|
|
318
|
+
|
|
319
|
+
> **技术栈固定 Vue 3 + Vite**(v0.2.12 起不再询问)——从 0 创建项目默认就用 vite + vue3,团队事实标准。
|
|
320
|
+
> 用户**明确点名**其它技术栈(Vue 2 / HTML+CDN / Vanilla webpack)时,才改用对应模板(见下文 § 模板 组合 2/3/4)。
|
|
321
|
+
|
|
322
|
+
| 问题 | 选项(✓ = 推荐) | 决定什么 |
|
|
323
|
+
|---|---|---|
|
|
324
|
+
| **Q1 默认底图** | ✓ 天地图(需 key)/ 高德 / ArcGIS / 自定义 XYZ 或 WMS | `baseLayer` / `ImageryType` |
|
|
325
|
+
| **Q2 控件 profile** | ✓ 推荐 / 极简 / 完整 / 自定义(追加 AskUserQuestion)| 11 个控件开关(顶部 / 底部 / 信息栏 / FPS 等)|
|
|
326
|
+
| **Q3 部署方式** | ✓ 内网本地 SDK / 公网 CDN / 离线包 | `setBaseUrl` + 构建脚本拷贝策略 |
|
|
327
|
+
|
|
328
|
+
### 步骤 2:(可选)追加 AskUserQuestion
|
|
329
|
+
|
|
330
|
+
| 触发 | 追加问什么 |
|
|
331
|
+
|---|---|
|
|
332
|
+
| Q2 选「自定义」 | 11 个控件逐项开关(见下文 § Q2 自定义细分) |
|
|
333
|
+
| Q1 选「自定义 XYZ/WMS」 | 瓦片 URL / 域名 / 坐标系(`EPSG:4326` 或 `EPSG:3857`)|
|
|
334
|
+
| Q1 选了需要 key 的底图 | 天地图 / 高德 / Mapbox 的 key 值 |
|
|
335
|
+
|
|
336
|
+
### 步骤 3:(可选)默认视角
|
|
337
|
+
|
|
338
|
+
向用户索取初始中心点。接受 3 种格式:
|
|
339
|
+
- 名称:「北京天安门」「上海陆家嘴」(AI 查表转坐标)
|
|
340
|
+
- 坐标:「116.397,39.908,1000m」格式
|
|
341
|
+
- 自定义:「使用默认(Cesium 默认地球视图)」
|
|
342
|
+
|
|
343
|
+
### 步骤 4:输出项目骨架
|
|
344
|
+
|
|
345
|
+
**必须 Read [`templates/combo1-vue3-vite.md`](templates/combo1-vue3-vite.md)(或 § 模板与控件 profile 表里对应的组合文件)之后再写文件** —— 不要凭记忆拼装 `package.json` / 构建配置 / 入口文件 / 静态资源链接,模板里带了逐条避坑注释。
|
|
346
|
+
|
|
347
|
+
### 步骤 5:运行验证
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
cd <项目目录>
|
|
351
|
+
npm install # HTML+CDN 跳过
|
|
352
|
+
npm run dev # 启动 dev server
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
打开 `http://localhost:5173`(Vite 默认)/ `http://localhost:8080`(HTML 模板),看到三维地球 + 你选的控件 = 成功。遇报错调出 `anovgis-pitfalls`。
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
### 模板与控件 profile(按需读取)
|
|
360
|
+
|
|
361
|
+
生成骨架前**必须先 Read 对应的模板文件**,不要凭记忆拼装工程配置 —— 模板里带了逐条避坑注释:
|
|
362
|
+
|
|
363
|
+
| 场景 | 必须 Read 的文件 |
|
|
364
|
+
|---|---|
|
|
365
|
+
| **默认组合**(Vue 3 + Vite + 推荐控件 + 天地图 + 内网 SDK) | [`templates/combo1-vue3-vite.md`](templates/combo1-vue3-vite.md) |
|
|
366
|
+
| Vue 2 + Vue CLI | [`templates/combo2-vue2-cli.md`](templates/combo2-vue2-cli.md) |
|
|
367
|
+
| 纯 HTML + UMD CDN(仅 demo / 内网单文件调试) | [`templates/combo3-html-cdn.md`](templates/combo3-html-cdn.md) |
|
|
368
|
+
| Vanilla JS + webpack 5 | [`templates/combo4-vanilla-webpack.md`](templates/combo4-vanilla-webpack.md) |
|
|
369
|
+
| Q2 控件 profile 取值(极简 / 推荐 / 完整 / 自定义细分) | [`templates/wizard-profiles.md`](templates/wizard-profiles.md) |
|
|
370
|
+
| 选模板(项目现状判定 + 已有项目接入 NPM) | [`templates/README.md`](templates/README.md) |
|
|
371
|
+
### 反模式
|
|
372
|
+
|
|
373
|
+
- ❌ **在 `new Viewer` 之后才 `setBaseUrl`** → Cesium 静态资源 404(P3 陷阱)
|
|
374
|
+
- ❌ **HTML 模板双击 `index.html` 直接打开(`file://`)** → Workers / Assets 全部 404(P6 陷阱)
|
|
375
|
+
- ❌ **`viewer.destroy()` 不调** → WebGL 上下文泄漏(多 Viewer 场景尤其严重)
|
|
376
|
+
- ❌ **HTML 中不指定 `cesiumContainer` 高度** → 地球看不见(默认 0 高度)
|
|
377
|
+
- ❌ **生产环境用 unpkg CDN** → 团队项目一律本地 SDK(外网 403 + 性能)
|
|
378
|
+
- ❌ **webpack 5 没用 `IgnorePlugin`** → 报 `punycode` / `IPv6` / `SecondLevelDomains` 错(P4 陷阱)
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## 关联资源
|
|
383
|
+
|
|
384
|
+
- ANOV-GIS 源码:见 ANOV-GIS 仓库的 `src/` 目录(v1.8.6)
|
|
385
|
+
- ANOV-GIS demo:见 ANOV-GIS 仓库的 `examples/public/examples/html/` 目录(共 137 个 .html,**仅作 SDK 追溯来源,skill 已嵌入核心代码**)
|
|
386
|
+
- 关键词速查表:[`REFERENCE.md`](REFERENCE.md)(64 条,关键词 → 章节,每条带锚点)
|
|
387
|
+
- 场景路由表:[`DEMO-MAP.md`](DEMO-MAP.md)(58 条,业务场景 → skill)
|
|
388
|
+
- 工程骨架模板:[`templates/`](templates/README.md)(4 种组合 + 控件 profile)
|
|
389
|
+
- 完整 demo 路由矩阵:[`DEMO-SKILL-MAP.md`](./DEMO-SKILL-MAP.md)
|
|
390
|
+
- 权威归属与跨域路由:[`DOMAINS.md`](./DOMAINS.md)
|
|
391
|
+
- ANOV-GIS 仓库(内网 GitLab,需完整 SDK 源码 / demo 原文时 clone;地址见内网 README)
|
|
392
|
+
- 最小化示例:`anov-gis-demo-html` / `anov-gis-demo-vue2` / `anov-gis-demo-vue3`(在 ANOV-GIS 仓库 `other_system/` 目录)
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
> 本文件是 `skills/using-anovgis/SKILL.md` 的子文件 —— 模板总览(选模板 + 已有项目接入 NPM)。
|
|
2
|
+
> 由 using-anovgis 路由进入,不要被别的 skill 直接引用。
|
|
3
|
+
|
|
4
|
+
## 模板怎么选
|
|
5
|
+
|
|
6
|
+
> 下面给出 4 个**代表性组合**的完整代码。**默认走组合 1(Vue 3 + Vite)**;用户明确点名其它技术栈时才用组合 2/3/4。其余组合(Vue 3 + CDN / Vue 2 + CDN / Vanilla JS + CDN 等)只需替换「技术栈」段 + 「setBaseUrl」段,其余通用。
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
| 组合 | 技术栈 | 底图 / 控件 / 部署 | 文件 |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| **组合 1** ⭐ 默认 | Vue 3 + Vite 8 | 天地图 + 推荐控件 + 内网本地 SDK | [`combo1-vue3-vite.md`](combo1-vue3-vite.md) |
|
|
12
|
+
| 组合 2 | Vue 2 + Vue CLI | 天地图 + 推荐控件 + 内网本地 SDK | [`combo2-vue2-cli.md`](combo2-vue2-cli.md) |
|
|
13
|
+
| 组合 3 | 纯 HTML + UMD CDN | 天地图 + 极简 + 公网 CDN | [`combo3-html-cdn.md`](combo3-html-cdn.md) |
|
|
14
|
+
| 组合 4 | Vanilla JS + webpack 5 | ArcGIS + 完整控件 + 内网 | [`combo4-vanilla-webpack.md`](combo4-vanilla-webpack.md) |
|
|
15
|
+
|
|
16
|
+
## 项目现状探测
|
|
17
|
+
|
|
18
|
+
| 项目现状 | 推荐路径 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| `package.json` 含 `@anov/gis` 依赖(Vite / Webpack / Vue CLI / Next) | **走 NPM**(见下方「§ NPM 引入」) |
|
|
21
|
+
| `package.json` 无 `@anov/gis`,仅有 `index.html` + 静态目录 | **走 CDN**(见下方「§ CDN 引入」),仅 demo / 内部测试用 |
|
|
22
|
+
| 已用 `<script src="...">` CDN 引入,要迁移到 NPM | 先看 [`anovgis-imagery-terrain`](../../anovgis-imagery-terrain/SKILL.md) § 离线部署,再按 NPM 走 |
|
|
23
|
+
| 内网部署,无外网 CDN | 走 NPM + `vite-plugin-static-copy` 把 `node_modules/@anov/gis/dist/resources/` 拷到 `public/anov-gis-sdk/` |
|
|
24
|
+
|
|
25
|
+
> **首推 NPM**:90% 项目是 Vite/Vue/Webpack 工程,CDN 仅用于 demo 验证或内网单文件调试。
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## 已有项目接入(NPM)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install @anov/gis
|
|
32
|
+
# 或 yarn add @anov/gis / pnpm add @anov/gis
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
// 入口文件(main.js / main.ts / app.ts)
|
|
37
|
+
import '@anov/gis/dist/index.css'
|
|
38
|
+
import ANOVGIS from '@anov/gis'
|
|
39
|
+
|
|
40
|
+
// ⚠️ 必须在 new Viewer 之前调用
|
|
41
|
+
ANOVGIS.setBaseUrl('/anov-gis-sdk/resources/')
|
|
42
|
+
|
|
43
|
+
// devtools 调试用,业务代码用 import 进来的局部变量
|
|
44
|
+
window.ANOVGIS = ANOVGIS
|
|
45
|
+
|
|
46
|
+
const viewer = new ANOVGIS.Viewer('cesiumContainer', {
|
|
47
|
+
geocoderType: ANOVGIS.GeocoderType.TIANDITU,
|
|
48
|
+
// ⚠️ 不要传 baseLayer(v0.2.10 实测 v1.8.6 枚举是字符串,会报 _layerIndex on string 错)——底图构造后 addImageryProvider
|
|
49
|
+
})
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Vite + 已有项目骨架**(含静态资源拷贝):
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
// vite.config.ts
|
|
56
|
+
import { defineConfig } from 'vite'
|
|
57
|
+
import vue from '@vitejs/plugin-vue'
|
|
58
|
+
import { viteStaticCopy } from 'vite-plugin-static-copy'
|
|
59
|
+
|
|
60
|
+
export default defineConfig({
|
|
61
|
+
plugins: [
|
|
62
|
+
vue(),
|
|
63
|
+
viteStaticCopy({
|
|
64
|
+
targets: [{
|
|
65
|
+
src: 'node_modules/@anov/gis/dist/resources/**/*',
|
|
66
|
+
dest: 'anov-gis-sdk',
|
|
67
|
+
rename: { stripBase: 5 }, // 去掉 resources/ 前缀
|
|
68
|
+
}],
|
|
69
|
+
}),
|
|
70
|
+
],
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```vue
|
|
75
|
+
<!-- src/App.vue(Vue 3 Composition API) -->
|
|
76
|
+
<script setup>
|
|
77
|
+
import { onMounted, onBeforeUnmount } from 'vue'
|
|
78
|
+
import ANOVGIS from '@anov/gis'
|
|
79
|
+
|
|
80
|
+
let viewer = null // 模块级 let,绝不放 ref()/reactive()
|
|
81
|
+
|
|
82
|
+
onMounted(() => {
|
|
83
|
+
const Cesium = window.Cesium // 唯一推荐写法(@anov/gis 已封装 Cesium)
|
|
84
|
+
viewer = new ANOVGIS.Viewer('cesiumContainer', {
|
|
85
|
+
baseLayerPicker: false,
|
|
86
|
+
infoBox: false,
|
|
87
|
+
selectionIndicator: false,
|
|
88
|
+
geocoder: false,
|
|
89
|
+
animation: false,
|
|
90
|
+
timeline: false,
|
|
91
|
+
contextOptions: { id: 'cesiumCanvas' },
|
|
92
|
+
})
|
|
93
|
+
viewer.scene.globe.enableLighting = false
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
onBeforeUnmount(() => {
|
|
97
|
+
viewer?.destroy()
|
|
98
|
+
viewer = null
|
|
99
|
+
})
|
|
100
|
+
</script>
|
|
101
|
+
|
|
102
|
+
<template>
|
|
103
|
+
<div id="cesiumContainer" style="width:100vw;height:100vh"></div>
|
|
104
|
+
</template>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
// src/globalConfig.ts
|
|
109
|
+
// ANOV-GIS 官方 demo 公开测试 key(与 SDK examples/src/mixins/mixin.js 一致)
|
|
110
|
+
// 正式部署请替换为团队在 https://console.tianditu.gov.cn 申请的 key
|
|
111
|
+
export const globalConfig = {
|
|
112
|
+
tdtKey: 'b832b9764939cbb0919148c548b669ba',
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
// src/main.ts
|
|
118
|
+
import { createApp } from 'vue'
|
|
119
|
+
import App from './App.vue'
|
|
120
|
+
import '@anov/gis/dist/index.css'
|
|
121
|
+
import ANOVGIS from '@anov/gis'
|
|
122
|
+
import { globalConfig } from './globalConfig'
|
|
123
|
+
|
|
124
|
+
ANOVGIS.setBaseUrl(import.meta.env.BASE_URL + 'anov-gis-sdk/')
|
|
125
|
+
window.ANOVGIS = ANOVGIS // devtools 调试用,业务代码用局部变量
|
|
126
|
+
|
|
127
|
+
createApp(App).mount('#app')
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
## 最小 Viewer(不想读整份模板时的最小骨架)
|
|
132
|
+
|
|
133
|
+
## 最小 Viewer
|
|
134
|
+
|
|
135
|
+
> ⚠️ **v0.2.10:Viewer 构造时不要传 `baseLayer`**。`ANOVGIS.ImageryType.*` 枚举本质是字符串(如 `ImageryType.TDT` === `'tdt'`),SDK v1.8.6 内部会把它当已建好的图层对象用,触发 `TypeError: Cannot create property '_layerIndex' on string 'tdt'`(playwright 实测)。
|
|
136
|
+
> 官方 `anov-gis-demo-vue3-main` 模板根本不传 baseLayer。底图改用构造后 `addImageryProvider` 模式(见下方「§ NPM 引入 → Vite + Vue 3 骨架」),更清晰且支持自定义 key。
|
|
137
|
+
|
|
138
|
+
```js
|
|
139
|
+
new ANOVGIS.Viewer('cesiumContainer', {
|
|
140
|
+
contextOptions: { // 截图 / WebGL 错误
|
|
141
|
+
id: 'cesiumCanvas', // 必须
|
|
142
|
+
webgl: { preserveDrawingBuffer: true },
|
|
143
|
+
showRenderLoopErrors: false,
|
|
144
|
+
},
|
|
145
|
+
geocoderType: ANOVGIS.GeocoderType.TIANDITU,
|
|
146
|
+
// ⚠️ 不要传 baseLayer(v0.2.10 实测 v1.8.6 会报 _layerIndex on string 错)——底图构造后 addImageryProvider
|
|
147
|
+
baseLayerPicker: true, fullscreenButton: true, homeButton: true,
|
|
148
|
+
sceneModePicker: true, navigationHelpButton: true,
|
|
149
|
+
copyRight: false, showMapInfo: true,
|
|
150
|
+
showFPS: false, drillPick: false,
|
|
151
|
+
defaultView: [lon, lat, lon, lat], // 四元数组框选初始视图
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|