@caoguo/maplibre-pipeline 0.0.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.
Files changed (77) hide show
  1. package/dist/burst/index.cjs +708 -0
  2. package/dist/burst/index.cjs.map +1 -0
  3. package/dist/burst/index.d.cts +74 -0
  4. package/dist/burst/index.d.ts +74 -0
  5. package/dist/burst/index.js +4 -0
  6. package/dist/burst/index.js.map +1 -0
  7. package/dist/burstClass-CGMjcAYy.d.cts +161 -0
  8. package/dist/burstClass-Cf2p71LE.d.ts +161 -0
  9. package/dist/chunk-CDEYJ67B.js +80 -0
  10. package/dist/chunk-CDEYJ67B.js.map +1 -0
  11. package/dist/chunk-GCDA7KJM.js +289 -0
  12. package/dist/chunk-GCDA7KJM.js.map +1 -0
  13. package/dist/chunk-GEJRE2OR.js +351 -0
  14. package/dist/chunk-GEJRE2OR.js.map +1 -0
  15. package/dist/chunk-HCT6NSNS.js +532 -0
  16. package/dist/chunk-HCT6NSNS.js.map +1 -0
  17. package/dist/chunk-HIRNJVCV.js +13 -0
  18. package/dist/chunk-HIRNJVCV.js.map +1 -0
  19. package/dist/chunk-J3AEVXT4.js +164 -0
  20. package/dist/chunk-J3AEVXT4.js.map +1 -0
  21. package/dist/chunk-QVY4WJLM.js +256 -0
  22. package/dist/chunk-QVY4WJLM.js.map +1 -0
  23. package/dist/chunk-VA2TQWL3.js +340 -0
  24. package/dist/chunk-VA2TQWL3.js.map +1 -0
  25. package/dist/chunk-YBLESEN4.js +133 -0
  26. package/dist/chunk-YBLESEN4.js.map +1 -0
  27. package/dist/chunk-YS2ICFVK.js +101 -0
  28. package/dist/chunk-YS2ICFVK.js.map +1 -0
  29. package/dist/graph/index.cjs +382 -0
  30. package/dist/graph/index.cjs.map +1 -0
  31. package/dist/graph/index.d.cts +211 -0
  32. package/dist/graph/index.d.ts +211 -0
  33. package/dist/graph/index.js +4 -0
  34. package/dist/graph/index.js.map +1 -0
  35. package/dist/health/index.cjs +348 -0
  36. package/dist/health/index.cjs.map +1 -0
  37. package/dist/health/index.d.cts +210 -0
  38. package/dist/health/index.d.ts +210 -0
  39. package/dist/health/index.js +3 -0
  40. package/dist/health/index.js.map +1 -0
  41. package/dist/index.cjs +2295 -0
  42. package/dist/index.cjs.map +1 -0
  43. package/dist/index.d.cts +10 -0
  44. package/dist/index.d.ts +10 -0
  45. package/dist/index.js +12 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/leakage/index.cjs +358 -0
  48. package/dist/leakage/index.cjs.map +1 -0
  49. package/dist/leakage/index.d.cts +212 -0
  50. package/dist/leakage/index.d.ts +212 -0
  51. package/dist/leakage/index.js +3 -0
  52. package/dist/leakage/index.js.map +1 -0
  53. package/dist/nlpg/index.cjs +136 -0
  54. package/dist/nlpg/index.cjs.map +1 -0
  55. package/dist/nlpg/index.d.cts +51 -0
  56. package/dist/nlpg/index.d.ts +51 -0
  57. package/dist/nlpg/index.js +3 -0
  58. package/dist/nlpg/index.js.map +1 -0
  59. package/dist/style/index.cjs +379 -0
  60. package/dist/style/index.cjs.map +1 -0
  61. package/dist/style/index.d.cts +119 -0
  62. package/dist/style/index.d.ts +119 -0
  63. package/dist/style/index.js +4 -0
  64. package/dist/style/index.js.map +1 -0
  65. package/dist/topology/index.cjs +317 -0
  66. package/dist/topology/index.cjs.map +1 -0
  67. package/dist/topology/index.d.cts +69 -0
  68. package/dist/topology/index.d.ts +69 -0
  69. package/dist/topology/index.js +4 -0
  70. package/dist/topology/index.js.map +1 -0
  71. package/dist/types/index.cjs +15 -0
  72. package/dist/types/index.cjs.map +1 -0
  73. package/dist/types/index.d.cts +214 -0
  74. package/dist/types/index.d.ts +214 -0
  75. package/dist/types/index.js +3 -0
  76. package/dist/types/index.js.map +1 -0
  77. package/package.json +81 -0
@@ -0,0 +1,212 @@
1
+ import { Map } from '@caoguo/maplibre';
2
+
3
+ /**
4
+ * Pasquill-Gifford 大气稳定度参数(PRD §4.3.2)
5
+ *
6
+ * 根据风速 + 日射强度 + 夜间云量,对应稳定度类别 A-F
7
+ * A: 极不稳定,B: 不稳定,C: 弱不稳定,D: 中性,E: 弱稳定,F: 稳定
8
+ *
9
+ * 用于高斯烟羽模型的扩散系数 σy/σz 估计。
10
+ */
11
+ type StabilityClass = 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
12
+ interface PasquillGiffordParams {
13
+ /** 风速 m/s */
14
+ windSpeed: number;
15
+ /** 日射强度(白天):强/中等/弱 */
16
+ daytimeInsolation?: 'strong' | 'moderate' | 'slight';
17
+ /** 夜间云量(阴天/部分/晴朗) */
18
+ nightCloudCover?: 'overcast' | 'partly' | 'clear';
19
+ /** 是否白天 */
20
+ isDaytime: boolean;
21
+ }
22
+ /**
23
+ * 根据 Pasquill-Gifford 表格,确定稳定度类别
24
+ */
25
+ declare function classifyStability(params: PasquillGiffordParams): StabilityClass;
26
+ interface DispersionCoefficients {
27
+ /** σy(m),下风向距离 x 的函数 */
28
+ sigmaY: (x: number) => number;
29
+ /** σz(m),下风向距离 x 的函数 */
30
+ sigmaZ: (x: number) => number;
31
+ }
32
+ /**
33
+ * Pasquill-Gifford 扩散系数(Briggs 经验公式)
34
+ * σy, σz = a * x / √(1 + b*x)
35
+ *
36
+ * x 单位 km(外部调用时换算:x (m) / 1000)
37
+ *
38
+ * 表格源自 USEPA ISC3 模型常用设置(单位: m/km 与 1/km)
39
+ */
40
+ declare function dispersionCoefficients(stability: StabilityClass): DispersionCoefficients;
41
+
42
+ interface GasLeakParams {
43
+ /** 风向(弧度,0=东,PI/2=北) */
44
+ windDirection: number;
45
+ /** 风速 m/s */
46
+ windSpeed: number;
47
+ /** 泄漏速率 kg/s */
48
+ leakRate: number;
49
+ /** 释放高度 m */
50
+ releaseHeight: number;
51
+ /** 大气稳定度(可选,不传则自动分类) */
52
+ stability?: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
53
+ /** 浓度阈值(kg/m³)列表 */
54
+ thresholds?: number[];
55
+ /** 网格步长(m)默认 50 */
56
+ gridStep?: number;
57
+ /** 计算范围(m)默认 5000 */
58
+ range?: number;
59
+ }
60
+ interface GasLeakResult {
61
+ /** 泄漏点 */
62
+ source: {
63
+ lng: number;
64
+ lat: number;
65
+ };
66
+ /** 风向(弧度) */
67
+ windDirection: number;
68
+ /** 风速 m/s */
69
+ windSpeed: number;
70
+ /** 大气稳定度 */
71
+ stability: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
72
+ /** 等浓度线多边形(阈值对应) */
73
+ contours: ConcentrationContour[];
74
+ /** 下风向最大影响距离(m) */
75
+ maxDownwindDistance: number;
76
+ }
77
+ interface ConcentrationContour {
78
+ /** 阈值 */
79
+ threshold: number;
80
+ /** 多边形(顺时针 GeoJSON-like) */
81
+ polygon: [number, number][];
82
+ /** 是否闭合 */
83
+ closed: boolean;
84
+ }
85
+ /**
86
+ * 计算泄漏源下风向的浓度分布,输出等浓度线多边形
87
+ */
88
+ declare function gaussianPlume(source: {
89
+ lng: number;
90
+ lat: number;
91
+ }, params: GasLeakParams): GasLeakResult;
92
+ /** 根据气象数据自动确定稳定度类别(便利入口) */
93
+ declare function classifyFromMeteo(opts: {
94
+ windSpeed: number;
95
+ isDaytime: boolean;
96
+ daytimeInsolation?: 'strong' | 'moderate' | 'slight';
97
+ nightCloudCover?: 'overcast' | 'partly' | 'clear';
98
+ }): StabilityClass;
99
+
100
+ /**
101
+ * 供水爆管淹没分析(基于地形的 flood fill)
102
+ *
103
+ * 输入:
104
+ * - DEM:高程网格(lng, lat → elevation)
105
+ * - source:爆管点
106
+ * - 网格分辨率
107
+ *
108
+ * 算法:
109
+ * - 从爆管点出发,flood fill 到相邻低洼地
110
+ * - 估算淹没范围
111
+ */
112
+ interface DemGrid {
113
+ /** 西南角 lng/lat */
114
+ west: number;
115
+ south: number;
116
+ /** 网格行列数 */
117
+ cols: number;
118
+ rows: number;
119
+ /** 单元尺寸(度) */
120
+ cellSize: number;
121
+ /** 高程数组(row-major,rows × cols) */
122
+ elevations: number[];
123
+ }
124
+ interface FloodParams {
125
+ sourceLng: number;
126
+ sourceLat: number;
127
+ /** 起始水位(m),默认 0 */
128
+ initialWaterLevel?: number;
129
+ /** 模拟时长(秒),默认 30min */
130
+ duration?: number;
131
+ /** 流量估算(m³/h),默认按中等爆管 50 */
132
+ flowRate?: number;
133
+ }
134
+ interface FloodResult {
135
+ source: {
136
+ lng: number;
137
+ lat: number;
138
+ };
139
+ /** 淹没面积(m²) */
140
+ floodArea: number;
141
+ /** 受影响网格(高程 < 水位) */
142
+ affectedCells: Array<{
143
+ lng: number;
144
+ lat: number;
145
+ elevation: number;
146
+ waterDepth: number;
147
+ }>;
148
+ /** 凸包多边形 */
149
+ hull: [number, number][];
150
+ /** 最大水深 */
151
+ maxDepth: number;
152
+ }
153
+ /**
154
+ * 简单 flood fill 模拟(按等高线分布)
155
+ */
156
+ declare function simulateFlood(dem: DemGrid, params: FloodParams): FloodResult;
157
+
158
+ /**
159
+ * LeakagePlume 组件类(占位 stub)
160
+ *
161
+ * Phase 1 MVP 完整功能待 M6 W1-W2 完成。
162
+ * 当前 stub 仅暴露 API 接口和最小实现。
163
+ */
164
+
165
+ interface LeakagePlumeOptions {
166
+ map: Map;
167
+ /** 浓度阈值(kg/m³),可分级 */
168
+ thresholds?: number[];
169
+ /** 层 ID 前缀 */
170
+ layerPrefix?: string;
171
+ /** 区域填充色 */
172
+ fillColor?: string;
173
+ }
174
+ type Listener = (r: GasLeakResult | FloodResult) => void;
175
+ /**
176
+ * LeakagePlume 组件(燃气泄漏 / 供水爆管)
177
+ *
178
+ * 用法:
179
+ * const plume = new LeakagePlume({ map });
180
+ * plume.simulateGas({ lng, lat }, { windDirection: 1.5, windSpeed: 3, ... });
181
+ * plume.simulateFlood(demGrid, { sourceLng, sourceLat });
182
+ */
183
+ declare class LeakagePlume {
184
+ private map;
185
+ private thresholds;
186
+ private layerPrefix;
187
+ private fillColor;
188
+ private layerIds;
189
+ private listeners;
190
+ private lastResult;
191
+ constructor(options: LeakagePlumeOptions);
192
+ /** 燃气泄漏扩散模拟 */
193
+ simulateGas(source: {
194
+ lng: number;
195
+ lat: number;
196
+ }, params: Omit<GasLeakParams, 'thresholds'>): GasLeakResult;
197
+ /** 供水爆管淹没模拟 */
198
+ simulateFlood(dem: DemGrid, params: FloodParams): FloodResult;
199
+ /** 清空图层 */
200
+ clear(): void;
201
+ /** 销毁组件 */
202
+ destroy(): void;
203
+ /** 订阅结果 */
204
+ onResult(fn: Listener): () => void;
205
+ /** 取最后一次结果 */
206
+ getLastResult(): GasLeakResult | FloodResult | null;
207
+ private renderGas;
208
+ private renderFlood;
209
+ private renderContours;
210
+ }
211
+
212
+ export { type ConcentrationContour, type DemGrid, type DispersionCoefficients, type FloodParams, type FloodResult, type GasLeakParams, type GasLeakResult, LeakagePlume, type LeakagePlumeOptions, type PasquillGiffordParams, type StabilityClass, classifyFromMeteo, classifyStability, dispersionCoefficients, gaussianPlume, simulateFlood };
@@ -0,0 +1,3 @@
1
+ export { LeakagePlume, classifyFromMeteo, classifyStability, dispersionCoefficients, gaussianPlume, simulateFlood } from '../chunk-GEJRE2OR.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,136 @@
1
+ 'use strict';
2
+
3
+ // src/nlpg/pipelineNlp.ts
4
+ var PATTERNS = [
5
+ { intent: "burst", re: /(爆管|破裂|泄漏|故障|事故|爆裂)/, confidence: 0.95 },
6
+ { intent: "valve", re: /(阀门|闸).*?(关闭|关|合)|(?:关闭|关|合).*?(阀门|闸)/, confidence: 0.9 },
7
+ { intent: "material_age", re: /(\d+)\s*年.*?(铸铁|钢|PE|PVC|铜)/, confidence: 0.85 },
8
+ { intent: "material_age", re: /(铸铁|钢|PE|PVC|铜).*?(\d+)\s*年/, confidence: 0.85 },
9
+ { intent: "pressure", re: /压力.*?(低于|高于|小于|大于|<|>|>=|<=|低|高)\s*(\d+\.?\d*)/, confidence: 0.85 },
10
+ { intent: "nearby", re: /(\d+)\s*(米|m|公里|km).*?(学校|医院|工厂|消防|政府|小区)/, confidence: 0.85 },
11
+ { intent: "alarm_cluster", re: /报警|告警/, confidence: 0.8 }
12
+ ];
13
+ var TYPE_REGEX = [
14
+ { type: "gas", re: /燃气|煤气|天然气/ },
15
+ { type: "water", re: /供水|自来水|水管/ },
16
+ { type: "drainage", re: /排水|污水|雨水/ },
17
+ { type: "heating", re: /供热|暖气|热力/ },
18
+ { type: "power", re: /电力|电缆|高压/ },
19
+ { type: "telecom", re: /通信|光纤|光缆/ }
20
+ ];
21
+ var MATERIAL_REGEX = [
22
+ { key: "cast_iron", cname: "\u94F8\u94C1", re: /铸铁/ },
23
+ { key: "ductile_iron", cname: "\u7403\u58A8\u94F8\u94C1", re: /球墨/ },
24
+ { key: "steel", cname: "\u94A2", re: /钢/ },
25
+ { key: "pe", cname: "PE", re: /PE/ },
26
+ { key: "pvc", cname: "PVC", re: /PVC/ },
27
+ { key: "concrete", cname: "\u6DF7\u51DD\u571F", re: /混凝土/ },
28
+ { key: "hdpe", cname: "HDPE", re: /HDPE/ },
29
+ { key: "copper", cname: "\u94DC", re: /铜/ }
30
+ ];
31
+ var REGION_REGEX = /(朝阳区|海淀区|江岸区|江汉区|硚口区|汉阳区|武昌区|青山区|洪山区|东西湖区|黄陂区|新洲区|江夏区|蔡甸区|汉南区)/;
32
+ function parsePipelineQuery(query) {
33
+ let best = { intent: "unknown", confidence: 0 };
34
+ for (const p of PATTERNS) {
35
+ const m = query.match(p.re);
36
+ if (m) {
37
+ const c = p.confidence * (1 + 0.05 * (m[0].length / query.length));
38
+ if (c > best.confidence) best = { intent: p.intent, confidence: Math.min(c, 1) };
39
+ }
40
+ }
41
+ const filters = {};
42
+ for (const t of TYPE_REGEX) {
43
+ if (t.re.test(query)) {
44
+ filters.pipelineType = t.type;
45
+ break;
46
+ }
47
+ }
48
+ for (const m of MATERIAL_REGEX) {
49
+ if (m.re.test(query)) {
50
+ filters.material = m.key;
51
+ break;
52
+ }
53
+ }
54
+ const ageMatch = query.match(/(\d+)\s*年/);
55
+ if (ageMatch) {
56
+ const years = parseInt(ageMatch[1]);
57
+ if (best.intent === "material_age") {
58
+ if (/超[过于]/.test(query) || /[以]?上/.test(query)) filters.minAgeYears = years;
59
+ else if (/内|以下|不超/.test(query)) filters.maxAgeYears = years;
60
+ else filters.minAgeYears = years;
61
+ } else {
62
+ filters.minAgeYears = years;
63
+ }
64
+ }
65
+ const pressureMatch = query.match(/(\d+\.?\d*)\s*(MPa|mpa)/);
66
+ if (pressureMatch) {
67
+ const v = parseFloat(pressureMatch[1]);
68
+ if (/低|小于|小于等于|</.test(query)) filters.maxPressure = v;
69
+ else if (/高|大于|大于等于|>/.test(query)) filters.minPressure = v;
70
+ else filters.maxPressure = v;
71
+ } else if (/压力/.test(query)) {
72
+ filters.maxPressure = 0.2;
73
+ }
74
+ const distMatch = query.match(/(\d+)\s*(公里|km|千米|米|m)/);
75
+ if (distMatch) {
76
+ let d = parseInt(distMatch[1]);
77
+ const unit = distMatch[2];
78
+ if (/公里|km|千米/.test(unit)) d *= 1e3;
79
+ filters.radius = d;
80
+ }
81
+ if (/昨天/.test(query)) filters.timeWindow = "1d";
82
+ else if (/今天/.test(query)) filters.timeWindow = "1d";
83
+ else if (/最近一周|过去一周|7\s*天/.test(query)) filters.timeWindow = "7d";
84
+ else if (/最近一个月/.test(query)) filters.timeWindow = "30d";
85
+ const regionMatch = query.match(REGION_REGEX);
86
+ if (regionMatch) filters.region = regionMatch[1];
87
+ return {
88
+ intent: best.intent,
89
+ filters,
90
+ description: buildDescription(best.intent, filters),
91
+ confidence: best.confidence
92
+ };
93
+ }
94
+ function buildDescription(intent, f) {
95
+ const desc = [];
96
+ if (intent === "burst") desc.push("\u89E6\u53D1\u7206\u7BA1\u63A8\u6F14");
97
+ else if (intent === "valve") desc.push("\u67E5\u8BE2\u9600\u95E8\u5173\u95ED\u5F71\u54CD");
98
+ else if (intent === "material_age") {
99
+ const matName = MATERIAL_REGEX.find((m) => m.key === f.material)?.cname ?? f.material ?? "";
100
+ desc.push(`\u7B5B\u9009${matName}\u7BA1${f.minAgeYears ?? "?"}\u5E74\u4EE5\u4E0A`);
101
+ } else if (intent === "pressure") desc.push(`\u7B5B\u9009\u538B\u529B${f.maxPressure ?? ""}MPa\u4EE5\u4E0B`);
102
+ else if (intent === "nearby") desc.push(`${f.radius}m\u5185\u67E5\u627EPOI`);
103
+ else if (intent === "alarm_cluster") desc.push(`\u67E5\u8BE2${f.timeWindow ?? "1d"}\u5185\u62A5\u8B66\u805A\u96C6`);
104
+ if (f.pipelineType) desc.push(`[${f.pipelineType}]`);
105
+ if (f.region) desc.push(`\u533A\u57DF:${f.region}`);
106
+ return desc.join(" ");
107
+ }
108
+
109
+ // src/nlpg/pipelineNlpClass.ts
110
+ var PipelineNlp = class {
111
+ burstSimulator;
112
+ onIntent;
113
+ constructor(options = {}) {
114
+ this.burstSimulator = options.burstSimulator;
115
+ this.onIntent = options.onIntent;
116
+ }
117
+ /** 解析并按意图触发动作 */
118
+ query(text) {
119
+ const result = parsePipelineQuery(text);
120
+ if (this.onIntent) this.onIntent(result.intent, result);
121
+ return result;
122
+ }
123
+ /** 仅解析不触发动作 */
124
+ parse(text) {
125
+ return parsePipelineQuery(text);
126
+ }
127
+ /** 关联 BurstSimulator */
128
+ setBurstSimulator(sim) {
129
+ this.burstSimulator = sim;
130
+ }
131
+ };
132
+
133
+ exports.PipelineNlp = PipelineNlp;
134
+ exports.parsePipelineQuery = parsePipelineQuery;
135
+ //# sourceMappingURL=index.cjs.map
136
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/nlpg/pipelineNlp.ts","../../src/nlpg/pipelineNlpClass.ts"],"names":[],"mappings":";;;AAiCA,IAAM,QAAA,GAAiF;AAAA,EACrF,EAAE,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,qBAAA,EAAuB,YAAY,IAAA,EAAK;AAAA,EAC/D,EAAE,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,uCAAA,EAAyC,YAAY,GAAA,EAAI;AAAA,EAChF,EAAE,MAAA,EAAQ,cAAA,EAAgB,EAAA,EAAI,6BAAA,EAA+B,YAAY,IAAA,EAAK;AAAA,EAC9E,EAAE,MAAA,EAAQ,cAAA,EAAgB,EAAA,EAAI,6BAAA,EAA+B,YAAY,IAAA,EAAK;AAAA,EAC9E,EAAE,MAAA,EAAQ,UAAA,EAAY,EAAA,EAAI,gDAAA,EAAkD,YAAY,IAAA,EAAK;AAAA,EAC7F,EAAE,MAAA,EAAQ,QAAA,EAAU,EAAA,EAAI,2CAAA,EAA6C,YAAY,IAAA,EAAK;AAAA,EACtF,EAAE,MAAA,EAAQ,eAAA,EAAiB,EAAA,EAAI,OAAA,EAAS,YAAY,GAAA;AACtD,CAAA;AAEA,IAAM,UAAA,GAAwD;AAAA,EAC5D,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,WAAA,EAAY;AAAA,EAC/B,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,WAAA,EAAY;AAAA,EACjC,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,UAAA,EAAW;AAAA,EACnC,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,UAAA,EAAW;AAAA,EAClC,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,UAAA,EAAW;AAAA,EAChC,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,UAAA;AACzB,CAAA;AAEA,IAAM,cAAA,GAAoE;AAAA,EACxE,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,cAAA,EAAM,IAAI,IAAA,EAAK;AAAA,EAC1C,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,0BAAA,EAAQ,IAAI,IAAA,EAAK;AAAA,EAC/C,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,QAAA,EAAK,IAAI,GAAA,EAAI;AAAA,EACpC,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAI,IAAA,EAAK;AAAA,EACnC,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAI,KAAA,EAAM;AAAA,EACtC,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,oBAAA,EAAO,IAAI,KAAA,EAAM;AAAA,EAC3C,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,EACzC,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAK,IAAI,GAAA;AACnC,CAAA;AAEA,IAAM,YAAA,GAAe,gEAAA;AAEd,SAAS,mBAAmB,KAAA,EAAkC;AACnE,EAAA,IAAI,IAAA,GAA0D,EAAE,MAAA,EAAQ,SAAA,EAAW,YAAY,CAAA,EAAE;AACjG,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AAC1B,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,MAAM,CAAA,GAAI,EAAE,UAAA,IAAc,CAAA,GAAI,QAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,MAAA,CAAA,CAAA;AAC1D,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,UAAA,EAAY,IAAA,GAAO,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,MAAM,UAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAA,CAAE,EAAA,CAAG,IAAA,CAAK,KAAK,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,eAAe,CAAA,CAAE,IAAA;AACzB,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,IAAA,IAAI,CAAA,CAAE,EAAA,CAAG,IAAA,CAAK,KAAK,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,WAAW,CAAA,CAAE,GAAA;AACrB,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AACxC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,CAAC,CAAC,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,WAAW,cAAA,EAAgB;AAClC,MAAA,IAAI,OAAA,CAAQ,KAAK,KAAK,CAAA,IAAK,QAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,OAAA,CAAQ,WAAA,GAAc,KAAA;AAAA,WAAA,IAC7D,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,UAAW,WAAA,GAAc,KAAA;AAAA,mBACzC,WAAA,GAAc,KAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,WAAA,GAAc,KAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,KAAA,CAAM,yBAAyB,CAAA;AAC3D,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,aAAA,CAAc,CAAC,CAAC,CAAA;AACrC,IAAA,IAAI,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,UAAW,WAAA,GAAc,CAAA;AAAA,SAAA,IAC5C,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,UAAW,WAAA,GAAc,CAAA;AAAA,iBAC7C,WAAA,GAAc,CAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,WAAA,GAAc,GAAA;AAAA,EACxB;AACA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,wBAAwB,CAAA;AACtD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,IAAK,GAAA;AAChC,IAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,EACnB;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,UAAW,UAAA,GAAa,IAAA;AAAA,OAAA,IAClC,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,UAAW,UAAA,GAAa,IAAA;AAAA,OAAA,IACvC,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,UAAW,UAAA,GAAa,IAAA;AAAA,OAAA,IACpD,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,UAAW,UAAA,GAAa,KAAA;AACnD,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA;AAC5C,EAAA,IAAI,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,WAAA,CAAY,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAA;AAAA,IACA,WAAA,EAAa,gBAAA,CAAiB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,IAClD,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;AAEA,SAAS,gBAAA,CAAiB,QAA2B,CAAA,EAA+B;AAClF,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI,MAAA,KAAW,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,sCAAQ,CAAA;AAAA,OAAA,IACjC,MAAA,KAAW,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,kDAAU,CAAA;AAAA,OAAA,IACxC,WAAW,cAAA,EAAgB;AAClC,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,CAAA,CAAE,QAAQ,CAAA,EAAG,KAAA,IAAS,CAAA,CAAE,QAAA,IAAY,EAAA;AACzF,IAAA,IAAA,CAAK,KAAK,CAAA,YAAA,EAAK,OAAO,SAAI,CAAA,CAAE,WAAA,IAAe,GAAG,CAAA,kBAAA,CAAK,CAAA;AAAA,EACrD,CAAA,MAAA,IAAW,WAAW,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA,wBAAA,EAAO,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA,eAAA,CAAO,CAAA;AAAA,OAAA,IACpE,WAAW,QAAA,EAAU,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,sBAAA,CAAS,CAAA;AAAA,OAAA,IACnD,MAAA,KAAW,iBAAiB,IAAA,CAAK,IAAA,CAAK,eAAK,CAAA,CAAE,UAAA,IAAc,IAAI,CAAA,8BAAA,CAAO,CAAA;AAC/E,EAAA,IAAI,EAAE,YAAA,EAAc,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,YAAY,CAAA,CAAA,CAAG,CAAA;AACnD,EAAA,IAAI,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,aAAA,EAAM,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AACxC,EAAA,OAAO,IAAA,CAAK,KAAK,GAAG,CAAA;AACtB;;;ACjIO,IAAM,cAAN,MAAkB;AAAA,EACf,cAAA;AAAA,EACA,QAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,cAAA;AAC9B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,IAAA,EAAiC;AACrC,IAAA,MAAM,MAAA,GAAS,mBAAmB,IAAI,CAAA;AACtC,IAAA,IAAI,KAAK,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAQ,MAAM,CAAA;AACtD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,IAAA,EAAiC;AACrC,IAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,kBAAkB,GAAA,EAA2B;AAC3C,IAAA,IAAA,CAAK,cAAA,GAAiB,GAAA;AAAA,EACxB;AACF","file":"index.cjs","sourcesContent":["/**\n * NLPG 管网场景扩展(Phase 1)\n */\nimport type { PipelineType } from '../types';\n\nexport type PipelineNlpIntent =\n | 'burst'\n | 'valve'\n | 'material_age'\n | 'pressure'\n | 'nearby'\n | 'alarm_cluster'\n | 'unknown';\n\nexport interface PipelineNlpFilters {\n pipelineType?: PipelineType;\n material?: string;\n minAgeYears?: number;\n maxAgeYears?: number;\n minPressure?: number;\n maxPressure?: number;\n radius?: number;\n timeWindow?: '1h' | '1d' | '7d' | '30d';\n region?: string;\n}\n\nexport interface PipelineNlpResult {\n intent: PipelineNlpIntent;\n filters: PipelineNlpFilters;\n description: string;\n confidence: number;\n}\n\nconst PATTERNS: Array<{ intent: PipelineNlpIntent; re: RegExp; confidence: number }> = [\n { intent: 'burst', re: /(爆管|破裂|泄漏|故障|事故|爆裂)/, confidence: 0.95 },\n { intent: 'valve', re: /(阀门|闸).*?(关闭|关|合)|(?:关闭|关|合).*?(阀门|闸)/, confidence: 0.9 },\n { intent: 'material_age', re: /(\\d+)\\s*年.*?(铸铁|钢|PE|PVC|铜)/, confidence: 0.85 },\n { intent: 'material_age', re: /(铸铁|钢|PE|PVC|铜).*?(\\d+)\\s*年/, confidence: 0.85 },\n { intent: 'pressure', re: /压力.*?(低于|高于|小于|大于|<|>|>=|<=|低|高)\\s*(\\d+\\.?\\d*)/, confidence: 0.85 },\n { intent: 'nearby', re: /(\\d+)\\s*(米|m|公里|km).*?(学校|医院|工厂|消防|政府|小区)/, confidence: 0.85 },\n { intent: 'alarm_cluster', re: /报警|告警/, confidence: 0.8 },\n];\n\nconst TYPE_REGEX: Array<{ type: PipelineType; re: RegExp }> = [\n { type: 'gas', re: /燃气|煤气|天然气/ },\n { type: 'water', re: /供水|自来水|水管/ },\n { type: 'drainage', re: /排水|污水|雨水/ },\n { type: 'heating', re: /供热|暖气|热力/ },\n { type: 'power', re: /电力|电缆|高压/ },\n { type: 'telecom', re: /通信|光纤|光缆/ },\n];\n\nconst MATERIAL_REGEX: Array<{ key: string; re: RegExp; cname: string }> = [\n { key: 'cast_iron', cname: '铸铁', re: /铸铁/ },\n { key: 'ductile_iron', cname: '球墨铸铁', re: /球墨/ },\n { key: 'steel', cname: '钢', re: /钢/ },\n { key: 'pe', cname: 'PE', re: /PE/ },\n { key: 'pvc', cname: 'PVC', re: /PVC/ },\n { key: 'concrete', cname: '混凝土', re: /混凝土/ },\n { key: 'hdpe', cname: 'HDPE', re: /HDPE/ },\n { key: 'copper', cname: '铜', re: /铜/ },\n];\n\nconst REGION_REGEX = /(朝阳区|海淀区|江岸区|江汉区|硚口区|汉阳区|武昌区|青山区|洪山区|东西湖区|黄陂区|新洲区|江夏区|蔡甸区|汉南区)/;\n\nexport function parsePipelineQuery(query: string): PipelineNlpResult {\n let best: { intent: PipelineNlpIntent; confidence: number } = { intent: 'unknown', confidence: 0 };\n for (const p of PATTERNS) {\n const m = query.match(p.re);\n if (m) {\n const c = p.confidence * (1 + 0.05 * (m[0].length / query.length));\n if (c > best.confidence) best = { intent: p.intent, confidence: Math.min(c, 1) };\n }\n }\n\n const filters: PipelineNlpFilters = {};\n for (const t of TYPE_REGEX) {\n if (t.re.test(query)) {\n filters.pipelineType = t.type;\n break;\n }\n }\n for (const m of MATERIAL_REGEX) {\n if (m.re.test(query)) {\n filters.material = m.key;\n break;\n }\n }\n const ageMatch = query.match(/(\\d+)\\s*年/);\n if (ageMatch) {\n const years = parseInt(ageMatch[1]);\n if (best.intent === 'material_age') {\n if (/超[过于]/.test(query) || /[以]?上/.test(query)) filters.minAgeYears = years;\n else if (/内|以下|不超/.test(query)) filters.maxAgeYears = years;\n else filters.minAgeYears = years;\n } else {\n filters.minAgeYears = years;\n }\n }\n const pressureMatch = query.match(/(\\d+\\.?\\d*)\\s*(MPa|mpa)/);\n if (pressureMatch) {\n const v = parseFloat(pressureMatch[1]);\n if (/低|小于|小于等于|</.test(query)) filters.maxPressure = v;\n else if (/高|大于|大于等于|>/.test(query)) filters.minPressure = v;\n else filters.maxPressure = v;\n } else if (/压力/.test(query)) {\n filters.maxPressure = 0.2; // 默认低压阈值\n }\n const distMatch = query.match(/(\\d+)\\s*(公里|km|千米|米|m)/);\n if (distMatch) {\n let d = parseInt(distMatch[1]);\n const unit = distMatch[2];\n if (/公里|km|千米/.test(unit)) d *= 1000;\n filters.radius = d;\n }\n if (/昨天/.test(query)) filters.timeWindow = '1d';\n else if (/今天/.test(query)) filters.timeWindow = '1d';\n else if (/最近一周|过去一周|7\\s*天/.test(query)) filters.timeWindow = '7d';\n else if (/最近一个月/.test(query)) filters.timeWindow = '30d';\n const regionMatch = query.match(REGION_REGEX);\n if (regionMatch) filters.region = regionMatch[1];\n\n return {\n intent: best.intent,\n filters,\n description: buildDescription(best.intent, filters),\n confidence: best.confidence,\n };\n}\n\nfunction buildDescription(intent: PipelineNlpIntent, f: PipelineNlpFilters): string {\n const desc: string[] = [];\n if (intent === 'burst') desc.push('触发爆管推演');\n else if (intent === 'valve') desc.push('查询阀门关闭影响');\n else if (intent === 'material_age') {\n const matName = MATERIAL_REGEX.find((m) => m.key === f.material)?.cname ?? f.material ?? '';\n desc.push(`筛选${matName}管${f.minAgeYears ?? '?'}年以上`);\n } else if (intent === 'pressure') desc.push(`筛选压力${f.maxPressure ?? ''}MPa以下`);\n else if (intent === 'nearby') desc.push(`${f.radius}m内查找POI`);\n else if (intent === 'alarm_cluster') desc.push(`查询${f.timeWindow ?? '1d'}内报警聚集`);\n if (f.pipelineType) desc.push(`[${f.pipelineType}]`);\n if (f.region) desc.push(`区域:${f.region}`);\n return desc.join(' ');\n}\n","/**\n * PipelineNlp 组件类(占位 stub)\n *\n * 包装 parsePipelineQuery + 与 BurstSimulator 路由集成\n */\n\nimport { parsePipelineQuery, type PipelineNlpResult, type PipelineNlpIntent } from './pipelineNlp';\nimport type { BurstSimulator } from '../burst/burstClass';\n\nexport interface PipelineNlpOptions {\n burstSimulator?: BurstSimulator;\n onIntent?: (intent: PipelineNlpIntent, result: PipelineNlpResult) => void;\n}\n\nexport class PipelineNlp {\n private burstSimulator?: BurstSimulator;\n private onIntent?: PipelineNlpOptions['onIntent'];\n\n constructor(options: PipelineNlpOptions = {}) {\n this.burstSimulator = options.burstSimulator;\n this.onIntent = options.onIntent;\n }\n\n /** 解析并按意图触发动作 */\n query(text: string): PipelineNlpResult {\n const result = parsePipelineQuery(text);\n if (this.onIntent) this.onIntent(result.intent, result);\n return result;\n }\n\n /** 仅解析不触发动作 */\n parse(text: string): PipelineNlpResult {\n return parsePipelineQuery(text);\n }\n\n /** 关联 BurstSimulator */\n setBurstSimulator(sim: BurstSimulator): void {\n this.burstSimulator = sim;\n }\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import { PipelineType } from '../types/index.cjs';
2
+ import { c as BurstSimulator } from '../burstClass-CGMjcAYy.cjs';
3
+ import '@caoguo/maplibre';
4
+
5
+ /**
6
+ * NLPG 管网场景扩展(Phase 1)
7
+ */
8
+
9
+ type PipelineNlpIntent = 'burst' | 'valve' | 'material_age' | 'pressure' | 'nearby' | 'alarm_cluster' | 'unknown';
10
+ interface PipelineNlpFilters {
11
+ pipelineType?: PipelineType;
12
+ material?: string;
13
+ minAgeYears?: number;
14
+ maxAgeYears?: number;
15
+ minPressure?: number;
16
+ maxPressure?: number;
17
+ radius?: number;
18
+ timeWindow?: '1h' | '1d' | '7d' | '30d';
19
+ region?: string;
20
+ }
21
+ interface PipelineNlpResult {
22
+ intent: PipelineNlpIntent;
23
+ filters: PipelineNlpFilters;
24
+ description: string;
25
+ confidence: number;
26
+ }
27
+ declare function parsePipelineQuery(query: string): PipelineNlpResult;
28
+
29
+ /**
30
+ * PipelineNlp 组件类(占位 stub)
31
+ *
32
+ * 包装 parsePipelineQuery + 与 BurstSimulator 路由集成
33
+ */
34
+
35
+ interface PipelineNlpOptions {
36
+ burstSimulator?: BurstSimulator;
37
+ onIntent?: (intent: PipelineNlpIntent, result: PipelineNlpResult) => void;
38
+ }
39
+ declare class PipelineNlp {
40
+ private burstSimulator?;
41
+ private onIntent?;
42
+ constructor(options?: PipelineNlpOptions);
43
+ /** 解析并按意图触发动作 */
44
+ query(text: string): PipelineNlpResult;
45
+ /** 仅解析不触发动作 */
46
+ parse(text: string): PipelineNlpResult;
47
+ /** 关联 BurstSimulator */
48
+ setBurstSimulator(sim: BurstSimulator): void;
49
+ }
50
+
51
+ export { PipelineNlp, type PipelineNlpFilters, type PipelineNlpIntent, type PipelineNlpOptions, type PipelineNlpResult, parsePipelineQuery };
@@ -0,0 +1,51 @@
1
+ import { PipelineType } from '../types/index.js';
2
+ import { c as BurstSimulator } from '../burstClass-Cf2p71LE.js';
3
+ import '@caoguo/maplibre';
4
+
5
+ /**
6
+ * NLPG 管网场景扩展(Phase 1)
7
+ */
8
+
9
+ type PipelineNlpIntent = 'burst' | 'valve' | 'material_age' | 'pressure' | 'nearby' | 'alarm_cluster' | 'unknown';
10
+ interface PipelineNlpFilters {
11
+ pipelineType?: PipelineType;
12
+ material?: string;
13
+ minAgeYears?: number;
14
+ maxAgeYears?: number;
15
+ minPressure?: number;
16
+ maxPressure?: number;
17
+ radius?: number;
18
+ timeWindow?: '1h' | '1d' | '7d' | '30d';
19
+ region?: string;
20
+ }
21
+ interface PipelineNlpResult {
22
+ intent: PipelineNlpIntent;
23
+ filters: PipelineNlpFilters;
24
+ description: string;
25
+ confidence: number;
26
+ }
27
+ declare function parsePipelineQuery(query: string): PipelineNlpResult;
28
+
29
+ /**
30
+ * PipelineNlp 组件类(占位 stub)
31
+ *
32
+ * 包装 parsePipelineQuery + 与 BurstSimulator 路由集成
33
+ */
34
+
35
+ interface PipelineNlpOptions {
36
+ burstSimulator?: BurstSimulator;
37
+ onIntent?: (intent: PipelineNlpIntent, result: PipelineNlpResult) => void;
38
+ }
39
+ declare class PipelineNlp {
40
+ private burstSimulator?;
41
+ private onIntent?;
42
+ constructor(options?: PipelineNlpOptions);
43
+ /** 解析并按意图触发动作 */
44
+ query(text: string): PipelineNlpResult;
45
+ /** 仅解析不触发动作 */
46
+ parse(text: string): PipelineNlpResult;
47
+ /** 关联 BurstSimulator */
48
+ setBurstSimulator(sim: BurstSimulator): void;
49
+ }
50
+
51
+ export { PipelineNlp, type PipelineNlpFilters, type PipelineNlpIntent, type PipelineNlpOptions, type PipelineNlpResult, parsePipelineQuery };
@@ -0,0 +1,3 @@
1
+ export { PipelineNlp, parsePipelineQuery } from '../chunk-YBLESEN4.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}