map-ol-utils 0.1.30 → 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 +223 -45
- package/dist/index.cjs +1907 -1120
- package/dist/index.d.cts +475 -134
- package/dist/index.d.mts +661 -0
- package/dist/index.mjs +1830 -0
- package/dist/tdt-vts/decoder.worker.cjs +46 -0
- package/dist/tdt-vts/decoder.worker.d.cts +1 -0
- package/dist/tdt-vts/decoder.worker.d.mts +1 -0
- package/dist/tdt-vts/decoder.worker.mjs +47 -0
- package/dist/tile-loader-CtZwCurI.mjs +630 -0
- package/dist/tile-loader-D4cn6nMU.cjs +683 -0
- package/package.json +20 -12
- package/dist/index.d.ts +0 -320
- package/dist/index.js +0 -1096
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**(要求
|
|
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(
|
|
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-
|
|
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(
|
|
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',
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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(
|
|
250
|
-
|
|
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-
|
|
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(
|
|
286
|
-
|
|
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(
|
|
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
|
-
): (
|
|
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, {
|
|
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-
|
|
467
|
+
## 五、聚合图层(`layer/cluster-layer.ts`)
|
|
352
468
|
|
|
353
469
|
### `createClusterLayer(dataList, config)`
|
|
354
470
|
|
|
355
471
|
```ts
|
|
356
|
-
function createClusterLayer(
|
|
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,
|
|
381
|
-
|
|
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
|
-
## 六、交互与选中(`
|
|
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
|
|
531
|
+
function resetActiveVector(): void // 清空 overlay + 清空各图层选择交互的要素集合
|
|
411
532
|
```
|
|
412
533
|
|
|
413
534
|
---
|
|
414
535
|
|
|
415
|
-
## 七、覆盖物与视野(`
|
|
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
|
|
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
|
|
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
|
|
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([
|
|
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
|
|
616
|
+
layerName: string // 形如 'workspace:datastore'
|
|
493
617
|
style?: string
|
|
494
|
-
format?: string
|
|
495
|
-
version?: string
|
|
496
|
-
matrixSet?: string
|
|
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
|
-
##
|
|
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 #
|
|
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
|
|