@anov/gis-skills-cli 0.0.0-stage → 0.3.3
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 +637 -0
- package/INSTALL.md +481 -0
- package/LICENSE +15 -0
- package/README.md +148 -2
- package/RELEASING.md +162 -0
- package/bin/anov-gis-skills.mjs +470 -0
- package/lib/mcp-config.mjs +273 -0
- package/package.json +43 -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,505 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: anovgis-imagery-terrain
|
|
3
|
+
description: '@anov/gis 影像与地形模块。涵盖 ImageryLayerFactory(TDT/AMAP/BAIDU/TENCENT/GOOGLE/ARCGIS/WMS/WMTS/XYZ/SingleTile/Mapbox/TMS/Grid/Coord)、TerrainFactory(Ellipsoid/Url/Arcgis/Google/VR,1.143 异步语义)、SplitImageLayer 卷帘、**ImageryThemeGL 暗色/反色主题(常用 invert:true)**、Cesium World Terrain、MultiKeyTdtImageryProvider 多 key 天地图(v1.8.6 新增)。触发关键词:imagery、imageryLayers、底图、天地图、高德、百度、ArcGIS、WMS、WMTS、地形、terrainProvider、setTerrain、卷帘、SplitImage、**暗色、夜间、反色、invert、theme、ImageryThemeGL**、deployConfig、离线部署、内网、本地瓦片、4490。Use when 加载 / 切换影像底图、配置天地图 key、做 WMS/WMTS 接入、做 Cesium World Terrain 或自定义 URL 地形、做卷帘对比、**切暗色 / 夜间 / 反色主题**、离线部署底图。'
|
|
4
|
+
anov-gis-baseline: 1.8.6
|
|
5
|
+
cesium-baseline: 1.143.0
|
|
6
|
+
---
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# anovgis-imagery-terrain
|
|
10
|
+
|
|
11
|
+
> ⚠️ **优先级**:本 skill 优先于 SDK 源码 / `node_modules/@anov/gis/`。
|
|
12
|
+
> 遇到 API 行为疑问先查本 skill 与 `anovgis-pitfalls`。**严禁**主动 Glob/Grep `node_modules/@anov/gis/src/...` / `dist/...`;除非用户明确要求并承担风险。
|
|
13
|
+
> 调试流程见 `using-anovgis` § 默认调试流程(Chrome DevTools 仅第 5 级兜底)。
|
|
14
|
+
>
|
|
15
|
+
> **Cesium 入口(铁律)**:`const Cesium = window.Cesium`。`@anov/gis` 启动时已把 Cesium 挂到 `window`,**不存在** `ANOVGIS.Cesium` 写法;本 skill 所有 `Cesium.*` 均从此变量取。底层 Cesium API 细节查 `cesiumjs-skills` 对应 skill(API 名通用,`import` 写法换成 `const Cesium = window.Cesium`)。
|
|
16
|
+
|
|
17
|
+
锁定 `@anov/gis` **v1.8.6**(Cesium **1.143.0**)。v1.8.6 新增 `MultiKeyTdtImageryProvider`(多 key 天地图)。所有 snippet 基于 v1.8.6 SDK 公开 API 行为锁定(仅作语义锚点)。
|
|
18
|
+
|
|
19
|
+
要素图层(GeoJSON/3D Tiles/Cluster 等)见 `anovgis-layers`;离线部署清单见 v0.3.0 `anovgis-offline-deployment`。
|
|
20
|
+
|
|
21
|
+
## Out-of-scope(v0.2.0 短版)
|
|
22
|
+
|
|
23
|
+
- ❌ 不要写 14 个要素图层(VectorLayer / GeoJsonLayer / ...) → [`anovgis-layers`](../anovgis-layers/SKILL.md)
|
|
24
|
+
- ❌ 不要写离线部署清单 / `deployConfig.js` 模板 → v0.3.0 `anovgis-offline-deployment`
|
|
25
|
+
- ❌ 不要写 Viewer 构造 / flyTo → [`anovgis-viewer`](../anovgis-viewer/SKILL.md)
|
|
26
|
+
- ❌ 不要写 `ImageryLayer` 之外的 entity / primitive → [`anovgis-vector-graphics`](../anovgis-vector-graphics/SKILL.md) / [`anovgis-primitives`](../anovgis-primitives/SKILL.md)
|
|
27
|
+
- ❌ 不要写特效 → [`anovgis-effects`](../anovgis-effects/SKILL.md)
|
|
28
|
+
|
|
29
|
+
<a id="factory"></a>
|
|
30
|
+
## 1. ImageryLayerFactory
|
|
31
|
+
|
|
32
|
+
类路径 `src/layer/imagery/ImageryLayerFactory.js`。`createXxxImageryLayer(options)` 同步返回 `Cesium.ImageryProvider`(非 Promise),需 `viewer.imageryLayers.addImageryProvider(provider)` 接入。
|
|
33
|
+
|
|
34
|
+
| 方法 | 用途 | 关键 options |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `createTdtImageryLayer(opts)` | 天地图影像/注记/地形 | `style: 'img'\|'cva'\|'ter'`, `key` |
|
|
37
|
+
| `createAmapImageryLayer(opts)` | 高德影像/注记/电子 | `style: 'img'\|'cva'`, `crs: 'WGS84'` |
|
|
38
|
+
| `createBaiduImageryLayer(opts)` | 百度电子/卫星/路况 | `crs: 'WGS84'`, `style: 'traffic'` |
|
|
39
|
+
| `createTencentImageryLayer(opts)` | 腾讯影像 | `style: '1'\|'2'` |
|
|
40
|
+
| `createGoogleImageryImageryLayer(opts)` | 谷歌影像(自实现) | — |
|
|
41
|
+
| `createArcGisImageryLayer(opts)` | ArcGIS 影像 | `style: 'dark'` 暗色 |
|
|
42
|
+
| `createSingleTileImageryLayer(opts)` | 单张图片 | `url`, `rectangle` |
|
|
43
|
+
| `createWMSImageryLayer(opts)` | WMS | `url`, `layers`, `parameters` |
|
|
44
|
+
| `createWMTSImageryLayer(opts)` | WMTS | `url`, `layer`, `tileMatrixSetID` |
|
|
45
|
+
| `createXYZImageryLayer(opts)` | XYZ 瓦片 | `url` 模板 |
|
|
46
|
+
| `createUrlTemplateImageryLayer(opts)` | XYZ 别名 | 同上 |
|
|
47
|
+
| `createTMSImageryLayer(opts)` | TMS 服务 | `url` |
|
|
48
|
+
| `createMapboxImageryLayer(opts)` | Mapbox | `mapId`, `accessToken` |
|
|
49
|
+
| `createGridImageryLayer()` | 调试格网 | `color`, `cells` |
|
|
50
|
+
| `createCoordImageryLayer()` | 调试瓦片坐标 | — |
|
|
51
|
+
| `createImageryLayer(type, opts)` | 通用入口(自动绑 Popup/Highlight) | 按 `ImageryType` 分发 |
|
|
52
|
+
|
|
53
|
+
`ImageryType` 枚举(`src/layer/imagery/ImageryType.js`):`TDT / AMAP / BAIDU / TENCENT / Google / ARCGIS / SINGLE_TILE / WMS / WMTS / XYZ / COORD / GRID / TMS / MAPBOX / MAPBOX_STYLE`。
|
|
54
|
+
|
|
55
|
+
## 2. TerrainFactory
|
|
56
|
+
|
|
57
|
+
类路径 `src/layer/terrain/TerrainFactory.js`。**Cesium 1.143 异步语义**:`XYZ` / `ARCGIS` 返回 `Promise<TerrainProvider>`,必须 `await`;`NONE / GOOGLE / VR` 同步返回 `EllipsoidTerrainProvider`(GOOGLE/VR 已移除官方支持,降级 + warn)。
|
|
58
|
+
|
|
59
|
+
| 方法 | 是否 Promise | 说明 |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `createEllipsoidTerrain(opts)` | 否 | 椭球面无高程 |
|
|
62
|
+
| `createUrlTerrain(opts)` | **是** | `Cesium.CesiumTerrainProvider.fromUrl(url, opts)` |
|
|
63
|
+
| `createArcgisTerrain(opts)` | **是** | `ArcGISTiledElevationTerrainProvider.fromUrl(url, opts)` |
|
|
64
|
+
| `createGoogleTerrain(opts)` | 否 | 1.117+ 已移除 `GoogleEarthEnterpriseTerrainProvider` |
|
|
65
|
+
| `createVRTerrain(opts)` | 否 | 1.117+ 已移除 `VRTheWorldTerrainProvider` |
|
|
66
|
+
| `createTerrain(type, opts)` | 类型决定 | 按 `TerrainType` 分发 |
|
|
67
|
+
|
|
68
|
+
`TerrainType`(`src/layer/terrain/TerrainType.js`):`NONE / XYZ / ARCGIS / GOOGLE / VR`。
|
|
69
|
+
|
|
70
|
+
**Cesium World Terrain(1.143 推荐写法)**:
|
|
71
|
+
```js
|
|
72
|
+
viewer.scene.setTerrain(Cesium.Terrain.fromWorldTerrain());
|
|
73
|
+
```
|
|
74
|
+
旧式 `viewer.terrainProvider = new Cesium.CesiumTerrainProvider({...})` 在 1.143 已无效。
|
|
75
|
+
|
|
76
|
+
## 3. Snippets
|
|
77
|
+
|
|
78
|
+
<a id="s1"></a>
|
|
79
|
+
### S1. 天地图影像 + 注记 — `examples/public/examples/html/basemap/tdtSatelliteImage.html` L78-L105
|
|
80
|
+
```js
|
|
81
|
+
viewer.imageryLayers.addImageryProvider(
|
|
82
|
+
ANOVGIS.ImageryLayerFactory.createImageryLayer(ANOVGIS.ImageryType.TDT, {
|
|
83
|
+
style: 'img', key: globalConfig.tdtKey }));
|
|
84
|
+
viewer.imageryLayers.addImageryProvider(
|
|
85
|
+
ANOVGIS.ImageryLayerFactory.createImageryLayer(ANOVGIS.ImageryType.TDT, {
|
|
86
|
+
style: 'cva', key: globalConfig.tdtKey }));
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<a id="s2"></a>
|
|
90
|
+
### S2. 高德影像 — `examples/public/examples/html/basemap/geodeSatelliteImage.html` L70-L90
|
|
91
|
+
```js
|
|
92
|
+
viewer.imageryLayers.addImageryProvider(
|
|
93
|
+
ANOVGIS.ImageryLayerFactory.createAmapImageryLayer({ style: 'img', crs: 'WGS84' }));
|
|
94
|
+
viewer.imageryLayers.addImageryProvider(
|
|
95
|
+
ANOVGIS.ImageryLayerFactory.createAmapImageryLayer({ style: 'cva', crs: 'WGS84' }));
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
<a id="s3"></a>
|
|
99
|
+
### S3. Cesium World Terrain — `examples/public/examples/html/basemap/CesiumTerrain.html` L53-L55
|
|
100
|
+
```js
|
|
101
|
+
viewer.scene.setTerrain(Cesium.Terrain.fromWorldTerrain());
|
|
102
|
+
viewer.flyToPosition('115.3950, 39.9058, 18500,0,-9', 3);
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
<a id="s4"></a>
|
|
106
|
+
### S4. ArcGIS 地形 — `examples/public/examples/html/basemap/ArcGISTerrain.html` L51-L56
|
|
107
|
+
```js
|
|
108
|
+
const provider = await Cesium.ArcGISTiledElevationTerrainProvider.fromUrl(
|
|
109
|
+
'https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer');
|
|
110
|
+
viewer.terrainProvider = provider;
|
|
111
|
+
viewer.flyToPosition('115.3950, 39.9058, 18500,0,-9', 3);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### S7. WMS — `examples/public/examples/html/offlinemap/geoServerWms.html` L46-L88
|
|
115
|
+
```js
|
|
116
|
+
const wms = ANOVGIS.ImageryLayerFactory.createImageryLayer(ANOVGIS.ImageryType.WMS, {
|
|
117
|
+
url: 'http://server.mars3d.cn/geoserver/mars/wms',
|
|
118
|
+
layers: 'mars:hf',
|
|
119
|
+
parameters: { transparent: true, format: 'image/png' },
|
|
120
|
+
rectangle: Cesium.Rectangle.fromDegrees(116.85, 31.53, 117.63, 32.16),
|
|
121
|
+
getFeatureInfoParameters: { feature_count: 10 },
|
|
122
|
+
selectedHighlight: { material: 'rgba(255,255,0,0.6)', height: 0.01 }
|
|
123
|
+
});
|
|
124
|
+
wms.bindPopup({ viewer, showTitle: true, useDefaultHtmlTemplate: true });
|
|
125
|
+
wms.addEventListener(ANOVGIS.MouseEventType.CLICK, (e) => {
|
|
126
|
+
wms.popup.show(e.position, { title: 'wms', fieldsMap: [{
|
|
127
|
+
nameC: '名称', value: e.feature.data.properties['用地名称'] || '未知' }] });
|
|
128
|
+
});
|
|
129
|
+
viewer.imageryLayers.addImageryProvider(wms);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### S8. WMTS — `examples/public/examples/html/offlinemap/geoServerWmts.html` L40-L69
|
|
133
|
+
```js
|
|
134
|
+
const provider = new Cesium.WebMapTileServiceImageryProvider({
|
|
135
|
+
url: 'http://server.mars3d.cn/geoserver/gwc/service/wmts/rest/mars:hfgh/polygon/EPSG:4326/{TileMatrix}/{TileRow}/{TileCol}?format=image/png',
|
|
136
|
+
layer: 'mars:hfgh', style: 'polygon', tileMatrixSetID: 'EPSG:4326',
|
|
137
|
+
tilingScheme: new Cesium.GeographicTilingScheme(),
|
|
138
|
+
tileMatrixLabels: Array.from({ length: 22 }, (_, i) => `EPSG:4326:${i}`),
|
|
139
|
+
minimumLevel: 0, maximumLevel: 21,
|
|
140
|
+
rectangle: Cesium.Rectangle.fromDegrees(116.85, 31.53, 117.63, 32.16),
|
|
141
|
+
format: 'image/png', credit: new Cesium.Credit('合肥规划图') });
|
|
142
|
+
viewer.imageryLayers.addImageryProvider(provider);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
<a id="s9"></a>
|
|
146
|
+
### S9. 卷帘对比 — `src/layer/imagery/SplitImageLayer.js` L8-L86
|
|
147
|
+
```js
|
|
148
|
+
const left = ANOVGIS.ImageryLayerFactory.createArcGisImageryLayer();
|
|
149
|
+
const right = ANOVGIS.ImageryLayerFactory.createTdtImageryLayer({ style: 'img', key: globalConfig.tdtKey });
|
|
150
|
+
const split = new ANOVGIS.SplitImageLayer(viewer, [left, right]);
|
|
151
|
+
split.changeLeftRight();
|
|
152
|
+
// split.destroy(); // 移除 slider 与 handler
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
<a id="s10"></a>
|
|
156
|
+
### S10. 暗色主题 — `examples/public/examples/html/basemap/maptheme.html` L61-L78
|
|
157
|
+
|
|
158
|
+
> ⚠️ **常见误区**:暗色 / 夜间 / 反色**不能**用 `layer.brightness = -1` / `layer.saturation = 0` 这种野路子——这是对图层属性的瞎调,不是 SDK 设计的暗色方案。SDK 专门有 `ImageryThemeGL` 做这件事。
|
|
159
|
+
|
|
160
|
+
```js
|
|
161
|
+
// 来源: examples/public/examples/html/basemap/maptheme.html L61-L78
|
|
162
|
+
// 关键参数:invert=true(反色)+ bgColor=BLACK(背景)+ alpha(前景透明度)
|
|
163
|
+
const theme = new ANOVGIS.ImageryThemeGL();
|
|
164
|
+
theme.setTheme({
|
|
165
|
+
layer: viewer.imageryLayers.get(0),
|
|
166
|
+
bgColor: Cesium.Color.BLACK, alpha: 0.1,
|
|
167
|
+
invert: true, preMultiplyAlpha: true });
|
|
168
|
+
// ⚠️ 改参必须 layer.show=false → setTheme → setTimeout(show=true, 100) 刷新
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**setTheme 全部参数**:
|
|
172
|
+
|
|
173
|
+
| 参数 | 含义 | 暗色系推荐 |
|
|
174
|
+
|---|---|---|
|
|
175
|
+
| `layer` | 目标 ImageryLayer | 第 0 层(底图) |
|
|
176
|
+
| `invert` | 颜色反转(关键,反色成暗) | `true` |
|
|
177
|
+
| `bgColor` | 背景色填充 | `Cesium.Color.BLACK` |
|
|
178
|
+
| `alpha` | 前景透明度 0-1 | `0.1`(0=完全隐藏底图,1=原色) |
|
|
179
|
+
| `preMultiplyAlpha` | 预乘 Alpha | `true` |
|
|
180
|
+
|
|
181
|
+
## 4. 实战最佳实践
|
|
182
|
+
|
|
183
|
+
1. **`createImageryLayer(type, opts)` 优先**:自动绑 Popup/Highlight;WMS/WMTS 走此路省事。
|
|
184
|
+
2. **地形 1.143 必须 `await`**:`fromUrl` 是 Promise;`setTerrain` 是正确现代写法;不要用 `viewer.terrainProvider = new ArcGISTiledElevationTerrainProvider(...)`。
|
|
185
|
+
|
|
186
|
+
## 5. 补充用法(snippet 续)
|
|
187
|
+
|
|
188
|
+
<a id="s11"></a>
|
|
189
|
+
### S11. WMS 接入 — `examples/public/examples/html/offlinemap/geoServerWms.html` L46-L64
|
|
190
|
+
```js
|
|
191
|
+
// 方式 A:通用入口(推荐,自动绑 Popup/Highlight)
|
|
192
|
+
const wms = ANOVGIS.ImageryLayerFactory.createImageryLayer(ANOVGIS.ImageryType.WMS, {
|
|
193
|
+
url: 'http://server.mars3d.cn/geoserver/mars/wms',
|
|
194
|
+
layers: 'mars:hf',
|
|
195
|
+
parameters: { transparent: true, format: 'image/png' },
|
|
196
|
+
rectangle: Cesium.Rectangle.fromDegrees(116.85, 31.53, 117.63, 32.16)
|
|
197
|
+
});
|
|
198
|
+
viewer.imageryLayers.addImageryProvider(wms);
|
|
199
|
+
// 方式 B:直接拿 Provider(不绑 Popup)
|
|
200
|
+
const provider = ANOVGIS.ImageryLayerFactory.createWMSImageryLayer({
|
|
201
|
+
url, layers, parameters, rectangle,
|
|
202
|
+
getFeatureInfoParameters: { feature_count: 10 } });
|
|
203
|
+
viewer.imageryLayers.addImageryProvider(provider);
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
<a id="s12"></a>
|
|
207
|
+
### S12. WMTS 接入(tileMatrixLabels + style)— `examples/public/examples/html/offlinemap/geoServerWmts.html` L40-L67
|
|
208
|
+
```js
|
|
209
|
+
const wmts = ANOVGIS.ImageryLayerFactory.createWMTSImageryLayer({
|
|
210
|
+
url: 'http://server.mars3d.cn/geoserver/gwc/service/wmts/rest/mars:hfgh/polygon/EPSG:4326/{TileMatrix}/{TileRow}/{TileCol}?format=image/png',
|
|
211
|
+
layer: 'mars:hfgh',
|
|
212
|
+
style: 'polygon',
|
|
213
|
+
tileMatrixSetID: 'EPSG:4326',
|
|
214
|
+
tilingScheme: new Cesium.GeographicTilingScheme(),
|
|
215
|
+
// 关键:tileMatrixLabels 必须匹配服务的命名格式 "EPSG:4326:{z}"
|
|
216
|
+
tileMatrixLabels: Array.from({ length: 22 }, (_, i) => `EPSG:4326:${i}`),
|
|
217
|
+
minimumLevel: 0, maximumLevel: 21,
|
|
218
|
+
rectangle: Cesium.Rectangle.fromDegrees(116.85, 31.53, 117.63, 32.16),
|
|
219
|
+
format: 'image/png',
|
|
220
|
+
credit: new Cesium.Credit('合肥规划图')
|
|
221
|
+
});
|
|
222
|
+
viewer.imageryLayers.addImageryProvider(wmts);
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
<a id="s13"></a>
|
|
226
|
+
### S13. XYZ 切片(含 subdomains 多子域)— `examples/public/examples/html/offlinemap/xyz.html` L54-L57
|
|
227
|
+
```js
|
|
228
|
+
// 方式 A:本地瓦片
|
|
229
|
+
const xyz = ANOVGIS.ImageryLayerFactory.createXYZImageryLayer({
|
|
230
|
+
url: 'http://192.168.11.164:9000/anov-gis/geo3dstatic/imagery/tiles/{z}/{x}/{y}.png',
|
|
231
|
+
rectangle: Cesium.Rectangle.fromDegrees(116.38, 39.98, 117.39, 40.99)
|
|
232
|
+
});
|
|
233
|
+
// 方式 B:多子域({s} 占位 + subdomains)— SDK 透传给 Cesium.UrlTemplateImageryProvider
|
|
234
|
+
const provider = ANOVGIS.ImageryLayerFactory.createUrlTemplateImageryLayer({
|
|
235
|
+
url: 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
|
|
236
|
+
subdomains: ['a', 'b', 'c', 'd'],
|
|
237
|
+
credit: 'CartoDB / OSM'
|
|
238
|
+
});
|
|
239
|
+
viewer.imageryLayers.addImageryProvider(xyz);
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
<a id="s14"></a>
|
|
243
|
+
### S14. SingleTileImageryLayer 单张图片覆盖 — `examples/public/examples/html/offlinemap/image.html` L57-L62
|
|
244
|
+
```js
|
|
245
|
+
// 截图 / 离线静态图,按 rectangle 贴到地表
|
|
246
|
+
const imglayer = ANOVGIS.ImageryLayerFactory.createSingleTileImageryLayer({
|
|
247
|
+
rectangle: Cesium.Rectangle.fromDegrees(116.3809, 39.9868, 116.3949, 39.9965),
|
|
248
|
+
url: 'http://192.168.11.164:9000/anov-gis/geo3dstatic/static/trees/tree.png'
|
|
249
|
+
});
|
|
250
|
+
const img = viewer.imageryLayers.addImageryProvider(imglayer);
|
|
251
|
+
viewer.flyTo(img, 2, 0, -90, 4945000);
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### S15. 影像 Provider 切换(增删 / 顺序 / alpha)— 通用 Cesium API
|
|
255
|
+
```js
|
|
256
|
+
// 增:addImageryProvider 返回 SDK 包装的 ImageryLayer 实例
|
|
257
|
+
const base = viewer.imageryLayers.addImageryProvider(
|
|
258
|
+
ANOVGIS.ImageryLayerFactory.createTdtImageryLayer({ style: 'img', key: globalConfig.tdtKey }));
|
|
259
|
+
const label = viewer.imageryLayers.addImageryProvider(
|
|
260
|
+
ANOVGIS.ImageryLayerFactory.createTdtImageryLayer({ style: 'cva', key: globalConfig.tdtKey }));
|
|
261
|
+
// 顺序:底层 0,向上叠加;通过 viewer.imageryLayers 操作(SDK 包装对象本身没有 raiseToTop)
|
|
262
|
+
viewer.imageryLayers.raiseToTop(label); // ✅ 正确:透传到底层 Cesium 对象
|
|
263
|
+
// ❌ label.raiseToTop() 会报 TypeError: label.raiseToTop is not a function
|
|
264
|
+
// 透明度(常用属性 SDK 已包装透出)
|
|
265
|
+
label.alpha = 0.6;
|
|
266
|
+
// 显隐
|
|
267
|
+
label.show = false;
|
|
268
|
+
// 删
|
|
269
|
+
viewer.imageryLayers.remove(base);
|
|
270
|
+
// 清空(慎用)
|
|
271
|
+
// viewer.imageryLayers.removeAll();
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
> ⚠️ SDK 包装的 ImageryLayer 不透出 `Cesium.ImageryLayer` 的所有方法(仅透出常用属性 `show` / `alpha` / `brightness` / `contrast` / `hue` / `saturation` / `gamma` / `splitDirection`)。其他方法必须通过 `viewer.imageryLayers.*` 调用。详见 [`anovgis-pitfalls` § P8](../anovgis-pitfalls/SKILL.md#p8-sdk-包装的-imagerylayer-不透出-cesium-原生方法)。
|
|
275
|
+
|
|
276
|
+
### S16. TerrainProvider 异步 + setTerrain(模式 A 世界地形 / 模式 B 自定义 URL)— `examples/public/examples/html/basemap/CesiumTerrain.html` L53-L55、`offlinemap/terrain.html` L49-L54
|
|
277
|
+
```js
|
|
278
|
+
// 模式 A:Cesium World Terrain(推荐写法,1.143)
|
|
279
|
+
viewer.scene.setTerrain(Cesium.Terrain.fromWorldTerrain());
|
|
280
|
+
// 模式 B:自定义 URL(必须 await,fromUrl 返回 Promise)
|
|
281
|
+
Cesium.CesiumTerrainProvider.fromUrl(
|
|
282
|
+
'http://192.168.11.164:9000/anov-gis/geo3dstatic/terrain/beijing_cesium2',
|
|
283
|
+
{ requestVertexNormals: true }
|
|
284
|
+
).then(provider => {
|
|
285
|
+
viewer.scene.setTerrain(new Cesium.Terrain(provider));
|
|
286
|
+
});
|
|
287
|
+
// 模式 B 走 ANOVGIS 工厂(同样返回 Promise)
|
|
288
|
+
const provider = await ANOVGIS.TerrainFactory.createUrlTerrain({
|
|
289
|
+
url: 'http://host/terrain', requestVertexNormals: true
|
|
290
|
+
});
|
|
291
|
+
viewer.scene.setTerrain(new Cesium.Terrain(provider));
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### S17. Viewer 地形渲染参数(深度测试 / 夸大地形)— Cesium 官方文档
|
|
295
|
+
```js
|
|
296
|
+
// 启用基于地形深度的测试(默认开启):地形遮挡更准确,性能略降
|
|
297
|
+
viewer.scene.globe.depthTestAgainstTerrain = true;
|
|
298
|
+
// 关闭(默认):entity/label 始终绘制在最上层,不被地形遮挡
|
|
299
|
+
// viewer.scene.globe.depthTestAgainstTerrain = false;
|
|
300
|
+
// 夸大地形倍数:拉大山体视觉效果(>=1.0)
|
|
301
|
+
viewer.scene.verticalExaggeration = 2.0; // 1.143+
|
|
302
|
+
viewer.scene.verticalExaggerationRelativeHeight = 0.0;
|
|
303
|
+
// 参考 Cesium 文档:https://cesium.com/learn/cesiumjs/ref-doc/Globe.html
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### S18. 矢量瓦片(实为 XYZ raster) — `basemap/vectorTile.html` L25-L40
|
|
307
|
+
|
|
308
|
+
```js
|
|
309
|
+
// 来源: vectorTile.html L29-39
|
|
310
|
+
// 题图虽叫 vectorTile,实际是 raster XYZ 切片加载 + LocateUtil.flyToPoint 定位
|
|
311
|
+
window.viewer = new ANOVGIS.Viewer('cesiumContainer');
|
|
312
|
+
const layer = new ANOVGIS.ImageryLayerFactory.createXYZImageryLayer({
|
|
313
|
+
url: 'http://your-server/tile/{z}/{x}/{y}', // 自定义瓦片服务
|
|
314
|
+
});
|
|
315
|
+
viewer.imageryLayers.addImageryProvider(layer);
|
|
316
|
+
// LocateUtil.flyToPoint(viewer, center, heading, pitch, range, duration)
|
|
317
|
+
const center = Cesium.Cartesian3.fromDegrees(116.5, 40, 0);
|
|
318
|
+
ANOVGIS.LocateUtil.flyToPoint(viewer, center, 0, -70, 5000000, 2);
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### S19. 滤镜着色 + 抬高图层 — `basemap/test.html` L22-L137
|
|
322
|
+
|
|
323
|
+
```js
|
|
324
|
+
// 来源: test.html L39-136
|
|
325
|
+
// 自定义 fragment shader 注入 czm_saturation 之后,实现反相/滤镜/对比度调整
|
|
326
|
+
// ⚠️ 此 demo 用 Cesium 原生 UrlTemplateImageryProvider(因 SDK 没包装滤镜功能)
|
|
327
|
+
viewer.imageryLayers.removeAll();
|
|
328
|
+
viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({
|
|
329
|
+
url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=2&style=8&x={x}&y={y}&z={z}',
|
|
330
|
+
maximumLevel: 18,
|
|
331
|
+
}));
|
|
332
|
+
setViewerTheme(viewer, {
|
|
333
|
+
invertColor: false, // 反相
|
|
334
|
+
filterColor: Cesium.Color.fromCssColorString('#4e70a6'),// 滤镜色
|
|
335
|
+
brightness: 0.6, contrast: 1.8, gamma: 0.3,
|
|
336
|
+
hue: 1, saturation: 0,
|
|
337
|
+
});
|
|
338
|
+
// 叠加 SDK 的 XYZ 切片
|
|
339
|
+
const layer = new ANOVGIS.ImageryLayerFactory.createXYZImageryLayer({
|
|
340
|
+
url: '/tiles/{z}/{x}/{y}.png',
|
|
341
|
+
});
|
|
342
|
+
viewer.imageryLayers.addImageryProvider(layer);
|
|
343
|
+
// 抬高(不置顶,仅 raise)
|
|
344
|
+
viewer.imageryLayers.raise(layer);
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### S20. 跨实例通信(父端 iframe 控子端 viewer) — `basemap/remote.html` L31-L101
|
|
348
|
+
|
|
349
|
+
```js
|
|
350
|
+
// 来源: remote.html L41-99
|
|
351
|
+
// 关键 API: ANOVGIS.createInstance() + sendMessage / receiveMessage
|
|
352
|
+
// 用于父页面统一控制子 iframe / webview 中的 viewer
|
|
353
|
+
window.instance = ANOVGIS.createInstance();
|
|
354
|
+
top.instance = window.instance;
|
|
355
|
+
|
|
356
|
+
// 远端初始化 viewer
|
|
357
|
+
instance.sendMessage({
|
|
358
|
+
name: 'ANOVGIS.init',
|
|
359
|
+
id: '1',
|
|
360
|
+
params: {
|
|
361
|
+
container: 'cesiumContainer',
|
|
362
|
+
geocoderType: ANOVGIS.GeocoderType.TIANDITU,
|
|
363
|
+
vrButton: false, baseLayerPicker: true, fullscreenButton: true,
|
|
364
|
+
homeButton: true, sceneModePicker: true, navigationHelpButton: true,
|
|
365
|
+
copyRight: false,
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
instance.receiveMessage((res) => { console.log(res); });
|
|
369
|
+
|
|
370
|
+
// 监听远端相机
|
|
371
|
+
instance.viewer.scene.camera.changed.addEventListener(() => {
|
|
372
|
+
if (!instance.viewer.scene.camera.isFlying) {
|
|
373
|
+
const position = instance.viewer.camera.positionWC.clone();
|
|
374
|
+
// ...做主从同步
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// 远端聚焦
|
|
379
|
+
instance.sendMessage({
|
|
380
|
+
name: 'viewer.scene.camera.focus', id: '2',
|
|
381
|
+
params: {
|
|
382
|
+
position: { x: -2178587.75, y: 4397006.30, z: 4075799.50 },
|
|
383
|
+
direction: { x: 0.3411047, y: -0.6884458, z: -0.6400703 },
|
|
384
|
+
up: { x: 0.2841681, y: -0.5735316, z: 0.7683164 },
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### S21. ArcGIS 卫星影像 — `basemap/ArcGISSatelliteImage.html` L62-L75
|
|
390
|
+
|
|
391
|
+
```js
|
|
392
|
+
// 来源: ArcGISSatelliteImage.html L62-L75
|
|
393
|
+
// 关键 API: ANOVGIS.ImageryLayerFactory.createArcGisImageryLayer
|
|
394
|
+
// ArcGIS World_Imagery(默认)
|
|
395
|
+
const arcgis = viewer.imageryLayers.addImageryProvider(
|
|
396
|
+
await ANOVGIS.ImageryLayerFactory.createArcGisImageryLayer()
|
|
397
|
+
);
|
|
398
|
+
// 蓝黑暗色变体
|
|
399
|
+
const arcgisDark = viewer.imageryLayers.addImageryProvider(
|
|
400
|
+
ANOVGIS.ImageryLayerFactory.createArcGisImageryLayer({ style: 'dark' })
|
|
401
|
+
);
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
<a id="s22"></a>
|
|
405
|
+
### S22. Google 卫星影像 — `basemap/GoogleSatelliteImage.html` L60-L70
|
|
406
|
+
|
|
407
|
+
```js
|
|
408
|
+
// 来源: GoogleSatelliteImage.html L60-L70
|
|
409
|
+
// 关键 API: ANOVGIS.ImageryLayerFactory.createGoogleImageryImageryLayer
|
|
410
|
+
const googleImg = viewer.imageryLayers.addImageryProvider(
|
|
411
|
+
ANOVGIS.ImageryLayerFactory.createGoogleImageryImageryLayer()
|
|
412
|
+
);
|
|
413
|
+
// 注记层(lyrs='h' = hybrid/标注层)
|
|
414
|
+
const googleLbl = viewer.imageryLayers.addImageryProvider(
|
|
415
|
+
ANOVGIS.ImageryLayerFactory.createGoogleImageryImageryLayer({ lyrs: 'h' })
|
|
416
|
+
);
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### S23. 百度卫星影像 — `basemap/baiduSatelliteImage.html` L62-L75
|
|
420
|
+
|
|
421
|
+
```js
|
|
422
|
+
// 来源: baiduSatelliteImage.html L62-L75
|
|
423
|
+
// 关键 API: ANOVGIS.ImageryLayerFactory.createBaiduImageryLayer(crs:'WGS84')
|
|
424
|
+
// ⚠️ 必须传 crs:'WGS84'(百度默认是 BD09,不传会偏)
|
|
425
|
+
const baidu = viewer.imageryLayers.addImageryProvider(
|
|
426
|
+
ANOVGIS.ImageryLayerFactory.createBaiduImageryLayer({ crs: 'WGS84' })
|
|
427
|
+
);
|
|
428
|
+
// 百度路况
|
|
429
|
+
const baiduTraffic = viewer.imageryLayers.addImageryProvider(
|
|
430
|
+
ANOVGIS.ImageryLayerFactory.createBaiduImageryLayer({ crs: 'WGS84', style: 'traffic' })
|
|
431
|
+
);
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### S24. 腾讯卫星影像 — `basemap/tencentSatelliteImage.html` L61-L79
|
|
435
|
+
|
|
436
|
+
```js
|
|
437
|
+
// 来源: tencentSatelliteImage.html L61-L79
|
|
438
|
+
// 关键 API: ANOVGIS.ImageryLayerFactory.createTencentImageryLayer
|
|
439
|
+
// style:'img' = 卫星 / style:'2' = 注记 / 不传 style = 矢量电子地图
|
|
440
|
+
const tencentImg = viewer.imageryLayers.addImageryProvider(
|
|
441
|
+
ANOVGIS.ImageryLayerFactory.createTencentImageryLayer({ style: 'img' })
|
|
442
|
+
);
|
|
443
|
+
const tencentLbl = viewer.imageryLayers.addImageryProvider(
|
|
444
|
+
ANOVGIS.ImageryLayerFactory.createTencentImageryLayer({ style: '2' })
|
|
445
|
+
);
|
|
446
|
+
const tencentMap = viewer.imageryLayers.addImageryProvider(
|
|
447
|
+
ANOVGIS.ImageryLayerFactory.createTencentImageryLayer() // 不传 style = 矢量电子地图
|
|
448
|
+
);
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
<a id="s25"></a>
|
|
452
|
+
### S25. terrainRGB 地形(⚠️ SDK 未包装,P0 反例) — `basemap/terrainrgb.html` L52-L123
|
|
453
|
+
|
|
454
|
+
```js
|
|
455
|
+
// 来源: terrainrgb.html L52-L123
|
|
456
|
+
// ⚠️ P0 SDK 优先级铁律反例:terrainRGB SDK 没包装,需自己继承 Cesium.WebMapTileServiceImageryProvider
|
|
457
|
+
// 推荐 SDK 后续补 ANOVGIS.ImageryLayerFactory.createTdtTerrainRgbImageryLayer({tk, layer})
|
|
458
|
+
class GrayscaleImageryProvider extends Cesium.WebMapTileServiceImageryProvider {
|
|
459
|
+
constructor(options) {
|
|
460
|
+
super(options);
|
|
461
|
+
this._tilingScheme = new Cesium.WebMercatorTilingScheme();
|
|
462
|
+
this.maxHeight = -10000;
|
|
463
|
+
this.minHeight = 10000;
|
|
464
|
+
}
|
|
465
|
+
get tilingScheme() { return this._tilingScheme; }
|
|
466
|
+
async requestImage(x, y, level, request) {
|
|
467
|
+
const image = await super.requestImage(x, y, level, request);
|
|
468
|
+
return await this.convertToGrayscale(image); // RGB -> height = -10000 + (r*65536 + g*256 + b) * 0.1
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
const shadedRelief1 = new GrayscaleImageryProvider({
|
|
472
|
+
url: 'https://lcdata.tianditu.gov.cn/terrain-rgb_w/wmts?tk=YOUR_TDT_KEY',
|
|
473
|
+
layer: 'terrain-rgb',
|
|
474
|
+
style: 'default',
|
|
475
|
+
format: 'tiles',
|
|
476
|
+
tileMatrixSetID: 'w',
|
|
477
|
+
maximumLevel: 19
|
|
478
|
+
});
|
|
479
|
+
viewer.imageryLayers.addImageryProvider(shadedRelief1);
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
<a id="s26"></a>
|
|
483
|
+
### S26. EPSG:4490 矢量瓦片(CGCS2000 地理坐标) — `offlinemap/loadVectorTiles_4490.html` L36-L56
|
|
484
|
+
|
|
485
|
+
```js
|
|
486
|
+
// 来源: loadVectorTiles_4490.html L36-L56
|
|
487
|
+
// 关键 API: ANOVGIS.ImageryLayerFactory.createWMTSImageryLayer
|
|
488
|
+
// 关键参数: tileMatrixSetID:'EPSG:4490' + tilingScheme: new Cesium.GeographicTilingScheme()
|
|
489
|
+
// (区别于 WebMercator,4490 是地理坐标)
|
|
490
|
+
window.viewer = new ANOVGIS.Viewer('cesiumContainer');
|
|
491
|
+
viewer.imageryLayers.addImageryProvider(
|
|
492
|
+
ANOVGIS.ImageryLayerFactory.createImageryLayer(ANOVGIS.ImageryType.TDT, {
|
|
493
|
+
style: 'img', key: globalConfig.tdtKey
|
|
494
|
+
})
|
|
495
|
+
);
|
|
496
|
+
const layer = ANOVGIS.ImageryLayerFactory.createWMTSImageryLayer({
|
|
497
|
+
rectangle: Cesium.Rectangle.fromDegrees(113.07, 35.34, 113.56, 35.74),
|
|
498
|
+
url: 'http://icenter.geovis.online/tilecache/service/wmts/rest/GF1-PNG-4490/{style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}?format=image/png',
|
|
499
|
+
layer: 'wmts', format: 'image/png', style: '',
|
|
500
|
+
tileMatrixSetID: 'EPSG:4490', // 关键:4490 矩阵集 ID
|
|
501
|
+
tilingScheme: new Cesium.GeographicTilingScheme(), // 关键:地理坐标切片方案
|
|
502
|
+
});
|
|
503
|
+
viewer.imageryLayers.addImageryProvider(layer);
|
|
504
|
+
viewer.flyTo(layer);
|
|
505
|
+
```
|