tds-map-methods 0.1.1 → 0.1.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/README.md +655 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,31 +1,675 @@
|
|
|
1
1
|
# tds-map-methods
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
面向浏览器应用的 TDS / OpenLayers 地图渲染工具包,提供气象栅格、等值线、风场、WMS、台风路径和 TDS 数据请求能力。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 功能特性
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- 初始化 OpenLayers 地图并统一管理业务图层
|
|
8
|
+
- 支持色斑图、网格值、等值线、风场、风羽、WMS、MICAPS 和台风路径
|
|
9
|
+
- 支持图层加载、更新、显隐、移除和经纬度取值
|
|
10
|
+
- 内置 TDS 目录、NCSS、XML、图片及台风数据请求方法
|
|
11
|
+
- 提供 ESM、CommonJS 和完整 TypeScript 类型声明
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
~~~bash
|
|
8
16
|
npm install tds-map-methods ol @turf/turf dayjs d3-contour lodash-es
|
|
9
|
-
|
|
17
|
+
~~~
|
|
18
|
+
|
|
19
|
+
也可以使用 pnpm:
|
|
20
|
+
|
|
21
|
+
~~~bash
|
|
22
|
+
pnpm add tds-map-methods ol @turf/turf dayjs d3-contour lodash-es
|
|
23
|
+
~~~
|
|
24
|
+
|
|
25
|
+
## 必要引入
|
|
26
|
+
|
|
27
|
+
在宿主项目的入口文件中引入 OpenLayers 样式。npm 包不会自动注入全局 CSS:
|
|
28
|
+
|
|
29
|
+
~~~ts
|
|
30
|
+
import "ol/ol.css";
|
|
31
|
+
~~~
|
|
32
|
+
|
|
33
|
+
然后根据实际功能从包中引入方法。初始化地图至少需要引入 `initMap`;如需设置服务地址,同时引入 `configureMapMethods`:
|
|
34
|
+
|
|
35
|
+
~~~ts
|
|
36
|
+
import { configureMapMethods, initMap } from "tds-map-methods";
|
|
37
|
+
~~~
|
|
38
|
+
|
|
39
|
+
加载和管理业务图层时,通常需要以下方法:
|
|
40
|
+
|
|
41
|
+
~~~ts
|
|
42
|
+
import {
|
|
43
|
+
clearAllLayers,
|
|
44
|
+
getValueByLonLat,
|
|
45
|
+
initMap,
|
|
46
|
+
loadLayer,
|
|
47
|
+
removeLayerById,
|
|
48
|
+
toggleVisibleById,
|
|
49
|
+
updateLayer,
|
|
50
|
+
} from "tds-map-methods";
|
|
51
|
+
~~~
|
|
52
|
+
|
|
53
|
+
如果使用 TypeScript,可以按需引入 OpenLayers 的地图类型:
|
|
54
|
+
|
|
55
|
+
~~~ts
|
|
56
|
+
import type { Map } from "ol";
|
|
57
|
+
~~~
|
|
58
|
+
|
|
59
|
+
注意:`ol`、`@turf/turf`、`dayjs`、`d3-contour` 和 `lodash-es` 是 peer dependencies,必须安装在宿主项目中,但通常不需要在业务文件中手动逐个 `import`。
|
|
60
|
+
|
|
61
|
+
## 快速开始
|
|
10
62
|
|
|
11
|
-
|
|
63
|
+
页面中需要准备一个具有明确宽高的地图容器:
|
|
12
64
|
|
|
13
|
-
|
|
65
|
+
~~~html
|
|
66
|
+
<div id="map" style="width: 100%; height: 600px"></div>
|
|
67
|
+
~~~
|
|
68
|
+
|
|
69
|
+
初始化配置并创建地图:
|
|
70
|
+
|
|
71
|
+
~~~ts
|
|
14
72
|
import { configureMapMethods, initMap, loadLayer } from "tds-map-methods";
|
|
15
73
|
|
|
16
74
|
configureMapMethods({
|
|
17
75
|
serviceBaseUrl: "/server",
|
|
18
76
|
serviceAuthorization: "Basic ...",
|
|
19
77
|
ncssBaseUrl: "/ncss/grid",
|
|
78
|
+
requestTimeout: 60_000,
|
|
20
79
|
imageSize: 2048,
|
|
21
80
|
typhoonServiceBaseUrl: "/typhoon-server",
|
|
22
81
|
});
|
|
23
82
|
|
|
24
|
-
const map = await initMap("map", {
|
|
83
|
+
const map = await initMap("map", {
|
|
84
|
+
center: [118.8, 32.1],
|
|
85
|
+
zoom: 5,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
loadLayer(map, {
|
|
89
|
+
id: "temperature",
|
|
90
|
+
title: "温度",
|
|
91
|
+
label: "Temperature",
|
|
92
|
+
type: "gradual",
|
|
93
|
+
filePath: "/data/temperature.nc",
|
|
94
|
+
show: true,
|
|
95
|
+
config: {
|
|
96
|
+
extent: [70, 15, 140, 55],
|
|
97
|
+
mode: "gradient",
|
|
98
|
+
legendType: "gradual",
|
|
99
|
+
legend: [
|
|
100
|
+
{ name: "低温", scope: [-40, 0], color: "#3b82f6" },
|
|
101
|
+
{ name: "适中", scope: [0, 25], color: "#22c55e" },
|
|
102
|
+
{ name: "高温", scope: [25, 50], color: "#ef4444" },
|
|
103
|
+
],
|
|
104
|
+
opacity: 0.85,
|
|
105
|
+
zIndex: 10,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
~~~
|
|
109
|
+
|
|
110
|
+
也可以在初始化地图时传入运行配置:
|
|
111
|
+
|
|
112
|
+
~~~ts
|
|
113
|
+
const map = await initMap("map", {
|
|
114
|
+
center: [118.8, 32.1],
|
|
115
|
+
zoom: 5,
|
|
116
|
+
mapMethodsConfig: {
|
|
117
|
+
serviceBaseUrl: "/server",
|
|
118
|
+
ncssBaseUrl: "/ncss/grid",
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
~~~
|
|
122
|
+
|
|
123
|
+
## 全局配置
|
|
124
|
+
|
|
125
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
126
|
+
| --- | --- | --- | --- |
|
|
127
|
+
| `serviceBaseUrl` | `string` | `""` | WMS 和 TDS 请求的服务前缀 |
|
|
128
|
+
| `serviceAuthorization` | `string` | `""` | TDS 请求默认 Authorization 请求头 |
|
|
129
|
+
| `ncssBaseUrl` | `string` | `"/ncss/grid"` | NCSS `dataset.xml` 请求前缀 |
|
|
130
|
+
| `requestTimeout` | `number` | `60000` | 请求超时时间,单位毫秒 |
|
|
131
|
+
| `imageSize` | `number` | `2048` | 源图片请求的最大宽高 |
|
|
132
|
+
| `typhoonServiceBaseUrl` | `string` | `serviceBaseUrl` | 台风 JSON 服务前缀 |
|
|
133
|
+
| `typhoonDataPath` | `string` | `data/script/mdp_typhoon/output` | 台风数据目录 |
|
|
134
|
+
| `typhoonAuthorization` | `string` | `""` | 台风请求 Authorization 请求头 |
|
|
135
|
+
|
|
136
|
+
配置相关方法:
|
|
137
|
+
|
|
138
|
+
~~~ts
|
|
139
|
+
import {
|
|
140
|
+
configureMapMethods,
|
|
141
|
+
getMapMethodsConfig,
|
|
142
|
+
resetMapMethodsConfig,
|
|
143
|
+
} from "tds-map-methods";
|
|
144
|
+
~~~
|
|
145
|
+
|
|
146
|
+
## 支持的图层类型
|
|
147
|
+
|
|
148
|
+
`loadLayer` 的 `type` 可传单个字符串或字符串数组。
|
|
149
|
+
|
|
150
|
+
| 类型 | 用途 |
|
|
151
|
+
| --- | --- |
|
|
152
|
+
| `gradual` | 栅格色斑图 |
|
|
153
|
+
| `grid` | 网格数值 |
|
|
154
|
+
| `isoline` / `contour` | 等值线或等值面 |
|
|
155
|
+
| `uv` | U/V 风场 |
|
|
156
|
+
| `windShaft` | 风羽图 |
|
|
157
|
+
| `arrow` | 箭头图层 |
|
|
158
|
+
| `micaps` | MICAPS 数据图层 |
|
|
159
|
+
| `wms` | WMS 图层 |
|
|
160
|
+
| `typhoon` | 台风路径图层 |
|
|
161
|
+
|
|
162
|
+
组合类型示例:
|
|
163
|
+
|
|
164
|
+
~~~ts
|
|
165
|
+
loadLayer(map, {
|
|
166
|
+
...layerOptions,
|
|
167
|
+
type: ["uv", "grid", "windShaft"],
|
|
168
|
+
});
|
|
169
|
+
~~~
|
|
170
|
+
|
|
171
|
+
## 图层参数配置
|
|
172
|
+
|
|
173
|
+
<code>loadLayer</code> 的第二个参数是 <code>Layer.Config</code>。建议先配置公共字段,再根据图层类型补充 <code>config</code> 下的专用字段。
|
|
174
|
+
|
|
175
|
+
### 顶层参数
|
|
176
|
+
|
|
177
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
178
|
+
| --- | --- | --- | --- |
|
|
179
|
+
| <code>id</code> | <code>string</code> | 是 | 图层唯一标识;更新、显隐和删除都依赖它 |
|
|
180
|
+
| <code>title</code> | <code>string</code> | 是 | 图层标题,供业务菜单或图例使用 |
|
|
181
|
+
| <code>label</code> | <code>string</code> | 是 | 图层显示标签 |
|
|
182
|
+
| <code>type</code> | <code>LegendType</code> 或数组 | 是 | <code>gradual</code>、<code>grid</code>、<code>isoline</code>、<code>uv</code>、<code>wms</code> 等 |
|
|
183
|
+
| <code>filePath</code> | <code>string</code> | 是 | TDS 数据目录或文件路径 |
|
|
184
|
+
| <code>fallbackFilePath</code> | <code>string</code> | 否 | 主目录不可用时使用的备用目录 |
|
|
185
|
+
| <code>url</code> | <code>string</code> | 否 | 直接数据地址或已经解析出的数据集 URL |
|
|
186
|
+
| <code>serviceBaseUrl</code> | <code>string</code> | 否 | 仅覆盖当前图层的全局服务前缀 |
|
|
187
|
+
| <code>show</code> | <code>boolean</code> | 否 | 初始是否显示,默认显示 |
|
|
188
|
+
| <code>icon</code> | <code>string</code> | 否 | 业务菜单图标名称 |
|
|
189
|
+
| <code>fileListType</code> | <code>file</code> 或 <code>menu</code> | 否 | 目录节点类型 |
|
|
190
|
+
| <code>unit</code> | <code>string</code> | 否 | 数据单位 |
|
|
191
|
+
| <code>authorization</code> | <code>string</code> | 否 | 当前图层请求使用的 Authorization |
|
|
192
|
+
| <code>fallbackAuthorization</code> | <code>string</code> | 否 | 备用目录请求使用的 Authorization |
|
|
193
|
+
| <code>time</code> | <code>string</code> 或 <code>Dayjs</code> | 否 | 请求的数据时次 |
|
|
194
|
+
| <code>config</code> | <code>object</code> | 是 | 范围、图例、渲染模式和类型专用配置 |
|
|
195
|
+
|
|
196
|
+
<code>serviceBaseUrl</code> 和 <code>authorization</code> 的优先级通常是:图层字段或本次请求参数 → 全局 <code>configureMapMethods</code> 配置 → 默认值。
|
|
197
|
+
|
|
198
|
+
### config 通用参数
|
|
199
|
+
|
|
200
|
+
| 参数 | 类型 | 说明 |
|
|
201
|
+
| --- | --- | --- |
|
|
202
|
+
| <code>extent</code> | <code>[west, south, east, north]</code> | 数据经纬度范围,使用 EPSG:4326 顺序 |
|
|
203
|
+
| <code>mode</code> | <code>discrete</code>、<code>gradient</code>、<code>grid</code> | 离散色带、渐变色带或网格模式 |
|
|
204
|
+
| <code>legend</code> | <code>LegendItem[]</code> | 色带配置;每项包含 <code>name</code>、<code>scope</code> 和 <code>color</code> |
|
|
205
|
+
| <code>legendType</code> | <code>visible</code>、<code>legend</code>、<code>grid</code>、<code>gradual</code> | 图例显示方式 |
|
|
206
|
+
| <code>legendScope</code> | <code>[]</code> 或 <code>[start, end]</code> | 按图例下标选择范围,采用左闭右开区间;空数组表示不限制 |
|
|
207
|
+
| <code>scope</code> | <code>[min, max]</code> | 数据值域;不设置时通常从 TDS 自动获取 |
|
|
208
|
+
| <code>zIndex</code> | <code>number</code> | 图层层级,值越大越靠上 |
|
|
209
|
+
| <code>opacity</code> | <code>number</code> | 透明度,范围 0 到 1 |
|
|
210
|
+
| <code>lineWidth</code> | <code>number</code> | 等值线宽度 |
|
|
211
|
+
| <code>isolineLineWidth</code> | <code>number</code> | 等值线宽度,优先于 <code>lineWidth</code> |
|
|
212
|
+
| <code>isolineSmooth</code> | <code>boolean</code> | 是否平滑等值线,默认开启 |
|
|
213
|
+
| <code>isolineSmoothness</code> | <code>number</code> | 平滑级别;0 关闭,1 到 3 逐级增强 |
|
|
214
|
+
| <code>alignWithIsoline</code> | <code>boolean</code> | 色斑图是否复用等值线的平滑数值场和边界 |
|
|
215
|
+
| <code>isolineColor</code> | <code>string</code> 或 <code>boolean</code> | 等值线颜色;<code>true</code> 表示跟随图例 |
|
|
216
|
+
| <code>isolineBorderColor</code> | <code>string</code> | 等值面边界颜色 |
|
|
217
|
+
| <code>isolineFill</code> | <code>boolean</code> | 是否绘制分级等值面 |
|
|
218
|
+
| <code>showIsolineValue</code> | <code>boolean</code> | 是否沿等值线显示数值 |
|
|
219
|
+
| <code>showText</code> | <code>boolean</code> | MICAPS 是否显示文本 |
|
|
220
|
+
| <code>showFillcolor</code> | <code>boolean</code> | MICAPS 是否填色 |
|
|
221
|
+
| <code>showIsoline</code> | <code>boolean</code> | MICAPS 是否显示等值线 |
|
|
222
|
+
| <code>showPointMarkers</code> | <code>boolean</code> | MICAPS 是否显示符号点 |
|
|
223
|
+
| <code>smooth</code> | <code>boolean</code> | 是否平滑掩膜边缘 |
|
|
224
|
+
| <code>smoothIterations</code> | <code>number</code> | Chaikin 平滑迭代次数,建议 1 到 3 |
|
|
225
|
+
| <code>valueTransform</code> | 函数或字符串 | 绘制和查询前转换栅格值;返回空值表示无效像素 |
|
|
226
|
+
| <code>valueTransformAffectsScope</code> | <code>boolean</code> | 转换结果是否参与 <code>scope</code> 过滤,默认参与 |
|
|
227
|
+
| <code>cache</code> | <code>boolean</code> | 旧版缓存开关,当前版本不建议依赖 |
|
|
228
|
+
| <code>layerConfig</code> | <code>object</code> | TDS/WMS 原始请求参数 |
|
|
229
|
+
| <code>gridConfig</code> | <code>object</code> | 网格数值绘制配置 |
|
|
230
|
+
| <code>windConfig</code> | <code>object</code> | 风场预留扩展配置;当前版本主要使用通用字段和 <code>layerConfig</code> |
|
|
231
|
+
| <code>windShaftConfig</code> | <code>object</code> | 风羽绘制配置 |
|
|
232
|
+
| <code>typhoonConfig</code> | <code>object</code> | 台风路径配置 |
|
|
233
|
+
|
|
234
|
+
图例项格式:
|
|
235
|
+
|
|
236
|
+
~~~ts
|
|
237
|
+
const legend = [
|
|
238
|
+
{ name: "0-10", scope: [0, 10], color: "#3b82f6" },
|
|
239
|
+
{ name: "10-20", scope: [10, 20], color: "#22c55e" },
|
|
240
|
+
{ name: "20+", scope: [20, 9999], color: "#ef4444" },
|
|
241
|
+
];
|
|
242
|
+
~~~
|
|
243
|
+
|
|
244
|
+
完整配置示例:
|
|
245
|
+
|
|
246
|
+
~~~ts
|
|
247
|
+
const layerOptions: Layer.Config = {
|
|
248
|
+
id: "temperature",
|
|
249
|
+
title: "温度",
|
|
250
|
+
label: "Temperature",
|
|
251
|
+
type: "gradual",
|
|
252
|
+
filePath: "/data/temperature",
|
|
253
|
+
time: "2026-10-28T00:00:00Z",
|
|
254
|
+
authorization: "Basic ...",
|
|
255
|
+
config: {
|
|
256
|
+
extent: [70, 15, 140, 55],
|
|
257
|
+
mode: "gradient",
|
|
258
|
+
legendType: "gradual",
|
|
259
|
+
legendScope: [],
|
|
260
|
+
scope: [-40, 50],
|
|
261
|
+
legend,
|
|
262
|
+
opacity: 0.85,
|
|
263
|
+
zIndex: 10,
|
|
264
|
+
isolineSmooth: true,
|
|
265
|
+
isolineSmoothness: 1,
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
|
|
25
269
|
loadLayer(map, layerOptions);
|
|
26
|
-
|
|
270
|
+
~~~
|
|
271
|
+
|
|
272
|
+
### layerConfig:TDS/WMS 参数
|
|
273
|
+
|
|
274
|
+
<code>layerConfig</code> 会被合并到 WMS 或 TDS 请求中。常用字段如下:
|
|
275
|
+
|
|
276
|
+
| 参数 | 说明 |
|
|
277
|
+
| --- | --- |
|
|
278
|
+
| <code>LAYERS</code> | WMS 图层名;风场通常传 U、V 两个分量名称数组 |
|
|
279
|
+
| <code>ELEVATION</code> | 高度层或气压层 |
|
|
280
|
+
| <code>TIME</code> | 时间参数;由图层 <code>time</code> 生成时会覆盖此值 |
|
|
281
|
+
| <code>BBOX</code> | 请求范围,由 <code>extent</code> 自动生成 |
|
|
282
|
+
| <code>WIDTH</code>、<code>HEIGHT</code> | 图片尺寸,由 <code>imageSize</code> 和范围自动计算 |
|
|
283
|
+
| <code>STYLES</code> | WMS 样式名 |
|
|
284
|
+
| <code>COLORSCALERANGE</code> | 色带范围,通常由 <code>scope</code> 自动生成 |
|
|
285
|
+
| <code>NUMCOLORBANDS</code> | 色带级数 |
|
|
286
|
+
| <code>ABOVEMAXCOLOR</code>、<code>BELOWMINCOLOR</code>、<code>BGCOLOR</code> | 超出范围和背景颜色策略 |
|
|
287
|
+
| <code>LOGSCALE</code> | 是否使用对数色阶 |
|
|
288
|
+
| <code>SERVICE</code>、<code>VERSION</code>、<code>REQUEST</code>、<code>FORMAT</code>、<code>SRS</code> | 标准 WMS 参数 |
|
|
289
|
+
| <code>TINTCOLOR</code> | 将 WMS 图片统一着色的特殊参数 |
|
|
290
|
+
|
|
291
|
+
业务传入的 <code>BBOX</code>、<code>TIME</code>、<code>WIDTH</code>、<code>HEIGHT</code> 和 <code>COLORSCALERANGE</code> 可能被包重新计算。需要改变这些值时,应优先调整 <code>extent</code>、<code>time</code>、<code>scope</code> 和全局 <code>imageSize</code>。
|
|
292
|
+
|
|
293
|
+
WMS 图层示例:
|
|
294
|
+
|
|
295
|
+
~~~ts
|
|
296
|
+
loadLayer(map, {
|
|
297
|
+
id: "temperature-wms",
|
|
298
|
+
title: "温度 WMS",
|
|
299
|
+
label: "Temperature",
|
|
300
|
+
type: "wms",
|
|
301
|
+
filePath: "/data/temperature.nc",
|
|
302
|
+
url: "/wms/data/temperature.nc",
|
|
303
|
+
serviceBaseUrl: "/server",
|
|
304
|
+
config: {
|
|
305
|
+
extent: [70, 15, 140, 55],
|
|
306
|
+
mode: "gradient",
|
|
307
|
+
legendType: "gradual",
|
|
308
|
+
legend,
|
|
309
|
+
opacity: 0.8,
|
|
310
|
+
layerConfig: {
|
|
311
|
+
LAYERS: "Temperature",
|
|
312
|
+
STYLES: "default-scalar/seq-Rainbow",
|
|
313
|
+
COLORSCALERANGE: "-40,50",
|
|
314
|
+
NUMCOLORBANDS: 250,
|
|
315
|
+
TRANSPARENT: true,
|
|
316
|
+
FORMAT: "image/png",
|
|
317
|
+
VERSION: "1.1.1",
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
~~~
|
|
322
|
+
|
|
323
|
+
### gridConfig:网格数值
|
|
324
|
+
|
|
325
|
+
| 参数 | 默认值 | 说明 |
|
|
326
|
+
| --- | --- | --- |
|
|
327
|
+
| <code>pixelStep</code> | 40 | 网格文字像素间距,最小 8 |
|
|
328
|
+
| <code>fontSize</code> | 14 | 文字大小,单位 px,最小 10 |
|
|
329
|
+
| <code>decimals</code> | 1 | 小数位数 |
|
|
330
|
+
| <code>fontColor</code> | #000 | 文字颜色 |
|
|
331
|
+
| <code>strokeColor</code> | #fff | 文字描边颜色 |
|
|
332
|
+
| <code>strokeWidth</code> | 2 | 描边宽度 |
|
|
333
|
+
| <code>fontFamily</code> | Arial, sans-serif | 字体 |
|
|
334
|
+
| <code>useDevicePixelRatio</code> | false | 是否按设备像素比绘制 |
|
|
335
|
+
|
|
336
|
+
~~~ts
|
|
337
|
+
loadLayer(map, {
|
|
338
|
+
...layerOptions,
|
|
339
|
+
type: ["gradual", "grid"],
|
|
340
|
+
config: {
|
|
341
|
+
...layerOptions.config,
|
|
342
|
+
gridConfig: {
|
|
343
|
+
pixelStep: 40,
|
|
344
|
+
fontSize: 14,
|
|
345
|
+
decimals: 1,
|
|
346
|
+
fontColor: "#111827",
|
|
347
|
+
strokeColor: "#ffffff",
|
|
348
|
+
strokeWidth: 2,
|
|
349
|
+
fontFamily: "Arial, sans-serif",
|
|
350
|
+
useDevicePixelRatio: true,
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
});
|
|
354
|
+
~~~
|
|
355
|
+
|
|
356
|
+
### windShaftConfig:风羽
|
|
357
|
+
|
|
358
|
+
| 参数 | 默认值 | 说明 |
|
|
359
|
+
| --- | --- | --- |
|
|
360
|
+
| <code>pixelStep</code> | 40 | 风羽采样像素步长,最小 8 |
|
|
361
|
+
| <code>fontSize</code> | 26 | 风羽尺寸,最小 10 |
|
|
362
|
+
| <code>color</code> | rgb(255,255,255) | 风羽颜色 |
|
|
363
|
+
| <code>minWindSpeed</code> | 0.01 | 过滤低于该值的风速 |
|
|
364
|
+
| <code>speedLevelStep</code> | 2 | 风速分级步长 |
|
|
365
|
+
| <code>maxLevel</code> | 30 | 风速级别上限 |
|
|
366
|
+
| <code>spriteCellSize</code> | 32 | 风羽雪碧图单格尺寸 |
|
|
367
|
+
| <code>baseFontSize</code> | 32 | 图标缩放基准字号 |
|
|
368
|
+
| <code>iconYOffsetRatio</code> | 0.7 | 图标 Y 轴偏移比例 |
|
|
369
|
+
| <code>firstRowMaxLevel</code> | 3 | 雪碧图第一行最大等级 |
|
|
370
|
+
| <code>firstRowStartX</code> | 28 | 雪碧图第一行起始 X 坐标 |
|
|
371
|
+
| <code>firstRowY</code> | 4 | 雪碧图第一行 Y 坐标 |
|
|
372
|
+
| <code>secondRowOffsetX</code> | 4 | 雪碧图第二行 X 偏移 |
|
|
373
|
+
| <code>secondRowY</code> | 5 | 雪碧图第二行 Y 坐标 |
|
|
374
|
+
|
|
375
|
+
风场和风羽通常组合使用:
|
|
376
|
+
|
|
377
|
+
~~~ts
|
|
378
|
+
loadLayer(map, {
|
|
379
|
+
id: "wind",
|
|
380
|
+
title: "10 米风场",
|
|
381
|
+
label: "Wind",
|
|
382
|
+
type: ["uv", "grid", "windShaft"],
|
|
383
|
+
filePath: "/data/wind",
|
|
384
|
+
config: {
|
|
385
|
+
extent: [70, 15, 140, 55],
|
|
386
|
+
mode: "gradient",
|
|
387
|
+
legendType: "gradual",
|
|
388
|
+
legend: windLegend,
|
|
389
|
+
scope: [0, 60],
|
|
390
|
+
layerConfig: {
|
|
391
|
+
LAYERS: [
|
|
392
|
+
"u-component_of_wind_height_above_ground",
|
|
393
|
+
"v-component_of_wind_height_above_ground",
|
|
394
|
+
],
|
|
395
|
+
},
|
|
396
|
+
windShaftConfig: {
|
|
397
|
+
pixelStep: 20,
|
|
398
|
+
fontSize: 18,
|
|
399
|
+
color: "rgb(255,255,255)",
|
|
400
|
+
minWindSpeed: 0.01,
|
|
401
|
+
speedLevelStep: 2,
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
});
|
|
405
|
+
~~~
|
|
406
|
+
|
|
407
|
+
### typhoonConfig:台风路径
|
|
408
|
+
|
|
409
|
+
| 参数 | 说明 |
|
|
410
|
+
| --- | --- |
|
|
411
|
+
| <code>serviceBaseUrl</code> | 台风 JSON 服务前缀,覆盖全局台风服务地址 |
|
|
412
|
+
| <code>dataPath</code> | TDS fileServer 下的台风 JSON 目录 |
|
|
413
|
+
| <code>typhoonNums</code> | 只加载指定台风编号;不传则使用列表中的默认台风 |
|
|
414
|
+
| <code>sourcePriority</code> | 实况和预报来源优先级 |
|
|
415
|
+
| <code>showForecast</code> | 是否显示预报路径 |
|
|
416
|
+
| <code>fitToExtent</code> | 加载后是否自动缩放到路径范围,默认开启 |
|
|
417
|
+
|
|
418
|
+
~~~ts
|
|
419
|
+
loadLayer(map, {
|
|
420
|
+
id: "typhoon",
|
|
421
|
+
title: "台风路径",
|
|
422
|
+
label: "Typhoon",
|
|
423
|
+
type: "typhoon",
|
|
424
|
+
filePath: "data/script/mdp_typhoon/output",
|
|
425
|
+
authorization: "Basic ...",
|
|
426
|
+
config: {
|
|
427
|
+
extent: [100, 5, 180, 50],
|
|
428
|
+
mode: "gradient",
|
|
429
|
+
legendType: "legend",
|
|
430
|
+
legend: typhoonLegend,
|
|
431
|
+
typhoonConfig: {
|
|
432
|
+
dataPath: "data/script/mdp_typhoon/output",
|
|
433
|
+
typhoonNums: ["2415"],
|
|
434
|
+
sourcePriority: ["BABJ|WTPQ20", "RJTD|WTPQ51"],
|
|
435
|
+
showForecast: true,
|
|
436
|
+
fitToExtent: true,
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
});
|
|
440
|
+
~~~
|
|
441
|
+
|
|
442
|
+
### 参数更新规则
|
|
443
|
+
|
|
444
|
+
<code>updateLayer</code> 会按 <code>id</code> 更新通过 <code>loadLayer</code> 管理的相关图层;如果同时创建了关联的 <code>grid</code> 或 <code>windShaft</code> 图层,也会同步更新。直接使用 <code>createIsoline</code> 或 <code>createMicContour</code> 创建的底层图层,应使用对应的删除和显隐方法管理。
|
|
445
|
+
|
|
446
|
+
## 图层管理
|
|
447
|
+
|
|
448
|
+
~~~ts
|
|
449
|
+
import {
|
|
450
|
+
clearAllLayers,
|
|
451
|
+
getLoadedLayerOptions,
|
|
452
|
+
getValueByLonLat,
|
|
453
|
+
removeLayerById,
|
|
454
|
+
toggleVisibleById,
|
|
455
|
+
updateLayer,
|
|
456
|
+
updateWmsLayerColor,
|
|
457
|
+
} from "tds-map-methods";
|
|
458
|
+
|
|
459
|
+
toggleVisibleById("temperature", false);
|
|
460
|
+
|
|
461
|
+
const currentLayer = getLoadedLayerOptions().find(
|
|
462
|
+
(item) => item.id === "temperature",
|
|
463
|
+
);
|
|
464
|
+
if (currentLayer) {
|
|
465
|
+
updateLayer({ ...currentLayer, time: "2026-10-27T00:00:00Z" });
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
const value = await getValueByLonLat(map, "temperature", 118.8, 32.1);
|
|
469
|
+
console.log(value);
|
|
470
|
+
|
|
471
|
+
removeLayerById("temperature");
|
|
472
|
+
clearAllLayers();
|
|
473
|
+
~~~
|
|
474
|
+
|
|
475
|
+
常用图层方法:
|
|
476
|
+
|
|
477
|
+
| 方法 | 说明 |
|
|
478
|
+
| --- | --- |
|
|
479
|
+
| `loadLayer(map, options)` | 加载业务图层 |
|
|
480
|
+
| `updateLayer(options)` | 使用相同 `id` 更新图层参数 |
|
|
481
|
+
| `toggleVisibleById(id, visible)` | 控制业务图层显隐 |
|
|
482
|
+
| `removeLayerById(id)` | 删除指定业务图层 |
|
|
483
|
+
| `clearAllLayers()` | 清空全部业务图层 |
|
|
484
|
+
| `getLoadedLayerOptions()` | 获取已加载图层的配置 |
|
|
485
|
+
| `getValueByLonLat(map, id, lon, lat, smooth?)` | 查询指定经纬度的栅格值 |
|
|
486
|
+
| `updateWmsLayerColor(id, options)` | 更新 WMS 色带参数 |
|
|
487
|
+
|
|
488
|
+
## 绘制方法说明
|
|
489
|
+
|
|
490
|
+
### 推荐方式:通过 `loadLayer` 绘制
|
|
491
|
+
|
|
492
|
+
业务项目优先使用 `loadLayer(map, options)`。它会根据 `options.type` 自动选择对应绘制实现,并将图层加入统一管理列表,使 `updateLayer`、`removeLayerById` 和 `toggleVisibleById` 可以正常工作。
|
|
493
|
+
|
|
494
|
+
~~~ts
|
|
495
|
+
loadLayer(map, {
|
|
496
|
+
id: "temperature",
|
|
497
|
+
title: "温度",
|
|
498
|
+
label: "Temperature",
|
|
499
|
+
type: "isoline",
|
|
500
|
+
filePath: "/data/temperature.nc",
|
|
501
|
+
config: {
|
|
502
|
+
extent: [70, 15, 140, 55],
|
|
503
|
+
mode: "discrete",
|
|
504
|
+
legendType: "legend",
|
|
505
|
+
legend: [
|
|
506
|
+
{ name: "0℃", scope: [0], color: "#3b82f6" },
|
|
507
|
+
{ name: "10℃", scope: [10], color: "#22c55e" },
|
|
508
|
+
{ name: "20℃", scope: [20], color: "#ef4444" },
|
|
509
|
+
],
|
|
510
|
+
showIsolineValue: true,
|
|
511
|
+
isolineSmoothness: 1,
|
|
512
|
+
},
|
|
513
|
+
});
|
|
514
|
+
~~~
|
|
515
|
+
|
|
516
|
+
### 底层绘制方法
|
|
517
|
+
|
|
518
|
+
底层方法适合需要自行控制数据地址、缓存、预加载或中断请求的场景。直接调用底层方法创建的图层不会完整进入 `loadLayer` 的统一管理流程,应使用对应的删除方法进行清理。
|
|
519
|
+
|
|
520
|
+
| 方法 | 用途 | 必要参数与注意事项 |
|
|
521
|
+
| --- | --- | --- |
|
|
522
|
+
| `createIsoline(map, options)` | 从栅格数据生成等值线或等值面 | 必须提供 `id`、`url`、`config.legend`;支持 `authorization` 和 `AbortSignal` |
|
|
523
|
+
| `preloadIsoline(options, timeList)` | 提前生成多个时次的等值线缓存 | `timeList` 应与实际数据时次一致,适合播放动画前预加载 |
|
|
524
|
+
| `addIsolineLayer(options)` | 将已经生成的等值线 GeoJSON 加到地图 | 适用于调用方已经持有几何数据的高级场景 |
|
|
525
|
+
| `toggleIsolineLayer(map, id, visible)` | 控制底层等值线图层显隐 | `id` 必须与创建时保持一致 |
|
|
526
|
+
| `removeIsolineLayer(map, id)` | 删除底层等值线图层并使未完成请求失效 | 直接调用 `createIsoline` 时应使用此方法删除 |
|
|
527
|
+
| `createMicContour(map, options)` | 请求并解析 MICAPS 文件,绘制等值线、填色和符号 | 必须提供 `className`、`filePath`;支持授权和请求取消 |
|
|
528
|
+
| `removeMicContour(map, className)` | 删除同一 MICAPS 数据集创建的全部图层 | `className` 必须与创建时一致 |
|
|
529
|
+
| `renderFcstCanvasByWebGPU(options)` | 将二维栅格数组渲染为 `HTMLCanvasElement` | 需要宽高、原始/平滑数组、阈值和 RGBA 色表;自动按 WebGL2、WebGPU、Canvas2D 顺序降级 |
|
|
530
|
+
|
|
531
|
+
直接生成等值线示例:
|
|
532
|
+
|
|
533
|
+
~~~ts
|
|
534
|
+
import { createIsoline, removeIsolineLayer } from "tds-map-methods";
|
|
535
|
+
|
|
536
|
+
const controller = new AbortController();
|
|
537
|
+
|
|
538
|
+
await createIsoline(map, {
|
|
539
|
+
id: "temperature-isoline",
|
|
540
|
+
url: "/server/path/to/grid-image",
|
|
541
|
+
authorization: "Basic ...",
|
|
542
|
+
signal: controller.signal,
|
|
543
|
+
config: {
|
|
544
|
+
legend: [
|
|
545
|
+
{ name: "0℃", scope: [0], color: "#3b82f6" },
|
|
546
|
+
{ name: "10℃", scope: [10], color: "#22c55e" },
|
|
547
|
+
{ name: "20℃", scope: [20], color: "#ef4444" },
|
|
548
|
+
],
|
|
549
|
+
isolineSmooth: true,
|
|
550
|
+
isolineSmoothness: 1,
|
|
551
|
+
showIsolineValue: true,
|
|
552
|
+
},
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
// 取消尚未完成的请求。
|
|
556
|
+
controller.abort();
|
|
557
|
+
|
|
558
|
+
// 删除直接创建的等值线图层。
|
|
559
|
+
removeIsolineLayer(map, "temperature-isoline");
|
|
560
|
+
~~~
|
|
561
|
+
|
|
562
|
+
MICAPS 绘制示例:
|
|
563
|
+
|
|
564
|
+
~~~ts
|
|
565
|
+
import { createMicContour, removeMicContour } from "tds-map-methods";
|
|
566
|
+
|
|
567
|
+
await createMicContour(map, {
|
|
568
|
+
className: "micaps-weather",
|
|
569
|
+
filePath: "/server/path/to/micaps.txt",
|
|
570
|
+
showText: true,
|
|
571
|
+
showFillcolor: true,
|
|
572
|
+
showIsoline: true,
|
|
573
|
+
showPointMarkers: true,
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
removeMicContour(map, "micaps-weather");
|
|
577
|
+
~~~
|
|
578
|
+
|
|
579
|
+
## TDS 数据请求
|
|
580
|
+
|
|
581
|
+
包内请求方法基于浏览器 `fetch`,支持 Authorization、超时和 `AbortSignal`。
|
|
582
|
+
|
|
583
|
+
~~~ts
|
|
584
|
+
import {
|
|
585
|
+
fetchTdsGet,
|
|
586
|
+
fetchXMLFromUrl,
|
|
587
|
+
getMenuList,
|
|
588
|
+
getVariableMinMax,
|
|
589
|
+
getXmlData,
|
|
590
|
+
resolveLayerLoadOptions,
|
|
591
|
+
} from "tds-map-methods";
|
|
592
|
+
|
|
593
|
+
const menu = await getMenuList("/catalog.xml");
|
|
594
|
+
|
|
595
|
+
const dataset = await getXmlData({
|
|
596
|
+
filePath: "/data/temperature.nc",
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
const range = await getVariableMinMax(
|
|
600
|
+
"/data/temperature.nc",
|
|
601
|
+
"Temperature",
|
|
602
|
+
{ north: 55, south: 15, east: 140, west: 70 },
|
|
603
|
+
);
|
|
604
|
+
~~~
|
|
605
|
+
|
|
606
|
+
其他请求方法包括 `fetchTdsResponse`、`fetchXmlData`、`fetchTxtOrJson`、`fetchExcel`、`fetchImageBase64` 和 `fetchTdsImageBase64`。
|
|
607
|
+
|
|
608
|
+
### 接口方法说明
|
|
609
|
+
|
|
610
|
+
| 方法 | 返回值 | 主要用途 |
|
|
611
|
+
| --- | --- | --- |
|
|
612
|
+
| `fetchTdsResponse(url, options)` | `Promise<Response>` | 校验 HTTP 状态后返回原始响应,适合调用方自行读取响应内容 |
|
|
613
|
+
| `fetchTdsGet<T>(url, params, authorization, options)` | `Promise<T>` | 发起带查询参数的 GET 请求,可通过 `responseType` 指定返回类型 |
|
|
614
|
+
| `fetchXMLFromUrl(url, authorization, options)` | `Promise<string>` | 获取 XML 文本 |
|
|
615
|
+
| `fetchTxtOrJson(url, params, authorization, options)` | `Promise<string>` | 获取文本或 JSON 字符串 |
|
|
616
|
+
| `fetchExcel(url, authorization, options)` | `Promise<ArrayBuffer>` | 下载 Excel 等二进制文件 |
|
|
617
|
+
| `fetchImageBase64(...)` | `Promise<string>` | 获取图片并转换为 Base64/Data URL |
|
|
618
|
+
| `getMenuList(url, authorization, options)` | 菜单类型及目录项数组 | 读取 TDS catalog 目录 |
|
|
619
|
+
| `getXmlData(options)` | 数据范围、时次及文件列表 | 读取 NCSS `dataset.xml` 元数据 |
|
|
620
|
+
| `getVariableMinMax(...)` | `{ min, max }` | 查询指定变量、范围和时次的最小值与最大值 |
|
|
621
|
+
| `resolveLayerLoadOptions(menu, options)` | `Layer.Config \| null` | 将菜单配置补全为可传给 `loadLayer` 的图层配置 |
|
|
622
|
+
| `getTyphoonList(options)` | 台风列表 | 获取可用台风编号和基础信息 |
|
|
623
|
+
| `getTyphoonDetail(number, options)` | 台风详情 | 获取实况与预报路径点 |
|
|
624
|
+
|
|
625
|
+
接口配置优先级通常为:本次方法参数或图层参数 → `configureMapMethods` 全局配置 → 包内默认值。需要取消页面卸载或条件变化时的请求,可以传入 `AbortSignal`:
|
|
626
|
+
|
|
627
|
+
~~~ts
|
|
628
|
+
const controller = new AbortController();
|
|
629
|
+
|
|
630
|
+
const request = getXmlData({
|
|
631
|
+
filePath: "/data/temperature.nc",
|
|
632
|
+
signal: controller.signal,
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
// 页面卸载或条件发生变化时取消。
|
|
636
|
+
controller.abort();
|
|
637
|
+
|
|
638
|
+
try {
|
|
639
|
+
await request;
|
|
640
|
+
} catch (error) {
|
|
641
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
642
|
+
// 请求被主动取消。
|
|
643
|
+
} else {
|
|
644
|
+
throw error;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
~~~
|
|
648
|
+
|
|
649
|
+
请求失败、超时或响应状态异常时,Promise 会被拒绝。业务代码应根据需要使用 `try/catch`,并在组件卸载时取消不再使用的请求。
|
|
650
|
+
|
|
651
|
+
## 台风数据
|
|
652
|
+
|
|
653
|
+
~~~ts
|
|
654
|
+
import { getTyphoonDetail, getTyphoonList } from "tds-map-methods";
|
|
655
|
+
|
|
656
|
+
const list = await getTyphoonList();
|
|
657
|
+
const detail = await getTyphoonDetail(list[0].num_nati);
|
|
658
|
+
~~~
|
|
659
|
+
|
|
660
|
+
台风请求可单独覆盖 `serviceBaseUrl`、`dataPath`、`authorization` 和 `signal`。
|
|
661
|
+
|
|
662
|
+
## CommonJS
|
|
663
|
+
|
|
664
|
+
~~~js
|
|
665
|
+
const { initMap, loadLayer } = require("tds-map-methods");
|
|
666
|
+
~~~
|
|
27
667
|
|
|
28
|
-
|
|
29
|
-
getMenuList, getXmlData, getVariableMinMax, resolveLayerLoadOptions, and typhoon requests.
|
|
668
|
+
## 使用注意
|
|
30
669
|
|
|
31
|
-
|
|
670
|
+
- 本包用于浏览器环境,依赖 DOM、Canvas、WebGL / WebGPU 和 OpenLayers。
|
|
671
|
+
- 调用 `initMap` 前,地图容器必须已挂载并具有非零宽高。
|
|
672
|
+
- 本包不会读取宿主项目的 Vite 环境变量,请通过 `configureMapMethods` 显式传入服务地址。
|
|
673
|
+
- 跨域请求需要服务端正确配置 CORS;Authorization 请求头也必须被服务端允许。
|
|
674
|
+
- `Layer.Config`、台风数据和请求方法均提供 TypeScript 类型提示。
|
|
675
|
+
- `ol`、`@turf/turf`、`dayjs`、`d3-contour` 和 `lodash-es` 为 peer dependencies,需要由宿主项目安装。
|