@3clear/basegis 0.1.1 → 0.1.2

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/README.md CHANGED
@@ -13,17 +13,19 @@
13
13
  ## 安装
14
14
 
15
15
  ```bash
16
- npm install @3clear/basegis leaflet axios pixi.js leaflet-pixi-overlay
16
+ npm install @3clear/basegis leaflet axios
17
17
  ```
18
18
 
19
+ `d3-contour`、`pixi.js` 和 `leaflet-pixi-overlay` 已随 BaseGIS 构建产物发布,业务项目不需要单独安装。其中 Pixi 相关代码只在首次使用 Leaflet 海量点能力时按需加载。
20
+
19
21
  使用样式:
20
22
 
21
23
  ```js
22
24
  import '@3clear/basegis/style.css'
23
25
  ```
24
26
 
25
- Cesium 当前不随 npm 包发布,宿主项目需要按原项目方式把 Cesium 静态资源放到 `public/lib/Cesium`,并保证初始化前能访问 `window.Cesium`。
26
- 如果需要加载 GeoTIFF 网格,需要宿主项目提前提供 `window.GeoTIFF`。
27
+ Cesium 当前不随 npm 包发布,项目需要按原项目方式把 Cesium 静态资源放到 `public/lib/Cesium`,并保证初始化前能访问 `window.Cesium`。
28
+ 如果需要加载 GeoTIFF 网格,需要项目提前提供 `window.GeoTIFF`。
27
29
 
28
30
  ## 出口
29
31
 
@@ -39,6 +41,7 @@ import {
39
41
  PointLargeLayerController,
40
42
  PointDensityController,
41
43
  ContourLayerController,
44
+ RasterContourController,
42
45
  PressureContourLayer,
43
46
  createPressureDataResolver,
44
47
  buildPressureRenderData,
@@ -281,15 +284,8 @@ const mapCore = new BaseGIS({
281
284
  // 创建地图实例。
282
285
  mapCore.init()
283
286
 
284
- // 只修改当前运行时引擎配置,不会自动重建地图实例。
285
- mapCore.setEngine('leaflet')
286
-
287
- // 真正切换地图引擎,需要再次 init。
288
- // init 内部会先销毁旧 adapter,再按新 engineType 创建新地图实例。
289
- mapCore.init({
290
- engineType: 'leaflet',
291
- containerId: 'map',
292
- })
287
+ // 只传目标引擎即可完成切换、视野保留和托管图层恢复。
288
+ await mapCore.setEngine('leaflet')
293
289
 
294
290
  // 覆盖运行时配置,不会自动重建地图。
295
291
  mapCore.setConfig({ view: { defaultSceneMode: '2d' } })
@@ -304,13 +300,33 @@ mapCore.getMapInstance()
304
300
  mapCore.destroy()
305
301
  ```
306
302
 
303
+ Cesium 默认使用最高 2 倍设备像素比、FXAA 和 4 倍 MSAA,避免高分屏上的细线出现明显像素阶梯。可按设备性能覆盖:
304
+
305
+ ```js
306
+ const mapCore = new BaseGIS({
307
+ config: {
308
+ engine: {
309
+ cesium: {
310
+ renderQuality: {
311
+ maximumDevicePixelRatio: 1.5,
312
+ fxaa: true,
313
+ msaaSamples: 4,
314
+ },
315
+ },
316
+ },
317
+ },
318
+ })
319
+ ```
320
+
307
321
  方法说明:
308
322
 
309
323
  | 方法 | 参数 | 说明 |
310
324
  | --- | --- | --- |
311
- | `init(options)` | `{ container, containerId, engineType }` | 初始化地图。`container` 可传 DOM,`containerId` 可传 DOM id。 |
312
- | `destroy()` | | 销毁当前地图实例和 adapter。 |
313
- | `setEngine(engineType)` | `'cesium'/'leaflet'` | 修改当前引擎类型;不自动重建地图。 |
325
+ | `init(options)` | `{ container, containerId, engineType }` | 初始化地图。重复调用时会自动恢复 BaseGIS 托管图层。 |
326
+ | `setEngine(engineType, options)` | 引擎类型、初始化参数 | 未初始化时记录默认引擎;已初始化时自动切换、保留视野并恢复托管图层。 |
327
+ | `switchEngine(engineType, options)` | 引擎类型、初始化参数 | `setEngine()` 的兼容别名。 |
328
+ | `whenReady()` | 无 | 等待最近一次 `init()` 触发的托管图层恢复完成。 |
329
+ | `destroy()` | 无 | 销毁当前地图实例和 adapter,并清空托管图层快照。 |
314
330
  | `setConfig(config)` | `Object` | 合并运行时配置;不自动重建地图。 |
315
331
  | `getEngineType()` | 无 | 返回当前引擎类型。 |
316
332
  | `getConfig()` | 无 | 返回当前运行时配置。 |
@@ -318,62 +334,55 @@ mapCore.destroy()
318
334
 
319
335
  #### 推荐的引擎切换写法
320
336
 
321
- 页面上做 Cesium / Leaflet 切换时,建议把切换动作收敛成一个函数。`setEngine()` 用来更新 `BaseGIS` 内部引擎类型,`init()` 才是真正重建地图。
337
+ 页面上做 Cesium / Leaflet 切换时,直接调用 `setEngine()`。它会保留当前视野、重建目标引擎,并等待托管图层自动恢复。
322
338
 
323
339
  ```js
324
- async function switchEngine(engineType) {
340
+ async function changeEngine(engineType) {
325
341
  if (!mapCore || mapCore.getEngineType() === engineType) {
326
342
  return
327
343
  }
328
344
 
329
- const result = mapCore.init({
330
- engineType,
331
- containerId: 'map',
332
- })
345
+ const result = await mapCore.setEngine(engineType)
333
346
 
334
347
  if (!result.success) {
335
348
  console.warn(result.message)
336
349
  return
337
350
  }
338
-
339
- // 地图实例已经重建,业务图层需要用自己的数据源重新加载。
340
- await reloadBusinessLayers()
341
351
  }
342
352
  ```
343
353
 
344
- 也可以显式先调用 `setEngine()`:
354
+ 直接重复调用 `init({ engineType })` 也会自动开始恢复;如果后续逻辑依赖恢复完成,需要再等待 `whenReady()`:
345
355
 
346
356
  ```js
347
- mapCore.setEngine('leaflet')
348
357
  const result = mapCore.init({
358
+ engineType: 'leaflet',
349
359
  containerId: 'map',
350
360
  })
361
+
362
+ if (result.success) {
363
+ await mapCore.whenReady()
364
+ }
351
365
  ```
352
366
 
353
- 两种写法效果一致;如果 `init({ engineType })` 已经传了目标引擎,可以不单独调用 `setEngine()`。
367
+ `switchEngine()` 作为兼容别名保留,行为与 `setEngine()` 一致。
354
368
 
355
369
  #### 切换后的图层处理
356
370
 
357
- 引擎切换不是把 Cesium 图层“搬到” Leaflet,也不是把 Leaflet 图层“搬到” Cesium。`init()` 重建地图时会销毁旧引擎实例,因此:
371
+ 引擎切换不是把 Cesium 图层对象“搬到” Leaflet,也不是把 Leaflet 图层对象“搬到” Cesium。BaseGIS 会保存托管图层的业务参数,并在新 adapter 中重新创建图层。
358
372
 
359
- - `BaseGIS` 的配置会保留,例如 `config / initialView / basemap`。
360
- - 业务数据应由页面或 store 保存,例如站点数组、图片地址、等值线数据、风场数据。
361
- - 切换成功后,用这些业务数据重新调用对应 Controller 的 `load/update`,或重新调用 `BaseGIS` 图层方法。
373
+ - 自动恢复范围包括图片、网格、海量点、点位抽稀、等值线和三维体图层,对应 `upsert*Layer` 方法及 Controller。
374
+ - 图层最新的数据参数、显隐、清空、删除、海量点删除和高亮状态会同步到 BaseGIS 快照。
375
+ - 快照只保存业务参数引用,不复制大数组,不保存任何底层引擎对象。
376
+ - 三维体图层切到 Leaflet 时会返回不支持结果,但快照仍保留,切回 Cesium 后会继续恢复。
362
377
  - Cesium 专有能力在 Leaflet 下不可用,例如 DEM、三维体渲染、三维切片/剖面渲染。
363
- - 页面层不应直接依赖 Cesium / Leaflet 分支;如果确实要访问底层实例,只在边界很清楚的地方使用 `getMapInstance()`。
378
+ - 一次性绘制对象、点击监听、风场、剖面图层和页面直接操作底层引擎创建的对象不在托管范围内,需要业务自行恢复。
364
379
 
365
- 常见重载示例:
380
+ 切换结果中可以查看恢复明细:
366
381
 
367
382
  ```js
368
- async function reloadBusinessLayers() {
369
- await imageLayer.update(currentImagePayload)
370
- await pointLayer.load({ points: currentPoints })
371
- await contour.load(currentContourPayload)
372
-
373
- if (mapCore.getEngineType() === 'cesium') {
374
- mapCore.upsertVolumeLayer(currentVolumePayload)
375
- }
376
- }
383
+ const result = await mapCore.setEngine('leaflet')
384
+ console.log(result.data.restore.restored)
385
+ console.log(result.data.restore.failed)
377
386
  ```
378
387
 
379
388
 
@@ -1444,6 +1453,8 @@ if (result.success) {
1444
1453
 
1445
1454
  用于海量点位渲染。它会尽量把传入的有效点位全部渲染出来,适合站点、设备、告警、监测点等需要保留全部点位并支持点击、高亮、删除、显隐的场景。
1446
1455
 
1456
+ Leaflet 模式使用 BaseGIS 内置的 `pixi.js` 和 `leaflet-pixi-overlay` 异步渲染,业务项目无需安装这两个依赖;Cesium 模式不加载 Pixi 相关代码。
1457
+
1447
1458
  如果业务目标是“地图缩小时按屏幕网格抽稀,只显示代表点”,应使用后文的 `PointDensityController`。
1448
1459
 
1449
1460
  ### Demo 位置
@@ -2189,6 +2200,8 @@ await contour.load({
2189
2200
  color: '#ff4d4f',
2190
2201
  width: 2,
2191
2202
  },
2203
+ showLabel: true,
2204
+ labelFormatter: (item) => String(item.value),
2192
2205
  })
2193
2206
 
2194
2207
  await contour.update({
@@ -2203,7 +2216,182 @@ contour.clear()
2203
2216
  contour.destroy()
2204
2217
  ```
2205
2218
 
2206
- 数据别名支持 `contours / isolines / isoline / lines / data / items`。
2219
+ 数据别名支持 `contours / isolines / isoline / lines / data / items`。开启 `showLabel` 后,Cesium 和 Leaflet 都会根据当前屏幕范围重新选择可见线段上的位置;地图平移、缩放、容器尺寸变化或切换引擎时只重排标签,不重新生成等值线。
2220
+
2221
+ Cesium 在默认椭球地表上使用 `PolylineCollection` 批量落图;真正启用 DEM 地形后才使用 `GroundPolylinePrimitive`。新批次就绪后再替换旧批次,不为每条线创建独立 Entity。标签定位可通过 `labelLineThinStep` 抽样投影点,不会改变实际绘制的等值线。
2222
+
2223
+ Leaflet 默认复用高精度 SVG renderer,并使用 `smoothFactor: 0.5` 做屏幕空间简化:缩小时清理挤在同一像素内的折点,放大后自动保留曲线细节,避免全局 `preferCanvas` 放大细线锯齿。线位于 `dt-contour-pane`(层级 `450`),稳定显示在图片图层上方,并保持在 `markerPane` 数值标签下方;显式传入 `pane` 时仍以业务配置为准。
2224
+
2225
+ 屏幕标注参数:
2226
+
2227
+ | 参数 | 类型 | 默认值 | 说明 |
2228
+ | --- | --- | --- | --- |
2229
+ | `showLabel/showLabels` | `boolean` | `false` | 是否显示等值线数值。 |
2230
+ | `labelFormatter(item, record)` | `Function` | 等值级别 | 格式化标签文本。 |
2231
+ | `labelColor` | `string` | `#34464f` | 文字颜色。 |
2232
+ | `labelBackgroundColor` | `string` | `rgba(255,255,255,0.78)` | 背景色。 |
2233
+ | `labelBorderColor/labelBorderWidth` | `string/number` | `rgba(93,112,116,0.35)` / `0.5` | 边框颜色和宽度。 |
2234
+ | `labelBorderRadius` | `number` | `8` | 圆角,单位 px。 |
2235
+ | `labelFontSize/labelFontWeight` | `number/string` | `10/600` | 字号和字重。 |
2236
+ | `labelPaddingX/labelPaddingY` | `number` | `4/0` | 标签内部留白。 |
2237
+ | `labelMinWidth` | `number` | `32` | 标签最小宽度,短数值保持横向胶囊形状。 |
2238
+ | `labelViewportPadding` | `number/object/Function` | `24` | 屏幕安全边距;对象为 `top/right/bottom/left`,函数接收 `{width,height}`。 |
2239
+ | `labelMinScreenLength` | `number` | `72` | 可见线段达到该像素长度后才允许放标签。 |
2240
+ | `labelLineThinStep` | `number` | Cesium `3`,Leaflet `1` | 标签定位时的投影抽样步长,不影响实际线几何。 |
2241
+ | `labelCollisionPadding` | `number` | `7` | 标签碰撞间距。 |
2242
+ | `labelMaxPerLevel` | `number` | `Infinity` | 每个等值级别在当前视野中的标签上限;默认按可见线数量自动决定。 |
2243
+ | `labelDisableDepthTestDistance` | `number` | `Infinity` | Cesium 标签关闭深度检测的距离。 |
2244
+
2245
+ `getState()` 的 `labelCount` 是当前视野实际显示的标签数量。Cesium 状态额外包含 `lineRenderer/lineBuildElapsed/labelLayoutElapsed/primitiveReadyElapsed`,用于区分线构建、标签排版和异步就绪耗时。`onStateChange(state)` 会在视野重排后回传新状态。页面存在侧栏等遮挡时,可通过 `labelViewportPadding` 排除对应区域。
2246
+
2247
+ ## RasterContourController
2248
+
2249
+ 用于从 GeoTIFF、灰度图或数值网格直接计算并绘制等值线。内部统一使用 `d3-contour` 追踪等值线,输出仍交给 `ContourLayerController`,所以页面不需要区分 Cesium 和 Leaflet;调用 `BaseGIS.setEngine()` 时,已经生成的等值线会随托管图层自动恢复。
2250
+
2251
+ ### 1. GeoTIFF 生成等值线
2252
+
2253
+ ```js
2254
+ import { RasterContourController } from '@3clear/basegis/methods'
2255
+
2256
+ const rasterContour = new RasterContourController({
2257
+ mapCore,
2258
+ layerId: 'temperature-raster-contour',
2259
+ // thresholds / interval / thresholdCount 三选一。
2260
+ interval: 5,
2261
+ smooth: true,
2262
+ visible: true,
2263
+ })
2264
+
2265
+ const result = await rasterContour.loadGeoTiff({
2266
+ tifUrl: '/data/temperature.tif',
2267
+ // TIF 范围不准确时可用 WGS84 四至覆盖文件元数据。
2268
+ area: {
2269
+ startLon: -180,
2270
+ startLat: -90,
2271
+ endLon: 180,
2272
+ endLat: 90,
2273
+ },
2274
+ band: 0,
2275
+ interval: 5,
2276
+ clampToGround: true,
2277
+ showLabel: true,
2278
+ labelFormatter: (item) => String(Math.round(item.value)),
2279
+ labelViewportPadding: { top: 32, right: 32, bottom: 32, left: 360 },
2280
+ styleCallback: (item) => ({
2281
+ color: item.value >= 30 ? '#ff6b6b' : '#d5f4ff',
2282
+ width: item.value % 10 === 0 ? 2 : 1,
2283
+ weight: item.value % 10 === 0 ? 2 : 1,
2284
+ }),
2285
+ })
2286
+
2287
+ if (!result.success) {
2288
+ console.warn(result.message)
2289
+ }
2290
+
2291
+ // 仅调整等值距时复用已解析网格,不再请求和解码 TIF。
2292
+ await rasterContour.update({ interval: 2 })
2293
+ ```
2294
+
2295
+ GeoTIFF 依赖宿主页面提供 `window.GeoTIFF`。控制器会读取波段、尺寸、坐标系和范围;当前原生支持 EPSG:4326、EPSG:3857。其他投影可先转换为 WGS84,或传入 WGS84 `area` 覆盖原始范围。
2296
+
2297
+ ### 2. 灰度图生成等值线
2298
+
2299
+ ```js
2300
+ await rasterContour.loadGrayImage({
2301
+ grayImageUrl: '/data/pressure-gray.png',
2302
+ area: [-180, -90, 180, 90],
2303
+ grayMinValue: 0,
2304
+ grayMaxValue: 255,
2305
+ minValue: 960,
2306
+ maxValue: 1040,
2307
+ noDataValue: 255,
2308
+ interval: 4,
2309
+ })
2310
+ ```
2311
+
2312
+ 灰度换算规则:
2313
+
2314
+ ```text
2315
+ 业务值 = (灰度值 - grayMinValue) / (grayMaxValue - grayMinValue)
2316
+ * (maxValue - minValue) + minValue
2317
+ ```
2318
+
2319
+ 灰度图片本身没有地理范围和业务值含义,因此 `area` 必填;要表达真实数据,还应传正确的灰度范围与业务值范围。已经着色的彩色 PNG 不能反推出原始业务值,应使用对应 TIF 或直接传数值网格。
2320
+
2321
+ ### 3. 数值网格生成等值线
2322
+
2323
+ ```js
2324
+ await rasterContour.loadGrid({
2325
+ values: [12, 14, 16, 18, 20, 22],
2326
+ width: 3,
2327
+ height: 2,
2328
+ area: [100, 20, 103, 22],
2329
+ thresholds: [15, 20],
2330
+ })
2331
+
2332
+ // values 也可以直接传二维数组,此时不需要 width / height。
2333
+ await rasterContour.loadGrid({
2334
+ values: [
2335
+ [12, 14, 16],
2336
+ [18, 20, 22],
2337
+ ],
2338
+ area: [100, 20, 103, 22],
2339
+ thresholdCount: 6,
2340
+ })
2341
+ ```
2342
+
2343
+ ### 4. 参数
2344
+
2345
+ 数据源参数:
2346
+
2347
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
2348
+ | --- | --- | --- | --- | --- |
2349
+ | `mapCore/baseGIS` | `BaseGIS` | 构造时必填 | `null` | 当前 BaseGIS 实例。 |
2350
+ | `layerId/contourLayerId` | `string` | 否 | `raster-contour-default` | 等值线图层 id。 |
2351
+ | `sourceType` | `geotiff/grayscale/grid` | 否 | 自动判断 | `loadGeoTiff/loadGrayImage/loadGrid` 会自动补齐。 |
2352
+ | `tifUrl/tiffUrl` | `string` | GeoTIFF 必填 | `''` | GeoTIFF 地址。 |
2353
+ | `arrayBuffer` | `ArrayBuffer` | 否 | `null` | 可代替 `tifUrl` 直接传 TIF 内容。 |
2354
+ | `band` | `number` | 否 | `0` | GeoTIFF 波段下标,从 0 开始。 |
2355
+ | `imageIndex` | `number` | 否 | `0` | 多图像 GeoTIFF 的图像下标。 |
2356
+ | `grayImageUrl/imageUrl` | `string` | 灰度图必填 | `''` | 灰度图地址,服务端必须允许 Canvas 跨域读取。 |
2357
+ | `values/data/grid` | `Array/TypedArray` | 数值网格必填 | - | 一维或二维数值。 |
2358
+ | `width/height` | `number` | 一维网格必填 | `0` | 一维数组的网格尺寸。 |
2359
+ | `area` | `object/number[]` | 图片和普通网格必填 | `null` | WGS84 范围;数组顺序为 `[west,south,east,north]`。 |
2360
+ | `sourceProjection` | `string` | 否 | 自动读取 | 支持 `EPSG:4326`、`EPSG:3857`。 |
2361
+ | `noDataValue` | `number` | 否 | TIF 自动读取 | 指定无效值;灰度图不传时仅透明像素无效。 |
2362
+ | `validMin/validMax` | `number` | 否 | - | 过滤值域外数据。 |
2363
+ | `scale/offset` | `number` | 否 | `1/0` | 数值换算为 `value * scale + offset`。 |
2364
+ | `isSplit` | `boolean` | 否 | `false` | 把左右半幅交换,处理以 0° 经线为边界的全球数据。 |
2365
+
2366
+ 等值线参数:
2367
+
2368
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
2369
+ | --- | --- | --- | --- | --- |
2370
+ | `thresholds/levels` | `number[]` | 三选一 | - | 显式等值线级别,仅保留实际值域内的值。 |
2371
+ | `interval/contourInterval` | `number` | 三选一 | - | 固定等值距。 |
2372
+ | `thresholdCount/levelCount` | `number` | 三选一 | `12` | 自动均分级别数量,范围 1~100。 |
2373
+ | `smooth` | `boolean` | 否 | `true` | 是否平滑等值线。 |
2374
+ | `smoothingIterations` | `number` | 否 | `0` | Chaikin 补点平滑次数,范围 0~3;气象格点通常取 1~2,次数越高,点数越多。 |
2375
+ | `excludeBoundary` | `boolean` | 否 | `true` | 去掉 d3 面边界中贴着栅格四边的伪矩形线。 |
2376
+ | `maxCells` | `number` | 否 | `1000000` | 超过该像元数时先等比例抽样,避免大图阻塞页面。 |
2377
+ | `minimumLinePoints` | `number` | 否 | `3` | 最短线点数,用于过滤栅格四角的两点补边。 |
2378
+ | `coordinatePrecision` | `number` | 否 | `6` | 输出经纬度小数位数。 |
2379
+ | `visible` | `boolean` | 否 | `true` | 初始显隐。 |
2380
+ | 其他渲染参数 | - | 否 | - | 与 `ContourLayerController` 相同,如 `color/width/weight/styleCallback/showLabel/labelViewportPadding`。 |
2381
+
2382
+ ### 5. 方法和状态
2383
+
2384
+ | 方法 | 说明 |
2385
+ | --- | --- |
2386
+ | `load(payload, options)` | 自动判断数据源并生成等值线。 |
2387
+ | `loadGeoTiff(payload, options)` | 从 GeoTIFF 生成。 |
2388
+ | `loadGrayImage(payload, options)` | 从灰度图生成。 |
2389
+ | `loadGrid(payload, options)` | 从数值网格生成。 |
2390
+ | `update(payload)` | 合并配置后重新计算;仅修改等值线或渲染参数时复用已解析网格,修改数据源参数时自动重新加载。 |
2391
+ | `show/hide/toggle` | 控制等值线显隐。 |
2392
+ | `clear/destroy` | 清空或销毁控制器。 |
2393
+ | `getState()` | 返回尺寸、值域、级别、线数、当前标注数、投影、耗时和底层 contour 状态。 |
2394
+ | `getRasterData()` | 返回当前标准栅格,包含 `values/width/height/area`。 |
2207
2395
 
2208
2396
  [//]: # ()
2209
2397
  [//]: # (## PressureContourLayer)
@@ -2460,20 +2648,19 @@ export function useBaseGIS(options = {}) {
2460
2648
  mapCore.value = null
2461
2649
  })
2462
2650
 
2463
- function switchEngine(engineType) {
2651
+ async function setEngine(engineType) {
2464
2652
  if (!mapCore.value || mapCore.value.getEngineType() === engineType) {
2465
2653
  return { success: true }
2466
2654
  }
2467
2655
 
2468
- return mapCore.value.init({
2656
+ return mapCore.value.setEngine(engineType, {
2469
2657
  ...options,
2470
- engineType,
2471
2658
  })
2472
2659
  }
2473
2660
 
2474
2661
  return {
2475
2662
  mapCore,
2476
- switchEngine,
2663
+ setEngine,
2477
2664
  }
2478
2665
  }
2479
2666
  ```
@@ -2488,22 +2675,22 @@ export function useBaseGIS(options = {}) {
2488
2675
  <script setup>
2489
2676
  import { useBaseGIS } from './useBaseGIS'
2490
2677
 
2491
- const { mapCore, switchEngine } = useBaseGIS({
2678
+ const { mapCore, setEngine } = useBaseGIS({
2492
2679
  engineType: 'cesium',
2493
2680
  containerId: 'map',
2494
2681
  })
2495
2682
  </script>
2496
2683
  ```
2497
2684
 
2498
- 如果页面有业务图层,`switchEngine()` 成功后要重新加载图层数据:
2685
+ BaseGIS 托管图层会自动恢复,页面不需要重新请求数据:
2499
2686
 
2500
2687
  ```js
2501
- const result = switchEngine('leaflet')
2502
- if (result.success) {
2503
- await reloadBusinessLayers()
2504
- }
2688
+ const result = await setEngine('leaflet')
2689
+ console.log(result.data?.restore)
2505
2690
  ```
2506
2691
 
2692
+ 只有风场、剖面、一次性绘制对象或页面直接创建的底层引擎对象需要在切换成功后自行恢复。
2693
+
2507
2694
  ## 能力支持说明
2508
2695
 
2509
2696
  | 能力 | Cesium | Leaflet |
@@ -2634,18 +2821,13 @@ mapCore.init()
2634
2821
 
2635
2822
  ### 切换引擎后图层没了
2636
2823
 
2637
- 这是预期行为。Cesium 和 Leaflet 的图层对象不能互相复用,`init({ engineType })` 会销毁旧地图实例并创建新地图实例。
2638
-
2639
- 处理方式是:页面或 store 保存业务数据,切换成功后重新调用对应的加载方法。
2824
+ 直接使用 `setEngine()`。BaseGIS 会保留视野,并自动恢复图片、网格、海量点、点位抽稀、等值线和三维体等托管图层:
2640
2825
 
2641
2826
  ```js
2642
- const result = mapCore.init({
2643
- engineType: 'leaflet',
2644
- containerId: 'map',
2645
- })
2827
+ const result = await mapCore.setEngine('leaflet')
2646
2828
 
2647
- if (result.success) {
2648
- await imageLayer.update(currentImagePayload)
2649
- await pointLayer.load({ points: currentPoints })
2650
- }
2829
+ console.log(result.data?.restore?.restored)
2830
+ console.log(result.data?.restore?.failed)
2651
2831
  ```
2832
+
2833
+ 如果丢失的是 `drawPoint/drawLine/drawPolygon/drawText/addMarker`、点击监听、风场、剖面图层或页面直接创建的 Cesium / Leaflet 对象,它们不属于托管图层,需要业务在切换成功后自行恢复。