tds-map-methods 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,49 @@
1
+ export interface TyphoonListItem {
2
+ num_inati: string;
3
+ num_nati: string;
4
+ name_en: string;
5
+ name_cn: string;
6
+ data_id?: string;
7
+ init_grade?: string | null;
8
+ first_seen_file?: string;
9
+ first_seen_ts?: string;
10
+ latest_ts?: string;
11
+ obs_points?: number;
12
+ fcst_sources?: number;
13
+ }
14
+ export interface TyphoonPoint {
15
+ datetime: string;
16
+ file_ts: string;
17
+ validtime: number;
18
+ lat: number;
19
+ lon: number;
20
+ prs_hpa: number | null;
21
+ wind_max_ms: number | null;
22
+ wind_gust_ms: number | null;
23
+ grade: string | null;
24
+ move_dir_deg: number | null;
25
+ move_speed_ms: number | null;
26
+ radius_7: (number | null)[];
27
+ radius_10: (number | null)[];
28
+ radius_12: (number | null)[];
29
+ }
30
+ export interface TyphoonForecast {
31
+ file_ts?: string;
32
+ points?: TyphoonPoint[];
33
+ }
34
+ export interface TyphoonDetail {
35
+ typhoon_num: string;
36
+ name_cn: string;
37
+ name_en: string;
38
+ updated?: string;
39
+ obs?: Record<string, TyphoonPoint[] | TyphoonForecast>;
40
+ fcst?: Record<string, TyphoonPoint[] | TyphoonForecast>;
41
+ }
42
+ export interface TyphoonRequestOptions {
43
+ serviceBaseUrl?: string;
44
+ dataPath?: string;
45
+ authorization?: string;
46
+ signal?: AbortSignal;
47
+ }
48
+ export declare function getTyphoonList(options?: TyphoonRequestOptions): Promise<TyphoonListItem[]>;
49
+ export declare function getTyphoonDetail(typhoonNum: string, options?: TyphoonRequestOptions): Promise<TyphoonDetail>;
@@ -0,0 +1,97 @@
1
+ import { type Dayjs } from "dayjs";
2
+ import { type MapMethodsConfig } from "./config";
3
+ export declare function resolveSymFunction<T extends (...args: any[]) => any>(candidate: unknown): T | undefined;
4
+ /** bbox经纬度转3857 */
5
+ export declare function bboxFromLonlatTo3857(bbox: [number, number, number, number]): [number, number, number, number];
6
+ /** 线性插值 */
7
+ export declare function lerp(a: number, b: number, t: number): number;
8
+ /**
9
+ * 对二维数组进行高斯模糊
10
+ * @param data 输入二维数组
11
+ * @param width 宽度
12
+ * @param height 高度
13
+ * @param kernelSize 卷积核大小,默认5
14
+ * @param sigma 标准差,默认1.2
15
+ * @returns 模糊后的二维数组
16
+ */
17
+ export declare function gaussianBlur2D(data: (number | undefined)[][], width: number, height: number, kernelSize?: number, sigma?: number): (number | undefined)[][];
18
+ export declare function normalizeSmoothnessLevel(value: unknown, defaultValue?: number, maxValue?: number): number;
19
+ export declare function smoothGridByLevel(data: (number | undefined)[][], width: number, height: number, value: unknown): number[][];
20
+ /**
21
+ * 像素坐标转EPSG:3857坐标
22
+ * @param x 像素x
23
+ * @param y 像素y
24
+ * @param width 图像宽度
25
+ * @param height 图像高度
26
+ * @param extent 地图范围[minX, minY, maxX, maxY],EPSG:3857
27
+ * @returns [coordX, coordY] EPSG:3857坐标
28
+ */
29
+ export declare function pixelTo3857(x: number, y: number, width: number, height: number, extent: [number, number, number, number]): [number, number];
30
+ export declare function pixelToLngLat(x: number, y: number, width: number, height: number, bbox: [number, number, number, number]): [number, number];
31
+ export declare function convertContourGeoJSONToLngLat(contourGeoJSON: any[], width: number, height: number, bbox: [number, number, number, number]): any[];
32
+ /**
33
+ * 将等值线GeoJSON中的像素坐标转换为EPSG:3857坐标
34
+ * @param contourGeoJSON 生成的等值线GeoJSON对象数组
35
+ * @param width 图像宽度
36
+ * @param height 图像高度
37
+ * @param extent 地图范围[minX, minY, maxX, maxY],EPSG:3857
38
+ * @returns 坐标已转换的等值线GeoJSON对象数组
39
+ */
40
+ export declare function convertContourGeoJSONTo3857(contourGeoJSON: any[], width: number, height: number, extent: [number, number, number, number]): any[];
41
+ export declare function bilinearInterpolate(arr: Float32Array, x: number, y: number, width: number, height: number): number;
42
+ /**
43
+ * 从图片获取灰度数据,并返回归一化的灰度数组
44
+ * @param src 图片路径
45
+ * @param scope 灰度值对应的实际数据范围 [min, max]
46
+ * @param scopeBoundaries 范围边界,超过最大最小值是否忽略,true: 忽略-取undefined,false: 不忽略-取最大最小值
47
+ * @param authorization 请求头 Authorization
48
+ * @param options 额外选项,detectNoDataByBorderColor 控制是否启用边界背景色无值识别
49
+ * @returns Promise<number[] | undefined[]> 灰度数组,透明像素为undefined
50
+ */
51
+ export declare function getGrayDataFromImage(src: string, scope: [number, number], scopeBoundaries?: [boolean, boolean], authorization?: string, options?: {
52
+ detectNoDataByBorderColor?: boolean;
53
+ signal?: AbortSignal;
54
+ }): Promise<{
55
+ grayArr: (number | undefined)[];
56
+ width: number;
57
+ height: number;
58
+ }>;
59
+ export declare function parseCssNumber(s: string): number;
60
+ export declare function parseAlpha(s: string): number;
61
+ export declare function clampByte(v: number): number;
62
+ /**
63
+ * 解析 css 颜色字符串(#rrggbb/#rgb 或 rgb()/rgba())到 [r,g,b,a(0..255)]
64
+ */
65
+ export declare function parseColorToRGBA(col: string): [number, number, number, number];
66
+ export declare function getLegendItemsByScope(legend: Layer.Legend, legendScope?: [number, number] | []): Layer.Legend;
67
+ export declare function getLegendValueScope(legend: Layer.Legend, legendScope?: [number, number] | []): [number, number] | undefined;
68
+ export declare function generateLegend(legend: Layer.Legend, legendScope?: [number, number] | []): {
69
+ uniqueThresholds: number[];
70
+ colorMap: Record<number, string>;
71
+ };
72
+ type ContourParamsResult = {
73
+ width: number;
74
+ height: number;
75
+ extent: [number, number, number, number];
76
+ rawArr2D: (number | undefined)[][];
77
+ smoothArr2D: (number | undefined)[][];
78
+ uniqueThresholds: number[];
79
+ colorMap: {
80
+ [key: number]: string;
81
+ };
82
+ } | undefined;
83
+ /** 根据灰度图获取对应数据 */
84
+ export declare function getContourParams(options: Layer.Config): Promise<ContourParamsResult>;
85
+ /** 根据bbox比例自适应宽高 */
86
+ export declare function getWidthAndHeight(extent: [number, number, number, number], maxWidth: number, maxHeight: number): {
87
+ width: number;
88
+ height: number;
89
+ };
90
+ export declare function getUrlFromTime(el: any, time: string | Dayjs, requestConfig?: Pick<MapMethodsConfig, "serviceBaseUrl" | "imageSize">): string | string[];
91
+ /**
92
+ * 把单个数值映射为 rgba 数组(0..255)
93
+ * thresholds: 排序后的阈值数组
94
+ * colorsRGBA: 与 thresholds 对应的 rgba 数组(每项为 [r,g,b,a])
95
+ */
96
+ export declare function mapValueToRGBA(val: number, thresholds: number[], colorsRGBA: [number, number, number, number][], colorMode: Layer.LayerMode): [number, number, number, number];
97
+ export {};
@@ -0,0 +1,13 @@
1
+ type RasterColorizeOptions = {
2
+ width: number;
3
+ height: number;
4
+ rawArr2D: (number | undefined)[][];
5
+ smoothArr2D: (number | undefined)[][];
6
+ thresholds: number[];
7
+ colorsRGBA: [number, number, number, number][];
8
+ colorMode: Layer.LayerMode;
9
+ scope?: [number, number] | [];
10
+ softenMaskEdge?: boolean;
11
+ };
12
+ export declare function renderFcstCanvasByWebGPU(options: RasterColorizeOptions): Promise<HTMLCanvasElement>;
13
+ export {};
@@ -0,0 +1,23 @@
1
+ import { FcstLayer } from "./fcstLayer";
2
+ type ExtentLike = [number, number, number, number];
3
+ export type WindVectorData = {
4
+ width: number;
5
+ height: number;
6
+ u: Float32Array;
7
+ v: Float32Array;
8
+ extent: ExtentLike;
9
+ };
10
+ export declare class WindLayer extends FcstLayer {
11
+ private windVectorCache;
12
+ private windVectorLoadingTasks;
13
+ private normalizeUrls;
14
+ private parseScopeValue;
15
+ private getComponentScope;
16
+ private buildWindSpeedGrid;
17
+ private prepareGrid;
18
+ private getWindVectorCacheKey;
19
+ getOrLoadWindVectorData(options?: any): Promise<WindVectorData | null>;
20
+ getOrLoadContourData(options?: any): Promise<any>;
21
+ getSourceFromParams(options?: any): Promise<import("ol/source").ImageCanvas>;
22
+ }
23
+ export {};
@@ -0,0 +1,43 @@
1
+ import ImageCanvasSource from "ol/source/ImageCanvas.js";
2
+ import type { WindVectorData } from "./windLayer";
3
+ type WindShaftResolvedConfig = {
4
+ pixelStep: number;
5
+ fontSize: number;
6
+ color: string;
7
+ minWindSpeed: number;
8
+ speedLevelStep: number;
9
+ maxLevel: number;
10
+ spriteCellSize: number;
11
+ baseFontSize: number;
12
+ iconYOffsetRatio: number;
13
+ firstRowMaxLevel: number;
14
+ firstRowStartX: number;
15
+ firstRowY: number;
16
+ secondRowOffsetX: number;
17
+ secondRowY: number;
18
+ };
19
+ export declare class WindShaft {
20
+ map: Layer.Map;
21
+ options: any;
22
+ contourCache: Map<string, WindVectorData>;
23
+ iconImagePromise: Promise<HTMLImageElement> | null;
24
+ externalWindDataProvider?: () => Promise<WindVectorData | null>;
25
+ constructor(map: Layer.Map, options: any, externalWindDataProvider?: () => Promise<WindVectorData | null>);
26
+ getClassName(): string;
27
+ normalizeUrls(url: unknown): string[];
28
+ getComponentScope(): [number, number];
29
+ getCacheKey(): string;
30
+ getRuntimeConfig(): Layer.Config["config"] & Record<string, any>;
31
+ getVisibleWindSpeedScope(): [number, number];
32
+ getWindShaftConfig(): WindShaftResolvedConfig;
33
+ getIconImage(): Promise<HTMLImageElement>;
34
+ getOrLoadWindData(): Promise<WindVectorData | null>;
35
+ createWindShaftSource(data: WindVectorData, iconImage: CanvasImageSource): ImageCanvasSource;
36
+ getSourceFromCache(): Promise<ImageCanvasSource>;
37
+ getSourceFromParams(): Promise<ImageCanvasSource>;
38
+ add(): Promise<void>;
39
+ delete(): void;
40
+ toggleVisible(visible: boolean): void;
41
+ updateParams(newOptions: Layer.Config): Promise<void>;
42
+ }
43
+ export {};
@@ -0,0 +1,36 @@
1
+ import { TileWMS } from "ol/source.js";
2
+ type WmsLayerConfig = Record<string, string | number | boolean | string[] | undefined>;
3
+ type WmsColorOptions = {
4
+ styles?: string;
5
+ colorScaleRange?: string | [number, number];
6
+ numColorBands?: string | number;
7
+ aboveMaxColor?: string;
8
+ belowMinColor?: string;
9
+ bgColor?: string;
10
+ logScale?: boolean | string;
11
+ };
12
+ export declare class WmsLayer {
13
+ map: Layer.Map;
14
+ options: Layer.Config;
15
+ constructor(map: Layer.Map, options: Layer.Config);
16
+ getClassName(): string;
17
+ getConfig(): Layer.Config["config"] & {
18
+ opacity?: number;
19
+ layerConfig?: WmsLayerConfig;
20
+ };
21
+ normalizeParamValue(value: unknown): string | undefined;
22
+ buildWmsParams(): Record<string, string>;
23
+ splitUrlAndParams(rawUrl: string): {
24
+ baseUrl: string;
25
+ urlParams: Record<string, string>;
26
+ };
27
+ getTintColorRGB(): [number, number, number] | null;
28
+ tintBlobToDataUrl(blob: Blob, tintRGB: [number, number, number]): Promise<string>;
29
+ createSource(): TileWMS;
30
+ add(): void;
31
+ delete(): void;
32
+ toggleVisible(visible: boolean): void;
33
+ updateParams(newOptions: Layer.Config): void;
34
+ updateColor(colorOptions: WmsColorOptions): void;
35
+ }
36
+ export {};
@@ -0,0 +1,226 @@
1
+ declare namespace Layer {
2
+ type Map = import("ol").Map;
3
+ type Dayjs = import("dayjs").Dayjs;
4
+
5
+ /** 图层类型:只显示图例,网格,渐变,等高线,可见性,箭头,micaps,uv风,风杆 */
6
+ type LegendType =
7
+ | "legend"
8
+ | "grid"
9
+ | "gradual"
10
+ | "isoline"
11
+ | "contour"
12
+ | "visible"
13
+ | "arrow"
14
+ | "micaps"
15
+ | "wms"
16
+ | "uv"
17
+ | "windShaft"
18
+ | "typhoon";
19
+ /** 图层模式:离散、渐变、网格 */
20
+ type LayerMode = "discrete" | "gradient" | "grid";
21
+ type Legend = {
22
+ name: string;
23
+ scope?: number[];
24
+ color: string;
25
+ }[];
26
+
27
+ interface Config {
28
+ /** 图层id,唯一标识 */
29
+ readonly id: string;
30
+ /** 图层标题 */
31
+ readonly title: string;
32
+ /** 图层标签 */
33
+ label: string;
34
+ /** 图层类型 */
35
+ type: LegendType | LegendType[];
36
+ /** 图层数据文件路径 */
37
+ filePath: string;
38
+ /** 主数据目录不可用时使用的备用目录 */
39
+ fallbackFilePath?: string;
40
+ /** 图层数据url地址 */
41
+ url?: string;
42
+ /** WMS service prefix. Overrides the global package configuration. */
43
+ serviceBaseUrl?: string;
44
+ /** 图层是否显示,默认true */
45
+ show?: boolean;
46
+ /** 菜单图标名称 */
47
+ icon?: string;
48
+ /** 目录接口返回的节点类型 */
49
+ fileListType?: "file" | "menu";
50
+ /** 数据单位 */
51
+ unit?: string;
52
+ /** 菜单项请求头 Authorization,优先于环境变量 */
53
+ authorization?: string;
54
+ /** 备用目录对应的 Authorization */
55
+ fallbackAuthorization?: string;
56
+ /** 数据时间 */
57
+ time?: string | Dayjs;
58
+ config: {
59
+ /** 是否缓存图层数据,默认false,---!!该参数准备作废!!--- */
60
+ cache?: boolean;
61
+ /** 图片边界取值bbox */
62
+ extent: [number, number, number, number];
63
+ /** 图层zIndex,默认0,数值越大越靠上 */
64
+ zIndex?: number;
65
+ /** 图层透明度,取值范围 0-1 */
66
+ opacity?: number;
67
+ /** 等值线线宽 */
68
+ lineWidth?: number;
69
+ /** 等值线线宽,优先于 lineWidth */
70
+ isolineLineWidth?: number;
71
+ /** 是否启用等值线平滑,默认 true */
72
+ isolineSmooth?: boolean;
73
+ /** 等值线平滑度,0 表示关闭,1-3 表示逐级增强,默认 1 */
74
+ isolineSmoothness?: number;
75
+ /** 色斑图是否使用与等值线相同的数值场和平滑边界,默认 false */
76
+ alignWithIsoline?: boolean;
77
+ /** 等值线颜色;true 表示跟随图例 */
78
+ isolineColor?: string | boolean;
79
+ /** 等值面边界颜色 */
80
+ isolineBorderColor?: string;
81
+ /** 是否绘制分级等值面 */
82
+ isolineFill?: boolean;
83
+ /** 是否沿等值线显示数值 */
84
+ showIsolineValue?: boolean;
85
+ /** showIsolineValue 的兼容配置名 */
86
+ showIsolineLabel?: boolean;
87
+ /** MICAPS 是否显示文本 */
88
+ showText?: boolean;
89
+ /** MICAPS 是否填色 */
90
+ showFillcolor?: boolean;
91
+ /** MICAPS 是否显示等值线 */
92
+ showIsoline?: boolean;
93
+ /** MICAPS 是否显示符号点 */
94
+ showPointMarkers?: boolean;
95
+ /** 图例色带范围 */
96
+ legend: Legend;
97
+ /** 图例色带类型 visible:不显示色带 legend: 显示色块文字 grid:显示网格色带 gradual:显示渐变色带 */
98
+ legendType: "visible" | "legend" | "grid" | "gradual";
99
+ /** 图例色带范围(图例下标),只有在legendType为visible时有效,空数组表示不限制范围 */
100
+ legendScope?: [] | [number, number];
101
+ /** 数据值域;不设置时,从 TDS 自动获取最大/最小值 */
102
+ scope?: [number, number];
103
+ /**
104
+ * 对栅格值进行二次计算后再参与绘制与查询。
105
+ * 返回 null/undefined/NaN 时,该像素按无效值处理。
106
+ * 也支持字符串符号引用,例如 #sym:valueTransform。
107
+ */
108
+ valueTransform?:
109
+ | ((
110
+ value: number,
111
+ context: {
112
+ x: number;
113
+ y: number;
114
+ width: number;
115
+ height: number;
116
+ source: "raw" | "smooth";
117
+ },
118
+ ) => number | null | undefined)
119
+ | string;
120
+ /**
121
+ * valueTransform 结果是否参与范围过滤,默认 true。
122
+ * false 时仅用于显示值,不改变过滤判定。
123
+ */
124
+ valueTransformAffectsScope?: boolean;
125
+ /** 掩膜边缘平滑开关,默认false */
126
+ smooth?: boolean;
127
+ /** Chaikin 平滑迭代次数,默认2,建议1-3,取值范围1-5 */
128
+ smoothIterations?: number;
129
+ mode: LayerMode;
130
+ /** tds图层配置项 */
131
+ layerConfig?: Record<string, any>;
132
+ /** grid图层配置项 */
133
+ gridConfig?: {
134
+ /** 网格文本像素间距,默认40,单位px */
135
+ pixelStep: number | string;
136
+ /** 网格文本字体大小,默认14,单位px */
137
+ fontSize: number | string;
138
+ /** 网格文本小数位数,默认1 */
139
+ decimals: number | string;
140
+ /** 网格文本颜色,默认#000 */
141
+ fontColor: string;
142
+ /** 网格文本描边颜色,默认#fff */
143
+ strokeColor: string;
144
+ /** 网格文本描边宽度,默认2,单位px */
145
+ strokeWidth: number | string;
146
+ /** 网格文本字体,默认Arial, sans-serif */
147
+ fontFamily: string;
148
+ /** 是否开启文本描边,默认true */
149
+ useDevicePixelRatio: boolean;
150
+ };
151
+ /** wind图层配置项 */
152
+ windConfig?: Record<string, any>;
153
+ /** windShaft图层配置项 */
154
+ windShaftConfig?: {
155
+ /** 风杆采样像素步长,默认20,单位px */
156
+ pixelStep?: number | string;
157
+ /** 风杆尺寸,默认18,单位px */
158
+ fontSize?: number | string;
159
+ /** 风杆叠加颜色,默认rgb(255,255,255) */
160
+ color?: string;
161
+ /** 过滤最小风速,默认0.01 */
162
+ minWindSpeed?: number | string;
163
+ /** 风速分级步长,默认2 */
164
+ speedLevelStep?: number | string;
165
+ /** 风速级别上限,默认30 */
166
+ maxLevel?: number | string;
167
+ /** 雪碧图单格尺寸,默认32 */
168
+ spriteCellSize?: number | string;
169
+ /** 图标缩放基准字号,默认32 */
170
+ baseFontSize?: number | string;
171
+ /** 图标Y轴偏移比例,默认0.7 */
172
+ iconYOffsetRatio?: number | string;
173
+ /** 雪碧图第一行最大等级,默认3 */
174
+ firstRowMaxLevel?: number | string;
175
+ /** 雪碧图第一行起始X,默认28 */
176
+ firstRowStartX?: number | string;
177
+ /** 雪碧图第一行Y,默认4 */
178
+ firstRowY?: number | string;
179
+ /** 雪碧图第二行X偏移,默认4 */
180
+ secondRowOffsetX?: number | string;
181
+ /** 雪碧图第二行Y,默认5 */
182
+ secondRowY?: number | string;
183
+ };
184
+ /** 台风路径图层配置 */
185
+ typhoonConfig?: {
186
+ /** Typhoon JSON service prefix. */
187
+ serviceBaseUrl?: string;
188
+ /** TDS fileServer 下的台风 JSON 目录 */
189
+ dataPath?: string;
190
+ /** 只加载指定台风编号;不传则加载列表内全部台风 */
191
+ typhoonNums?: string[];
192
+ /** 优先显示的实况/预报来源 */
193
+ sourcePriority?: string[];
194
+ /** 是否显示预报路径 */
195
+ showForecast?: boolean;
196
+ /** 加载后是否自动缩放到路径范围 */
197
+ fitToExtent?: boolean;
198
+ };
199
+ };
200
+ }
201
+
202
+ interface TimeInfoResult {
203
+ /** 单时次or多时次 */
204
+ type: TimeOrderType;
205
+ /** 数据经纬度四角范围 */
206
+ latLonBox: LatLonBox;
207
+ /** 时间序列数量 */
208
+ npts?: string;
209
+ /** 数据时间间隔 */
210
+ increment?: string;
211
+ /** 请求连接 */
212
+ url: string;
213
+ /** 时间单位(hour | hours | minute) */
214
+ units: string;
215
+ /** 时间序列 */
216
+ timeOrder: TimeOrder[];
217
+ /** 起始时间 */
218
+ startTime: Date;
219
+ /** 结束时间 */
220
+ endTime: Date;
221
+ /** 高度层信息 */
222
+ level?: string[];
223
+ heightAboveGround?: string;
224
+ [key: string]: any;
225
+ }
226
+ }