map-ol-utils 0.1.31 → 0.2.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 目录:`packages/map-utils` | npm 包名:`map-ol-utils`
4
4
 
5
- 基于 [OpenLayers](https://openlayers.org/) 的地图工具库,封装了地图实例管理、底图创建、矢量/面/线/聚合/海量点图层、要素交互选择、视野自适应、WMTS 接入等常用能力。
5
+ 基于 [OpenLayers](https://openlayers.org/) 的地图工具库,封装了地图实例管理、底图创建、矢量/面/线/聚合/海量点图层、要素交互选择、视野自适应、WMTS 接入,以及天地图私有 VTS 的浏览器加载与标准 MVT 转换能力。
6
6
 
7
7
  ## 特性
8
8
 
@@ -13,6 +13,29 @@
13
13
  - **聚合图层**:基于 `ol/source/Cluster`,半径/颜色随聚合数量动态计算。
14
14
  - **坐标系转换**:内部统一通过 [`gcoord`](https://github.com/hujiulong/gcoord) 转换到 `WGS84`(`EPSG:4326`)。
15
15
  - **事件总线**:内置 `mitt` 实例 `emitter`,用于派发要素选中等事件。
16
+ - **扩展能力**:提供天地图组合、栅格着色、Marker、绘制量算、GeoJSON 图层和多图层选择能力。
17
+ - **私有 VTS 转换**:支持 PK 编解码、私有 Protobuf 字段与 Geometry 命令转换、样式合并和 Web Worker 解码。
18
+
19
+ ## 项目结构
20
+
21
+ ```text
22
+ packages/map-utils/
23
+ ├── src/
24
+ │ ├── core/ # 类型、常量、事件总线与地图上下文
25
+ │ ├── interaction/ # 绘制和要素选择交互
26
+ │ ├── layer/ # 底图、矢量、聚合、海量点、WMTS 与图层生命周期
27
+ │ ├── map/ # 地图实例管理与视野适配
28
+ │ ├── overlay/ # Overlay 与动画标注
29
+ │ ├── tdt-vts/ # 天地图私有 VTS 加载、转换、Worker 与 OL 适配
30
+ │ └── index.ts # 唯一公共 API 入口
31
+ ├── test/
32
+ │ ├── architecture.test.ts # 模块边界与架构约束
33
+ │ └── compatibility.test.ts # 公共 API 兼容性测试
34
+ ├── package.json # 包入口、依赖和构建脚本
35
+ ├── tsconfig.json # TypeScript 配置
36
+ ├── tsdown.config.ts # ESM/CJS 与类型声明构建配置
37
+ └── README.md # 安装、API 与使用约定
38
+ ```
16
39
 
17
40
  ## 安装
18
41
 
@@ -20,7 +43,7 @@
20
43
  pnpm add map-ol-utils ol gcoord
21
44
  ```
22
45
 
23
- `ol` 是 **peerDependency**(要求 `>=10.5.0`),需由宿主项目安装。
46
+ `ol` 是 **peerDependency**(要求 `^10.10.0`),需由宿主项目安装。
24
47
 
25
48
  ## 快速开始
26
49
 
@@ -43,13 +66,67 @@ map.addLayer(layer)
43
66
  emitter.on('selected-feature', (data) => console.log('选中要素:', data))
44
67
  ```
45
68
 
69
+ ## 天地图私有 VTS
70
+
71
+ 直接加载并转换为标准 Mapbox Vector Tile:
72
+
73
+ ```ts
74
+ import { createTdtVtsUrl, loadAndNormalizeTdtVts } from 'map-ol-utils'
75
+
76
+ const url = createTdtVtsUrl([3, 0, 4], {
77
+ token: 'YOUR_TDT_TOKEN',
78
+ hosts: [
79
+ 'https://tile0.tianditu.gov.cn',
80
+ 'https://tile1.tianditu.gov.cn',
81
+ 'https://tile2.tianditu.gov.cn'
82
+ ]
83
+ })
84
+
85
+ if (url) {
86
+ const { buffer, stats } = await loadAndNormalizeTdtVts(url)
87
+ }
88
+ ```
89
+
90
+ OpenLayers 可直接创建私有矢量瓦片源。解码默认在随包发布的模块 Worker 中执行:
91
+
92
+ ```ts
93
+ import { createTdtVectorSource } from 'map-ol-utils'
94
+
95
+ const { source, decoder } = createTdtVectorSource({
96
+ token: 'YOUR_TDT_TOKEN',
97
+ restoreMode: 'auto',
98
+ decoderOptions: {
99
+ requestTimeoutMs: 15_000
100
+ }
101
+ })
102
+
103
+ // 释放 source 时会自动释放关联的 Worker
104
+ source.dispose()
105
+
106
+ // 也可以取消单次解码,或在仅使用 decoder 时手动释放
107
+ const controller = new AbortController()
108
+ const decoding = decoder.decode(url, { signal: controller.signal })
109
+ controller.abort()
110
+ await decoding.catch(() => undefined)
111
+ decoder.dispose()
112
+ ```
113
+
114
+ `decoderOptions.requestTimeoutMs` 默认值为 30 秒。`source.dispose()` 与 `decoder.dispose()` 均可安全重复调用;前者会自动调用后者。
115
+
116
+ 相关公共 API:
117
+
118
+ - `encodeTdtPk()` / `decodeTdtPk()` / `createTdtVtsUrl()`
119
+ - `loadAndNormalizeTdtVts()` / `normalizePrivateMvt()`
120
+ - `TdtDecoderWorkerClient` / `createTdtVectorSource()`
121
+ - `loadTdtStyleBundle()` / `mergeTdtStyleLayers()`
122
+
46
123
  ---
47
124
 
48
125
  # API 详解
49
126
 
50
127
  > 约定:下文「实例方法默认 `mapInstance = instance`」表示该参数缺省时使用模块单例;调用前请确保已 `createMapInstance` / `createMap`。
51
128
 
52
- ## 一、地图实例(`create-map.ts`)
129
+ ## 一、地图实例(`map/create-map.ts`)
53
130
 
54
131
  ### `createMapInstance(config?)`
55
132
 
@@ -59,8 +136,8 @@ emitter.on('selected-feature', (data) => console.log('选中要素:', data))
59
136
  function createMapInstance(config?: Record<string, any>): CustomMap
60
137
  ```
61
138
 
62
- | 参数 | 类型 | 默认 | 说明 |
63
- |---|---|---|---|
139
+ | 参数 | 类型 | 默认 | 说明 |
140
+ | -------- | -------- | ---- | ----------------------------------------- |
64
141
  | `config` | `object` | `{}` | 透传给 `createMap` → `ol/View` 的视图配置 |
65
142
 
66
143
  返回:`CustomMap`(OpenLayers `Map` 的扩展,附带 `getLayerByName` / `removeLayerByName` / `changeLayersByNames` 方法与 `activeBaseLayer` 字段)。
@@ -83,7 +160,7 @@ function createMap(config?: Record<string, any>): CustomMap
83
160
  ```
84
161
 
85
162
  | 参数 | 类型 | 默认 | 说明 |
86
- |---|---|---|---|
163
+ | --- | --- | --- | --- |
87
164
  | `config` | `object` | `{}` | `ol/View` 配置;可额外传 `layers` 覆盖默认底图、`baseLayer` 标记当前底图名 |
88
165
 
89
166
  ```ts
@@ -104,7 +181,7 @@ function getMapInstance(): CustomMap
104
181
  function disposeMap(): void
105
182
  ```
106
183
 
107
- 销毁单例:移除全部 overlay、清空 interaction、移除并释放(`source.dispose()` + `layer.dispose()`)所有图层,`setTarget('')` 后将 `instance` 置为 `undefined`。
184
+ 销毁单例:移除全部 overlay、清空 interaction、移除并释放(`source.dispose()` + `layer.dispose()`)所有图层,`setTarget('')` 后将 `instance` 置为 `undefined`。未初始化或重复调用时会安全跳过。
108
185
 
109
186
  ### `resetMap(config?)`
110
187
 
@@ -131,7 +208,7 @@ let instance: CustomMap // 导出变量;未创建时为 undefined
131
208
 
132
209
  ---
133
210
 
134
- ## 二、底图与图层名管理(`base-layer.ts`)
211
+ ## 二、底图与图层名管理(`layer/base-layer.ts`)
135
212
 
136
213
  ### `createBaseLayer(layerName?)`
137
214
 
@@ -159,7 +236,7 @@ function createMapWorldLayer(layerName: WorldLayerType, tk?: string): Tile
159
236
  ```
160
237
 
161
238
  | 参数 | 类型 | 默认 | 说明 |
162
- |---|---|---|---|
239
+ | --- | --- | --- | --- |
163
240
  | `layerName` | `WorldLayerType` | — | 形如 `img_c`,内部按 `_` 拆分为图层名与 matrixSet |
164
241
  | `tk` | `string` | 内置默认令牌 | 天地图访问令牌,**建议自行传入** |
165
242
 
@@ -195,7 +272,10 @@ function removeLayerByName(name: string): void
195
272
  ### `changeLayersByNames(activeNames, allLayerNames)`
196
273
 
197
274
  ```ts
198
- function changeLayersByNames(activeNames: string[], allLayerNames: string[]): void
275
+ function changeLayersByNames(
276
+ activeNames: string[],
277
+ allLayerNames: string[]
278
+ ): void
199
279
  ```
200
280
 
201
281
  在 `allLayerNames` 范围内,按 `activeNames` 是否包含来逐一 `setVisible`,实现批量显隐切换。
@@ -206,18 +286,21 @@ changeLayersByNames(['poi-layer'], ['poi-layer', 'line-layer', 'face-layer'])
206
286
 
207
287
  ---
208
288
 
209
- ## 三、矢量图层(`layer-utils.ts`)
289
+ ## 三、矢量图层(`layer/vector-layer.ts`)
210
290
 
211
291
  ### `createBusinessLayer(dataList, config)`
212
292
 
213
293
  核心矢量图层构造函数:将业务数据组装为 GeoJSON(自动推断线/面几何类型),生成默认/激活样式并写入要素属性,可选开启点击交互。
214
294
 
215
295
  ```ts
216
- function createBusinessLayer(dataList: MassData[], config: VectorConfig): VectorLayer
296
+ function createBusinessLayer(
297
+ dataList: MassData[],
298
+ config: VectorConfig
299
+ ): VectorLayer
217
300
  ```
218
301
 
219
302
  | `config` 关键字段 | 类型 | 说明 |
220
- |---|---|---|
303
+ | --- | --- | --- |
221
304
  | `key` | `string` | 数据中存放坐标数组的字段名 |
222
305
  | `isLine` | `boolean` | 是否线图层(影响是否生成填充样式) |
223
306
  | `layerName` | `string?` | 图层名(className) |
@@ -233,10 +316,17 @@ function createBusinessLayer(dataList: MassData[], config: VectorConfig): Vector
233
316
 
234
317
  ```ts
235
318
  const layer = createBusinessLayer(dataList, {
236
- key: 'coordinates', isLine: false, openClick: true,
237
- layerName: 'area', colorKey: 'level',
238
- colorMap: new Map([['1', '#f00'], ['2', '#0f0']]),
239
- fillOpacity: 0.3, strokeWeight: 2
319
+ key: 'coordinates',
320
+ isLine: false,
321
+ openClick: true,
322
+ layerName: 'area',
323
+ colorKey: 'level',
324
+ colorMap: new Map([
325
+ ['1', '#f00'],
326
+ ['2', '#0f0']
327
+ ]),
328
+ fillOpacity: 0.3,
329
+ strokeWeight: 2
240
330
  })
241
331
  map.addLayer(layer)
242
332
  ```
@@ -246,8 +336,14 @@ map.addLayer(layer)
246
336
  `createBusinessLayer` 的便捷包装,分别固定 `isLine: true` / `isLine: false`。
247
337
 
248
338
  ```ts
249
- function createVectorLineLayer(dataList?: MassData[], config: VectorConfig): VectorLayer
250
- function createVectorFaceLayer(dataList?: MassData[], config: VectorConfig): VectorLayer
339
+ function createVectorLineLayer(
340
+ dataList?: MassData[],
341
+ config: VectorConfig
342
+ ): VectorLayer
343
+ function createVectorFaceLayer(
344
+ dataList?: MassData[],
345
+ config: VectorConfig
346
+ ): VectorLayer
251
347
  ```
252
348
 
253
349
  ### `appendFeaturesByLayer(targetLayer, dataList, crsForm?)`
@@ -264,7 +360,7 @@ function appendFeaturesByLayer(
264
360
 
265
361
  ---
266
362
 
267
- ## 四、海量点 MassMarks(`layer-utils.ts`)
363
+ ## 四、海量点 MassMarks(`layer/mass-marks.ts`)
268
364
 
269
365
  ### `buildMassMarksStyles(getImgUrlFn)`
270
366
 
@@ -282,14 +378,24 @@ type GetImgUrlFn = (baseUrl: string) => GetImgUrl
282
378
  图标地址按 `${markerIcon}-${i}` / `${markerIcon}-${i}-active`(后缀 `.webp`)拼接。
283
379
 
284
380
  ```ts
285
- const buildStyles = buildMassMarksStyles((baseUrl) => (name, ext) => `${baseUrl}/${name}${ext}`)
286
- const styles = buildStyles({ baseUrl: '/icons', markerIcon: 'alarm', markerSize: [32, 32], statusNum: 5 })
381
+ const buildStyles = buildMassMarksStyles(
382
+ (baseUrl) => (name, ext) => `${baseUrl}/${name}${ext}`
383
+ )
384
+ const styles = buildStyles({
385
+ baseUrl: '/icons',
386
+ markerIcon: 'alarm',
387
+ markerSize: [32, 32],
388
+ statusNum: 5
389
+ })
287
390
  ```
288
391
 
289
392
  ### `createMassMarksLayer(dataList, styleList?)`
290
393
 
291
394
  ```ts
292
- function createMassMarksLayer(dataList: MassData[], styleList?: StyleLike[]): VectorLayer
395
+ function createMassMarksLayer(
396
+ dataList: MassData[],
397
+ styleList?: StyleLike[]
398
+ ): VectorLayer
293
399
  ```
294
400
 
295
401
  按 `item.style` 索引在 `styleList` 中取样式创建要素图层(`zIndex: 2000`)。图层附带 `_isMassMarksLayer`、`_statusNum`、`_dataList`、`_uuidSet` 等属性。
@@ -301,11 +407,15 @@ function createMassMarksLayer(dataList: MassData[], styleList?: StyleLike[]): Ve
301
407
  ```ts
302
408
  function addMassMarksLayer(
303
409
  getImgUrlFn: GetImgUrlFn
304
- ): (dataList?: MassData[], iconConfig: IconConfig, openClick?: boolean) => VectorLayer
410
+ ): (
411
+ dataList?: MassData[],
412
+ iconConfig: IconConfig,
413
+ openClick?: boolean
414
+ ) => VectorLayer
305
415
  ```
306
416
 
307
417
  | `iconConfig` 字段 | 类型 | 说明 |
308
- |---|---|---|
418
+ | --- | --- | --- |
309
419
  | `baseUrl` | `string` | 图标根地址 |
310
420
  | `markerIcon` | `string` | 图标名前缀 |
311
421
  | `markerSize` | `[number, number]` | 图标尺寸 |
@@ -321,7 +431,13 @@ function addMassMarksLayer(
321
431
 
322
432
  ```ts
323
433
  const add = addMassMarksLayer((baseUrl) => (n, e) => `${baseUrl}/${n}${e}`)
324
- const layer = add(dataList, { baseUrl: '/icons', markerIcon: 'alarm', markerSize: [32, 32], statusNum: 5, hasLine: true })
434
+ const layer = add(dataList, {
435
+ baseUrl: '/icons',
436
+ markerIcon: 'alarm',
437
+ markerSize: [32, 32],
438
+ statusNum: 5,
439
+ hasLine: true
440
+ })
325
441
  ```
326
442
 
327
443
  ### `addFeaturesByLayer(targetLayer, dataList, config)`
@@ -348,12 +464,15 @@ function updateMarksLayersByStatus(checkedStatusList?: string[]): MassData[]
348
464
 
349
465
  ---
350
466
 
351
- ## 五、聚合图层(`layer-utils.ts`)
467
+ ## 五、聚合图层(`layer/cluster-layer.ts`)
352
468
 
353
469
  ### `createClusterLayer(dataList, config)`
354
470
 
355
471
  ```ts
356
- function createClusterLayer(dataList: ClusterData[], config: ClusterConfig): VectorLayer
472
+ function createClusterLayer(
473
+ dataList: ClusterData[],
474
+ config: ClusterConfig
475
+ ): VectorLayer
357
476
 
358
477
  type ClusterData = {
359
478
  _uuid: string
@@ -377,15 +496,17 @@ type ClusterConfig = {
377
496
 
378
497
  ```ts
379
498
  const cluster = createClusterLayer(dataList, {
380
- distance: 80, minDistance: 20,
381
- singleStyles: [singlePointStyle], openClick: true
499
+ distance: 80,
500
+ minDistance: 20,
501
+ singleStyles: [singlePointStyle],
502
+ openClick: true
382
503
  })
383
504
  map.addLayer(cluster)
384
505
  ```
385
506
 
386
507
  ---
387
508
 
388
- ## 六、交互与选中(`layer-utils.ts`)
509
+ ## 六、交互与选中(`interaction/select.ts`)
389
510
 
390
511
  ### `createSelectByLayer(vectorLayer)`
391
512
 
@@ -407,12 +528,12 @@ function activeFeatureByUid(uid: string): void
407
528
 
408
529
  ```ts
409
530
  function resetActiveFeature(): void // 清空 overlay + 触发各矢量图层 deselect
410
- function resetActiveVector(): void // 清空 overlay + 清空各图层选择交互的要素集合
531
+ function resetActiveVector(): void // 清空 overlay + 清空各图层选择交互的要素集合
411
532
  ```
412
533
 
413
534
  ---
414
535
 
415
- ## 七、覆盖物与视野(`layer-utils.ts`)
536
+ ## 七、覆盖物与视野(`overlay/overlay.ts`、`map/view-fit.ts`)
416
537
 
417
538
  ### `createOverlay(config?)`
418
539
 
@@ -427,7 +548,7 @@ function createOverlay(config?: import('ol/Overlay').Options): Overlay
427
548
 
428
549
  ```ts
429
550
  function removeOverlays(key?: string): void // 移除带指定属性键的 overlay(默认按 'position')
430
- function removeAllLayers(): void // 移除并释放所有非底图(无 _isBaseLayer)图层 + overlay
551
+ function removeAllLayers(): void // 移除并释放所有非底图(无 _isBaseLayer)图层 + overlay
431
552
  ```
432
553
 
433
554
  ### `createAnimationMarker(imgUrl, data)`
@@ -445,7 +566,7 @@ function setFitViewByCoords(
445
566
  coords: Coordinate[],
446
567
  mapInstance?: CustomMap,
447
568
  fitOptions?: FitOptions | AnimationOptions
448
- ): void // 单点时 animate 到 zoom 14,多点时 fit 包围盒
569
+ ): void // 单点时 animate 到 zoom 14,多点时 fit 包围盒
449
570
 
450
571
  function setFitViewByGeom(
451
572
  geom: SimpleGeometry,
@@ -457,13 +578,16 @@ function setFitViewByLayer(
457
578
  layer: VectorLayer,
458
579
  mapInstance?: CustomMap,
459
580
  fitOptions?: FitOptions
460
- ): void // 按图层 source 的 extent 自适应
581
+ ): void // 按图层 source 的 extent 自适应
461
582
  ```
462
583
 
463
584
  三者默认 `padding: [50,50,50,50]`、`duration: 1000`,可由 `fitOptions` 覆盖。
464
585
 
465
586
  ```ts
466
- setFitViewByCoords([[120.1, 30.2], [120.3, 30.4]])
587
+ setFitViewByCoords([
588
+ [120.1, 30.2],
589
+ [120.3, 30.4]
590
+ ])
467
591
  setFitViewByLayer(layer, undefined, { duration: 500 })
468
592
  ```
469
593
 
@@ -477,7 +601,7 @@ function getLayersDataList(): any[]
477
601
 
478
602
  ---
479
603
 
480
- ## 八、WMTS(`ogc-utils.ts`)
604
+ ## 八、WMTS(`layer/ogc-utils.ts`)
481
605
 
482
606
  ### `createWmtsLayer(serverUrl)`
483
607
 
@@ -489,11 +613,11 @@ function createWmtsLayer(
489
613
  ): (config: WmtsSourceOptions) => Promise<TileLayer>
490
614
 
491
615
  type WmtsSourceOptions = {
492
- layerName: string // 形如 'workspace:datastore'
616
+ layerName: string // 形如 'workspace:datastore'
493
617
  style?: string
494
- format?: string // 默认 'image/png'
495
- version?: string // 默认 '1.1.0'
496
- matrixSet?: string // 默认 'EPSG:4326'
618
+ format?: string // 默认 'image/png'
619
+ version?: string // 默认 '1.1.0'
620
+ matrixSet?: string // 默认 'EPSG:4326'
497
621
  }
498
622
  ```
499
623
 
@@ -512,13 +636,67 @@ import { emitter } from 'map-ol-utils' // mitt 实例
512
636
  ```
513
637
 
514
638
  | 事件名 | 载荷 | 触发时机 |
515
- |---|---|---|
639
+ | --- | --- | --- |
516
640
  | `selected-feature` | 要素属性对象 | 要素被选中(`createSelectByLayer` 内触发) |
517
641
  | `dynamic-marker` | 动画标注配置 | 选中动态图层(`_isDynamic`)要素 1s 后 |
518
642
 
519
643
  ---
520
644
 
521
- ## 十、类型定义(`types.ts`,`export * from './types'`)
645
+ ## 十、扩展能力
646
+
647
+ 以下 API 补充天地图组合、Marker、绘制与 GeoJSON 等能力;`createMapInstance`、`createOverlay`、`disposeMap` 等既有 API 的签名、默认值和行为保持不变。`disposeInstance()` 直接复用 `disposeMap()` 的完整清理语义。
648
+
649
+ ### 天地图组合与栅格处理
650
+
651
+ ```ts
652
+ const { baseImgLayer, baseCiaLayer, baseVecLayer, baseCvaLayer } =
653
+ baseLayers('你的天地图令牌')
654
+
655
+ const recoloredLayer = changeLayer(
656
+ baseImgLayer,
657
+ [255, 255, 255],
658
+ [0.05, 0.55, 0.05]
659
+ )
660
+ ```
661
+
662
+ - `baseLayers(tk)`:创建影像、影像注记、矢量、矢量注记四个 XYZ 图层。
663
+ - `changeSource(layer, rgbColorArray, ratioArray, options?)`:创建栅格颜色转换 Source;`options.threads` 可指定线程数。
664
+ - `changeLayer(layer, rgbColorArray, ratioArray, options?)`:把转换 Source 包装为 `VectorImageLayer`;支持相同的线程配置。
665
+
666
+ `options` 类型为 `{ threads?: number }`。未指定时使用浏览器硬件并发数与 4 的较小值(无法读取时为 2),且至少使用 1 个线程。
667
+
668
+ ### Marker 与选择
669
+
670
+ ```ts
671
+ const markerLayer = createMarkersLayer(markerData, {
672
+ layerName: 'device-layer',
673
+ zIndex: 10
674
+ })
675
+ map.addLayer(markerLayer)
676
+
677
+ const select = createLayerSelectByNames(['device-layer'], handleSelected)
678
+ map.addInteraction(select)
679
+ ```
680
+
681
+ - `createText(item)` / `createIconStyle(item, active?)`:创建 Marker 文本和图标样式。
682
+ - `createMarker(item, config)` / `createMarkersLayer(dataList, config)`:创建单个 Marker 或 Marker 图层。
683
+ - `createElasticMarkerLayer(dataList, config)`:按缩放级别切换 `img`、`smallImg`、`largeImg`。
684
+ - `changeUnselectStyle(featureCollection)`:清空选择集合并恢复未选中样式。
685
+ - `createLayerSelectByNames(layerNames, selectedHandler?, unSelectHandler?)`:按多个图层名选择 Marker。
686
+ - `createMoveMarkerLayer(dataItem, config)`:创建单 Marker 图层并加入当前地图。
687
+
688
+ ### 绘制、GeoJSON 与视野
689
+
690
+ - `createDrawInteraction(type, vectorLayer, openTip?)`:创建 Draw interaction。
691
+ - `getDrawStyle(feature, drawStyle?)`:为线和面绘制追加长度/面积标签。
692
+ - `createGeoJsonLayer(geoJson, style, config?)`:直接从 GeoJSON 创建矢量图层。
693
+ - `flyToAnimate(center, zoom?)`:使用两段缩放动画飞到目标点。
694
+
695
+ 相关类型包括 `LayerConfig`、`DataItemConfig`、`ElasticDataItemConfig`。
696
+
697
+ ---
698
+
699
+ ## 十一、类型定义(`core/types.ts`,`export * from './core/types'`)
522
700
 
523
701
  ```ts
524
702
  interface CustomMap extends OlMap {
@@ -562,7 +740,7 @@ enum GeometryType {
562
740
  ## 构建
563
741
 
564
742
  ```bash
565
- pnpm --dir packages/map-utils build # tsup 产出 esm + cjs + d.ts
743
+ pnpm --dir packages/map-utils build # tsdown 产出 esm + cjs + d.ts
566
744
  pnpm --dir packages/map-utils dev # watch 模式
567
745
  ```
568
746