@caoguo/maplibre-pipeline 0.0.2 → 0.0.5

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 (55) hide show
  1. package/dist/burst/index.cjs +708 -0
  2. package/dist/burst/index.cjs.map +1 -0
  3. package/dist/burst/index.js +4 -0
  4. package/dist/burst/index.js.map +1 -0
  5. package/dist/burstClass-CGMjcAYy.d.cts +161 -0
  6. package/dist/burstClass-Cf2p71LE.d.ts +161 -0
  7. package/dist/chunk-3656CGXE.js +340 -0
  8. package/dist/chunk-3656CGXE.js.map +1 -0
  9. package/dist/chunk-BWQKY35F.js +259 -0
  10. package/dist/chunk-BWQKY35F.js.map +1 -0
  11. package/dist/chunk-CDEYJ67B.js +80 -0
  12. package/dist/chunk-CDEYJ67B.js.map +1 -0
  13. package/dist/chunk-E4BRNDKY.js +13 -0
  14. package/dist/chunk-E4BRNDKY.js.map +1 -0
  15. package/dist/chunk-GCDA7KJM.js +289 -0
  16. package/dist/chunk-GCDA7KJM.js.map +1 -0
  17. package/dist/chunk-HCT6NSNS.js +532 -0
  18. package/dist/chunk-HCT6NSNS.js.map +1 -0
  19. package/dist/chunk-QVY4WJLM.js +256 -0
  20. package/dist/chunk-QVY4WJLM.js.map +1 -0
  21. package/dist/chunk-VSTG2ZUY.js +352 -0
  22. package/dist/chunk-VSTG2ZUY.js.map +1 -0
  23. package/dist/chunk-YBLESEN4.js +133 -0
  24. package/dist/chunk-YBLESEN4.js.map +1 -0
  25. package/dist/chunk-YS2ICFVK.js +101 -0
  26. package/dist/chunk-YS2ICFVK.js.map +1 -0
  27. package/dist/graph/index.cjs +382 -0
  28. package/dist/graph/index.cjs.map +1 -0
  29. package/dist/graph/index.js +4 -0
  30. package/dist/graph/index.js.map +1 -0
  31. package/dist/health/index.cjs +348 -0
  32. package/dist/health/index.cjs.map +1 -0
  33. package/dist/health/index.js +3 -0
  34. package/dist/health/index.js.map +1 -0
  35. package/dist/index.cjs +2389 -0
  36. package/dist/index.cjs.map +1 -0
  37. package/dist/index.d.cts +10 -0
  38. package/dist/index.d.ts +10 -0
  39. package/dist/index.js +12 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/leakage/index.cjs +7 -6
  42. package/dist/leakage/index.cjs.map +1 -1
  43. package/dist/leakage/index.d.cts +4 -3
  44. package/dist/leakage/index.d.ts +4 -3
  45. package/dist/leakage/index.js +1 -1
  46. package/dist/topology/index.cjs +113 -14
  47. package/dist/topology/index.cjs.map +1 -1
  48. package/dist/topology/index.d.cts +65 -15
  49. package/dist/topology/index.d.ts +65 -15
  50. package/dist/topology/index.js +1 -1
  51. package/dist/types/index.cjs.map +1 -1
  52. package/dist/types/index.d.cts +4 -0
  53. package/dist/types/index.d.ts +4 -0
  54. package/dist/types/index.js +1 -1
  55. package/package.json +6 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/leakage/pasquillGifford.ts","../src/leakage/gaussianPlume.ts","../src/leakage/floodFill.ts","../src/leakage/LeakagePlume.ts"],"names":[],"mappings":"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","file":"chunk-VSTG2ZUY.js","sourcesContent":["/**\n * Pasquill-Gifford 大气稳定度参数(PRD §4.3.2)\n *\n * 根据风速 + 日射强度 + 夜间云量,对应稳定度类别 A-F\n * A: 极不稳定,B: 不稳定,C: 弱不稳定,D: 中性,E: 弱稳定,F: 稳定\n *\n * 用于高斯烟羽模型的扩散系数 σy/σz 估计。\n */\n\nexport type StabilityClass = 'A' | 'B' | 'C' | 'D' | 'E' | 'F';\n\nexport interface PasquillGiffordParams {\n /** 风速 m/s */\n windSpeed: number;\n /** 日射强度(白天):强/中等/弱 */\n daytimeInsolation?: 'strong' | 'moderate' | 'slight';\n /** 夜间云量(阴天/部分/晴朗) */\n nightCloudCover?: 'overcast' | 'partly' | 'clear';\n /** 是否白天 */\n isDaytime: boolean;\n}\n\n// 修正后的 Pasquill-Gifford 稳定度分类\n// 参考 EPA 工业源空气污染(ISC)模型常用分类\nconst TABLE_DAY: Array<{ wind: number; cls: Record<string, StabilityClass> }> = [\n { wind: 2, cls: { strong: 'A', moderate: 'A', slight: 'B' } },\n { wind: 3, cls: { strong: 'A', moderate: 'B', slight: 'C' } },\n { wind: 5, cls: { strong: 'B', moderate: 'B', slight: 'C' } },\n { wind: 6, cls: { strong: 'C', moderate: 'C', slight: 'D' } },\n { wind: 7, cls: { strong: 'C', moderate: 'D', slight: 'D' } },\n { wind: 999, cls: { strong: 'D', moderate: 'D', slight: 'D' } },\n];\n\nconst TABLE_NIGHT: Array<{ wind: number; cls: Record<string, StabilityClass> }> = [\n { wind: 2, cls: { overcast: 'F', partly: 'F', clear: 'F' } },\n { wind: 3, cls: { overcast: 'E', partly: 'F', clear: 'F' } },\n { wind: 5, cls: { overcast: 'D', partly: 'E', clear: 'F' } },\n { wind: 6, cls: { overcast: 'D', partly: 'D', clear: 'E' } },\n { wind: 999, cls: { overcast: 'D', partly: 'D', clear: 'D' } },\n];\n\n/**\n * 根据 Pasquill-Gifford 表格,确定稳定度类别\n */\nexport function classifyStability(params: PasquillGiffordParams): StabilityClass {\n const table = params.isDaytime ? TABLE_DAY : TABLE_NIGHT;\n const key = params.isDaytime\n ? (params.daytimeInsolation ?? 'moderate')\n : (params.nightCloudCover ?? 'partly');\n\n for (const row of table) {\n if (params.windSpeed < row.wind) return (row.cls as Record<string, StabilityClass>)[key] ?? 'D';\n }\n return 'D';\n}\n\nexport interface DispersionCoefficients {\n /** σy(m),下风向距离 x 的函数 */\n sigmaY: (x: number) => number;\n /** σz(m),下风向距离 x 的函数 */\n sigmaZ: (x: number) => number;\n}\n\n/**\n * Pasquill-Gifford 扩散系数(Briggs 经验公式)\n * σy, σz = a * x / √(1 + b*x)\n *\n * x 单位 km(外部调用时换算:x (m) / 1000)\n *\n * 表格源自 USEPA ISC3 模型常用设置(单位: m/km 与 1/km)\n */\nexport function dispersionCoefficients(stability: StabilityClass): DispersionCoefficients {\n // [σy 前系数, σy 分母修正系数, σz 前系数, σz 分母修正系数]\n const params: Record<StabilityClass, [number, number, number, number]> = {\n A: [0.22, 0.0001, 0.20, 0.000],\n B: [0.16, 0.0001, 0.12, 0.000],\n C: [0.11, 0.0001, 0.08, 0.0002],\n D: [0.08, 0.0001, 0.06, 0.0015],\n E: [0.06, 0.0001, 0.03, 0.0003],\n F: [0.04, 0.0001, 0.016, 0.0003],\n };\n const [a, b, c, d] = params[stability];\n return {\n sigmaY: (xMeters: number) => {\n const xKm = xMeters / 1000;\n return (a * xKm) / Math.sqrt(1 + b * xKm) * 1000;\n },\n sigmaZ: (xMeters: number) => {\n const xKm = xMeters / 1000;\n return (c * xKm) / Math.sqrt(1 + d * xKm) * 1000;\n },\n };\n}\n","/**\n * 高斯烟羽模型(Gaussian Plume)\n *\n * 用于燃气泄漏扩散模拟(PRD §4.3.2):\n * C(x, y, z) = Q / (2π · σy · σz · u) × exp(-y²/2σy²) ×\n * [exp(-(z-H)²/2σz²) + exp(-(z+H)²/2σz²)]\n *\n * 输入:\n * - sourceCoord(泄漏点):lng/lat\n * - Q:泄漏速率(kg/s)\n * - u:风速(m/s)\n * - windDirection:风向(弧度,0=东)\n * - stability:大气稳定度 A-F\n * - H:泄漏源高度(m)\n * - threshold:警戒浓度(如 20%LEL)\n *\n * 输出:\n * - 等浓度线多边形(不同浓度等级)\n * - 下风向最大影响距离\n */\n\nimport type { DispersionCoefficients } from './pasquillGifford';\nimport { dispersionCoefficients, classifyStability } from './pasquillGifford';\n\nexport interface GasLeakParams {\n /** 风向(弧度,0=东,PI/2=北) */\n windDirection: number;\n /** 风速 m/s */\n windSpeed: number;\n /** 泄漏速率 kg/s */\n leakRate: number;\n /** 释放高度 m */\n releaseHeight: number;\n /** 大气稳定度(可选,不传则自动分类) */\n stability?: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';\n /** 浓度阈值(kg/m³)列表 */\n thresholds?: number[];\n /** 网格步长(m)默认 50 */\n gridStep?: number;\n /** 计算范围(m)默认 5000 */\n range?: number;\n}\n\nexport interface GasLeakResult {\n /** 泄漏点 */\n source: { lng: number; lat: number };\n /** 风向(弧度) */\n windDirection: number;\n /** 风速 m/s */\n windSpeed: number;\n /** 大气稳定度 */\n stability: 'A' | 'B' | 'C' | 'D' | 'E' | 'F';\n /** 等浓度线多边形(阈值对应) */\n contours: ConcentrationContour[];\n /** 下风向最大影响距离(m) */\n maxDownwindDistance: number;\n}\n\nexport interface ConcentrationContour {\n /** 阈值 */\n threshold: number;\n /** 多边形(顺时针 GeoJSON-like) */\n polygon: [number, number][];\n /** 是否闭合 */\n closed: boolean;\n}\n\n/**\n * 计算泄漏源下风向的浓度分布,输出等浓度线多边形\n */\nexport function gaussianPlume(\n source: { lng: number; lat: number },\n params: GasLeakParams\n): GasLeakResult {\n const stability = params.stability ?? 'D';\n const { sigmaY, sigmaZ } = dispersionCoefficients(stability);\n const thresholds = params.thresholds ?? [0.001, 0.005, 0.01];\n const step = params.gridStep ?? 50;\n const range = params.range ?? 5000;\n\n const contourList: ConcentrationContour[] = thresholds.map((t) => ({\n threshold: t,\n polygon: [],\n closed: false,\n }));\n\n // 采样网格:下风向 + 横向\n // 用极坐标(r, theta)→ 转笛卡尔 → lng/lat\n const Q = params.leakRate;\n const u = params.windSpeed;\n const H = params.releaseHeight;\n\n let maxDownwindDistance = 0;\n\n for (const c of contourList) {\n const points: [number, number][] = [];\n // 从近到远扫描 r,找满足 c(r) >= threshold 的最大 r\n for (let r = step; r <= range; r += step) {\n const sy = sigmaY(r);\n const sz = sigmaZ(r);\n if (sy <= 0 || sz <= 0) continue;\n const concCenter = Q / (2 * Math.PI * sy * sz * u);\n const zTerm = 2 * Math.exp(-(H * H) / (2 * sz * sz));\n const cMax = concCenter * zTerm;\n if (cMax >= c.threshold) {\n points.push([r, 0]);\n if (r > maxDownwindDistance) maxDownwindDistance = r;\n }\n }\n\n // 多边形 = 各 r 对应的横向扩展(在每个 r 处 y 范围由 σy 决定)\n const poly: [number, number][] = [];\n for (let r = step; r <= range; r += step) {\n const sy = sigmaY(r);\n if (sy <= 0) continue;\n const syy = Q / (2 * Math.PI * sy * sigmaZ(r) * u) * 2;\n if (syy < c.threshold) continue;\n // 横向浓度 = (Q / 2πσyσzu) × exp(-y²/2σy²) × 2\n // 解出 y:exp(-y²/2σy²) = c.threshold * 2πσyσzu / Q\n // y² = -2σy² ln(...)\n const ratio = (c.threshold * Math.PI * sy * sigmaZ(r) * u) / Q;\n if (ratio >= 1) continue; // 浓度太弱,不存在等值线\n const yMax = sy * Math.sqrt(-2 * Math.log(ratio));\n poly.push([r, yMax]);\n poly.unshift([r, -yMax]);\n }\n c.polygon = polyToLngLat(source, params.windDirection, poly);\n c.closed = poly.length >= 3;\n }\n\n return {\n source,\n windDirection: params.windDirection,\n windSpeed: params.windSpeed,\n stability,\n contours: contourList,\n maxDownwindDistance,\n };\n}\n\n/** 把 (r, y) 极坐标点转换为 (lng, lat) */\nfunction polyToLngLat(\n source: { lng: number; lat: number },\n windDir: number,\n poly: [number, number][]\n): [number, number][] {\n return poly.map(([r, y]) => {\n // 下风向 = windDir 方向;横向 = windDir - π/2(垂直右)\n // 设下风向单位向量 (cosθ, sinθ),横向单位向量 (-sinθ, cosθ)\n // 笛卡尔:dx = r * cosθ + y * (-sinθ), dy = r * sinθ + y * cosθ\n const cosW = Math.cos(windDir);\n const sinW = Math.sin(windDir);\n const dx = r * cosW + y * -sinW;\n const dy = r * sinW + y * cosW;\n\n const dLat = dy / 110540;\n const dLng = dx / (111320 * Math.cos((source.lat * Math.PI) / 180));\n return [source.lng + dLng, source.lat + dLat];\n });\n}\n\n/** 根据气象数据自动确定稳定度类别(便利入口) */\nexport function classifyFromMeteo(opts: {\n windSpeed: number;\n isDaytime: boolean;\n daytimeInsolation?: 'strong' | 'moderate' | 'slight';\n nightCloudCover?: 'overcast' | 'partly' | 'clear';\n}) {\n return classifyStability(opts);\n}\n\nexport { dispersionCoefficients };\nexport type { DispersionCoefficients };\n","/**\n * 供水爆管淹没分析(基于地形的 flood fill)\n *\n * 输入:\n * - DEM:高程网格(lng, lat → elevation)\n * - source:爆管点\n * - 网格分辨率\n *\n * 算法:\n * - 从爆管点出发,flood fill 到相邻低洼地\n * - 估算淹没范围\n */\n\nexport interface DemGrid {\n /** 西南角 lng/lat */\n west: number;\n south: number;\n /** 网格行列数 */\n cols: number;\n rows: number;\n /** 单元尺寸(度) */\n cellSize: number;\n /** 高程数组(row-major,rows × cols) */\n elevations: number[];\n}\n\nexport interface FloodParams {\n sourceLng: number;\n sourceLat: number;\n /** 起始水位(m),默认 0 */\n initialWaterLevel?: number;\n /** 模拟时长(秒),默认 30min */\n duration?: number;\n /** 流量估算(m³/h),默认按中等爆管 50 */\n flowRate?: number;\n}\n\nexport interface FloodResult {\n source: { lng: number; lat: number };\n /** 淹没面积(m²) */\n floodArea: number;\n /** 受影响网格(高程 < 水位) */\n affectedCells: Array<{ lng: number; lat: number; elevation: number; waterDepth: number }>;\n /** 凸包多边形 */\n hull: [number, number][];\n /** 最大水深 */\n maxDepth: number;\n}\n\n/**\n * 简单 flood fill 模拟(按等高线分布)\n */\nexport function simulateFlood(dem: DemGrid, params: FloodParams): FloodResult {\n const t0 = Date.now();\n const sourceIdx = lngLatToIndex(dem, params.sourceLng, params.sourceLat);\n if (sourceIdx.row < 0 || sourceIdx.row >= dem.rows || sourceIdx.col < 0 || sourceIdx.col >= dem.cols) {\n return {\n source: { lng: params.sourceLng, lat: params.sourceLat },\n floodArea: 0,\n affectedCells: [],\n hull: [],\n maxDepth: 0,\n };\n }\n\n const sourceElev = dem.elevations[sourceIdx.row * dem.cols + sourceIdx.col] ?? 0;\n const durationMin = (params.duration ?? 30 * 60) / 60; // s → min\n const flowM3h = params.flowRate ?? 50;\n const volumeM3 = flowM3h * (durationMin / 60); // m³\n const initialLevel = params.initialWaterLevel ?? sourceElev + 0.05;\n\n // 简化:假设水平摊开,直至水量耗尽或边界阻挡\n const visited = new Set<number>();\n const affected: FloodResult['affectedCells'] = [];\n const queue: Array<{ row: number; col: number; level: number }> = [];\n queue.push({ row: sourceIdx.row, col: sourceIdx.col, level: initialLevel });\n\n let maxDepth = 0;\n\n while (queue.length > 0) {\n const cur = queue.shift()!;\n const idx = cur.row * dem.cols + cur.col;\n if (visited.has(idx)) continue;\n visited.add(idx);\n\n if (cur.row < 0 || cur.row >= dem.rows) continue;\n if (cur.col < 0 || cur.col >= dem.cols) continue;\n\n const elev = dem.elevations[idx] ?? 0;\n const depth = cur.level - elev;\n if (depth <= 0) continue;\n if (depth > maxDepth) maxDepth = depth;\n\n const lng = dem.west + cur.col * dem.cellSize + dem.cellSize / 2;\n const lat = dem.south + cur.row * dem.cellSize + dem.cellSize / 2;\n affected.push({ lng, lat, elevation: elev, waterDepth: depth });\n\n // 4 邻居\n const nextLevel = cur.level - 0.01;\n for (const [dr, dc] of [\n [0, 1],\n [0, -1],\n [1, 0],\n [-1, 0],\n ] as Array<[number, number]>) {\n queue.push({ row: cur.row + dr, col: cur.col + dc, level: nextLevel });\n }\n }\n\n const cellArea = (dem.cellSize * 111320) * (dem.cellSize * 110540);\n const floodArea = affected.length * cellArea;\n\n const hull: [number, number][] = convexHullLocal(affected.map((c) => [c.lng, c.lat]));\n\n return {\n source: { lng: params.sourceLng, lat: params.sourceLat },\n floodArea,\n affectedCells: affected,\n hull,\n maxDepth,\n };\n}\n\nfunction lngLatToIndex(dem: DemGrid, lng: number, lat: number): { row: number; col: number } {\n const col = Math.floor((lng - dem.west) / dem.cellSize);\n const row = Math.floor((lat - dem.south) / dem.cellSize);\n return { row, col };\n}\n\nfunction convexHullLocal(points: [number, number][]): [number, number][] {\n if (points.length < 3) return [...points];\n const pts = [...points].sort((a, b) => (a[0] - b[0]) || (a[1] - b[1]));\n const cross = (\n o: [number, number],\n a: [number, number],\n b: [number, number]\n ): number => (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);\n const lower: [number, number][] = [];\n for (const p of pts) {\n while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], p) <= 0) lower.pop();\n lower.push(p);\n }\n const upper: [number, number][] = [];\n for (let i = pts.length - 1; i >= 0; i--) {\n const p = pts[i];\n while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], p) <= 0) upper.pop();\n upper.push(p);\n }\n upper.pop();\n lower.pop();\n return lower.concat(upper);\n}\n","/**\n * LeakagePlume 组件类(地图集成层)\n *\n * 包装高斯烟羽扩散(gaussianPlume)与淹没范围(simulateFlood)纯函数,\n * 维护 MapLibre 图层状态,对外暴露浓度云图 / 淹没范围渲染 API。\n * 不依赖 Vue/React,可在任意框架实例化。\n */\n\nimport type { Map as CaoguoMap } from '@caoguo/maplibre';\nimport { upsertSource } from '@caoguo/maplibre';\nimport type { GasLeakParams, GasLeakResult } from './gaussianPlume';\nimport { gaussianPlume } from './gaussianPlume';\nimport type { FloodParams, FloodResult } from './floodFill';\nimport { simulateFlood } from './floodFill';\nimport type { DemGrid } from './floodFill';\n\nexport type { GasLeakParams, GasLeakResult, FloodParams, FloodResult, DemGrid };\n\nexport interface LeakagePlumeOptions {\n map: CaoguoMap;\n /** 浓度阈值(kg/m³),可分级 */\n thresholds?: number[];\n /** 层 ID 前缀 */\n layerPrefix?: string;\n /** 区域填充色 */\n fillColor?: string;\n}\n\ntype Listener = (r: GasLeakResult | FloodResult) => void;\n\n/**\n * LeakagePlume 组件(燃气泄漏 / 供水爆管)\n *\n * 用法:\n * const plume = new LeakagePlume({ map });\n * plume.simulateGas({ lng, lat }, { windDirection: 1.5, windSpeed: 3, ... });\n * plume.simulateFlood(demGrid, { sourceLng, sourceLat });\n */\nexport class LeakagePlume {\n private map: CaoguoMap;\n private thresholds: number[];\n private layerPrefix: string;\n private fillColor: string;\n private layerIds: string[] = [];\n private listeners = new Set<Listener>();\n private lastResult: GasLeakResult | FloodResult | null = null;\n\n constructor(options: LeakagePlumeOptions) {\n this.map = options.map;\n this.thresholds = options.thresholds ?? [0.001, 0.005, 0.01];\n this.layerPrefix = options.layerPrefix ?? 'cg-leakage';\n this.fillColor = options.fillColor ?? '#fb923c';\n }\n\n /** 燃气泄漏扩散模拟 */\n simulateGas(\n source: { lng: number; lat: number },\n params: Omit<GasLeakParams, 'thresholds'>\n ): GasLeakResult {\n const result = gaussianPlume(source, { ...params, thresholds: this.thresholds });\n this.lastResult = result;\n this.renderGas(result);\n for (const l of this.listeners) l(result);\n return result;\n }\n\n /** 供水爆管淹没模拟 */\n simulateFlood(dem: DemGrid, params: FloodParams): FloodResult {\n const result = simulateFlood(dem, params);\n this.lastResult = result;\n this.renderFlood(result);\n for (const l of this.listeners) l(result);\n return result;\n }\n\n /** 清空图层 */\n clear(): void {\n for (const id of this.layerIds) {\n this.map.removeLayer(id);\n }\n this.layerIds = [];\n }\n\n /** 销毁组件 */\n destroy(): void {\n this.clear();\n this.listeners.clear();\n this.lastResult = null;\n }\n\n /** 订阅结果 */\n onResult(fn: Listener): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n /** 取最后一次结果 */\n getLastResult(): GasLeakResult | FloodResult | null {\n return this.lastResult;\n }\n\n // --------------------------------------------------\n // 内部渲染(GeoJSON 多边形叠加)\n // --------------------------------------------------\n private renderGas(result: GasLeakResult): void {\n this.renderContours(\n result.contours.map((c) => ({\n polygon: c.polygon,\n threshold: c.threshold,\n })),\n result.source\n );\n }\n\n private renderFlood(result: FloodResult): void {\n if (result.hull.length < 3) return;\n const mlMap = (this.map as unknown as {\n instance: {\n addSource: (id: string, source: unknown) => void;\n addLayer: (layer: unknown) => void;\n getSource: (id: string) => unknown;\n };\n }).instance;\n\n const data: GeoJSON.Feature<GeoJSON.Polygon> = {\n type: 'Feature',\n geometry: { type: 'Polygon', coordinates: [result.hull] },\n properties: { threshold: 0 },\n };\n\n const id = `${this.layerPrefix}-flood-fill`;\n upsertSource(mlMap, id, data);\n try {\n mlMap.addLayer({\n id,\n type: 'fill',\n source: id,\n paint: {\n 'fill-color': '#3b82f6',\n 'fill-opacity': 0.3,\n 'fill-outline-color': '#1e40af',\n },\n });\n this.layerIds.push(id);\n } catch {\n // ignore\n }\n }\n\n private renderContours(\n contours: Array<{ polygon: [number, number][]; threshold: number }>,\n source: { lng: number; lat: number }\n ): void {\n const mlMap = (this.map as unknown as {\n instance: {\n addSource: (id: string, source: unknown) => void;\n addLayer: (layer: unknown) => void;\n getSource: (id: string) => unknown;\n };\n }).instance;\n\n const data: GeoJSON.FeatureCollection<GeoJSON.Polygon> = {\n type: 'FeatureCollection',\n features: contours\n .filter((c) => c.polygon.length >= 3)\n .map((c) => ({\n type: 'Feature' as const,\n geometry: { type: 'Polygon' as const, coordinates: [c.polygon] },\n properties: { threshold: c.threshold },\n })),\n };\n\n const sourceId = `${this.layerPrefix}-gas-src`;\n const layerId = `${this.layerPrefix}-gas-fill`;\n upsertSource(mlMap, sourceId, data);\n try {\n mlMap.addLayer({\n id: layerId,\n type: 'fill',\n source: sourceId,\n paint: {\n 'fill-color': [\n 'step',\n ['get', 'threshold'],\n this.fillColor,\n 0.005,\n '#f97316',\n 0.01,\n '#ef4444',\n ] as unknown,\n 'fill-opacity': 0.35,\n 'fill-outline-color': this.fillColor,\n },\n });\n this.layerIds.push(layerId);\n } catch {\n // ignore\n }\n\n // 标记泄漏点(幂等:模拟重渲染时 source 可能已存在)\n const ptId = `${this.layerPrefix}-source`;\n const ptData = {\n type: 'FeatureCollection' as const,\n features: [\n {\n type: 'Feature' as const,\n geometry: { type: 'Point' as const, coordinates: [source.lng, source.lat] },\n properties: {},\n },\n ],\n };\n upsertSource(mlMap, ptId, ptData);\n try {\n mlMap.addLayer({\n id: ptId,\n type: 'circle',\n source: ptId,\n paint: {\n 'circle-radius': 10,\n 'circle-color': '#fbbf24',\n 'circle-stroke-width': 3,\n 'circle-stroke-color': '#000',\n },\n });\n this.layerIds.push(ptId);\n } catch {\n // ignore\n }\n }\n}\n"]}
@@ -0,0 +1,133 @@
1
+ // src/nlpg/pipelineNlp.ts
2
+ var PATTERNS = [
3
+ { intent: "burst", re: /(爆管|破裂|泄漏|故障|事故|爆裂)/, confidence: 0.95 },
4
+ { intent: "valve", re: /(阀门|闸).*?(关闭|关|合)|(?:关闭|关|合).*?(阀门|闸)/, confidence: 0.9 },
5
+ { intent: "material_age", re: /(\d+)\s*年.*?(铸铁|钢|PE|PVC|铜)/, confidence: 0.85 },
6
+ { intent: "material_age", re: /(铸铁|钢|PE|PVC|铜).*?(\d+)\s*年/, confidence: 0.85 },
7
+ { intent: "pressure", re: /压力.*?(低于|高于|小于|大于|<|>|>=|<=|低|高)\s*(\d+\.?\d*)/, confidence: 0.85 },
8
+ { intent: "nearby", re: /(\d+)\s*(米|m|公里|km).*?(学校|医院|工厂|消防|政府|小区)/, confidence: 0.85 },
9
+ { intent: "alarm_cluster", re: /报警|告警/, confidence: 0.8 }
10
+ ];
11
+ var TYPE_REGEX = [
12
+ { type: "gas", re: /燃气|煤气|天然气/ },
13
+ { type: "water", re: /供水|自来水|水管/ },
14
+ { type: "drainage", re: /排水|污水|雨水/ },
15
+ { type: "heating", re: /供热|暖气|热力/ },
16
+ { type: "power", re: /电力|电缆|高压/ },
17
+ { type: "telecom", re: /通信|光纤|光缆/ }
18
+ ];
19
+ var MATERIAL_REGEX = [
20
+ { key: "cast_iron", cname: "\u94F8\u94C1", re: /铸铁/ },
21
+ { key: "ductile_iron", cname: "\u7403\u58A8\u94F8\u94C1", re: /球墨/ },
22
+ { key: "steel", cname: "\u94A2", re: /钢/ },
23
+ { key: "pe", cname: "PE", re: /PE/ },
24
+ { key: "pvc", cname: "PVC", re: /PVC/ },
25
+ { key: "concrete", cname: "\u6DF7\u51DD\u571F", re: /混凝土/ },
26
+ { key: "hdpe", cname: "HDPE", re: /HDPE/ },
27
+ { key: "copper", cname: "\u94DC", re: /铜/ }
28
+ ];
29
+ var REGION_REGEX = /(朝阳区|海淀区|江岸区|江汉区|硚口区|汉阳区|武昌区|青山区|洪山区|东西湖区|黄陂区|新洲区|江夏区|蔡甸区|汉南区)/;
30
+ function parsePipelineQuery(query) {
31
+ let best = { intent: "unknown", confidence: 0 };
32
+ for (const p of PATTERNS) {
33
+ const m = query.match(p.re);
34
+ if (m) {
35
+ const c = p.confidence * (1 + 0.05 * (m[0].length / query.length));
36
+ if (c > best.confidence) best = { intent: p.intent, confidence: Math.min(c, 1) };
37
+ }
38
+ }
39
+ const filters = {};
40
+ for (const t of TYPE_REGEX) {
41
+ if (t.re.test(query)) {
42
+ filters.pipelineType = t.type;
43
+ break;
44
+ }
45
+ }
46
+ for (const m of MATERIAL_REGEX) {
47
+ if (m.re.test(query)) {
48
+ filters.material = m.key;
49
+ break;
50
+ }
51
+ }
52
+ const ageMatch = query.match(/(\d+)\s*年/);
53
+ if (ageMatch) {
54
+ const years = parseInt(ageMatch[1]);
55
+ if (best.intent === "material_age") {
56
+ if (/超[过于]/.test(query) || /[以]?上/.test(query)) filters.minAgeYears = years;
57
+ else if (/内|以下|不超/.test(query)) filters.maxAgeYears = years;
58
+ else filters.minAgeYears = years;
59
+ } else {
60
+ filters.minAgeYears = years;
61
+ }
62
+ }
63
+ const pressureMatch = query.match(/(\d+\.?\d*)\s*(MPa|mpa)/);
64
+ if (pressureMatch) {
65
+ const v = parseFloat(pressureMatch[1]);
66
+ if (/低|小于|小于等于|</.test(query)) filters.maxPressure = v;
67
+ else if (/高|大于|大于等于|>/.test(query)) filters.minPressure = v;
68
+ else filters.maxPressure = v;
69
+ } else if (/压力/.test(query)) {
70
+ filters.maxPressure = 0.2;
71
+ }
72
+ const distMatch = query.match(/(\d+)\s*(公里|km|千米|米|m)/);
73
+ if (distMatch) {
74
+ let d = parseInt(distMatch[1]);
75
+ const unit = distMatch[2];
76
+ if (/公里|km|千米/.test(unit)) d *= 1e3;
77
+ filters.radius = d;
78
+ }
79
+ if (/昨天/.test(query)) filters.timeWindow = "1d";
80
+ else if (/今天/.test(query)) filters.timeWindow = "1d";
81
+ else if (/最近一周|过去一周|7\s*天/.test(query)) filters.timeWindow = "7d";
82
+ else if (/最近一个月/.test(query)) filters.timeWindow = "30d";
83
+ const regionMatch = query.match(REGION_REGEX);
84
+ if (regionMatch) filters.region = regionMatch[1];
85
+ return {
86
+ intent: best.intent,
87
+ filters,
88
+ description: buildDescription(best.intent, filters),
89
+ confidence: best.confidence
90
+ };
91
+ }
92
+ function buildDescription(intent, f) {
93
+ const desc = [];
94
+ if (intent === "burst") desc.push("\u89E6\u53D1\u7206\u7BA1\u63A8\u6F14");
95
+ else if (intent === "valve") desc.push("\u67E5\u8BE2\u9600\u95E8\u5173\u95ED\u5F71\u54CD");
96
+ else if (intent === "material_age") {
97
+ const matName = MATERIAL_REGEX.find((m) => m.key === f.material)?.cname ?? f.material ?? "";
98
+ desc.push(`\u7B5B\u9009${matName}\u7BA1${f.minAgeYears ?? "?"}\u5E74\u4EE5\u4E0A`);
99
+ } else if (intent === "pressure") desc.push(`\u7B5B\u9009\u538B\u529B${f.maxPressure ?? ""}MPa\u4EE5\u4E0B`);
100
+ else if (intent === "nearby") desc.push(`${f.radius}m\u5185\u67E5\u627EPOI`);
101
+ else if (intent === "alarm_cluster") desc.push(`\u67E5\u8BE2${f.timeWindow ?? "1d"}\u5185\u62A5\u8B66\u805A\u96C6`);
102
+ if (f.pipelineType) desc.push(`[${f.pipelineType}]`);
103
+ if (f.region) desc.push(`\u533A\u57DF:${f.region}`);
104
+ return desc.join(" ");
105
+ }
106
+
107
+ // src/nlpg/pipelineNlpClass.ts
108
+ var PipelineNlp = class {
109
+ burstSimulator;
110
+ onIntent;
111
+ constructor(options = {}) {
112
+ this.burstSimulator = options.burstSimulator;
113
+ this.onIntent = options.onIntent;
114
+ }
115
+ /** 解析并按意图触发动作 */
116
+ query(text) {
117
+ const result = parsePipelineQuery(text);
118
+ if (this.onIntent) this.onIntent(result.intent, result);
119
+ return result;
120
+ }
121
+ /** 仅解析不触发动作 */
122
+ parse(text) {
123
+ return parsePipelineQuery(text);
124
+ }
125
+ /** 关联 BurstSimulator */
126
+ setBurstSimulator(sim) {
127
+ this.burstSimulator = sim;
128
+ }
129
+ };
130
+
131
+ export { PipelineNlp, parsePipelineQuery };
132
+ //# sourceMappingURL=chunk-YBLESEN4.js.map
133
+ //# sourceMappingURL=chunk-YBLESEN4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nlpg/pipelineNlp.ts","../src/nlpg/pipelineNlpClass.ts"],"names":[],"mappings":"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","file":"chunk-YBLESEN4.js","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,101 @@
1
+ import { PIPELINE_TYPE_COLORS, PIPELINE_TYPE_LABELS, PIPE_STATUS_COLORS, PIPE_STATUS_META, PIPE_MATERIAL_COLORS, HEALTH_LEVEL_COLORS, HEALTH_LEVEL_LABELS } from './chunk-QVY4WJLM.js';
2
+
3
+ // src/style/legend.ts
4
+ function legendByType() {
5
+ return {
6
+ title: "\u7BA1\u7EBF\u7C7B\u578B",
7
+ items: Object.keys(PIPELINE_TYPE_COLORS).map((k) => ({
8
+ label: PIPELINE_TYPE_LABELS[k],
9
+ color: PIPELINE_TYPE_COLORS[k]
10
+ }))
11
+ };
12
+ }
13
+ function legendByDiameter() {
14
+ return {
15
+ title: "\u7BA1\u5F84\uFF08mm\uFF09",
16
+ items: [
17
+ { label: "\u226450 \u652F\u7BA1", color: "#4ade80" },
18
+ { label: "50-150 \u914D\u6C34/\u914D\u6C14", color: "#60a5fa" },
19
+ { label: "150-300 \u5E72\u7BA1", color: "#f59e0b" },
20
+ { label: "300-600 \u4E3B\u7BA1", color: "#ef4444" },
21
+ { label: "\u2265600 \u4E3B\u5E72", color: "#7f1d1d" }
22
+ ]
23
+ };
24
+ }
25
+ function legendByStatus() {
26
+ return {
27
+ title: "\u7BA1\u6BB5\u72B6\u6001",
28
+ items: Object.keys(PIPE_STATUS_COLORS).map(
29
+ (k) => {
30
+ const meta = PIPE_STATUS_META[k];
31
+ return {
32
+ label: meta.label,
33
+ color: PIPE_STATUS_COLORS[k],
34
+ style: meta.animation === "dashed" ? "dashed" : "solid"
35
+ };
36
+ }
37
+ )
38
+ };
39
+ }
40
+ function legendByMaterial() {
41
+ return {
42
+ title: "\u7BA1\u6750",
43
+ items: Object.entries(PIPE_MATERIAL_COLORS).map(([k, v]) => ({
44
+ label: materialLabel(k),
45
+ color: v
46
+ }))
47
+ };
48
+ }
49
+ function legendByHealth() {
50
+ return {
51
+ title: "\u5065\u5EB7\u7B49\u7EA7",
52
+ items: Object.entries(HEALTH_LEVEL_COLORS).map(([k, v]) => ({
53
+ label: `${HEALTH_LEVEL_LABELS[k]}\uFF08${healthRangeLabel(k)}\uFF09`,
54
+ color: v
55
+ }))
56
+ };
57
+ }
58
+ function materialLabel(k) {
59
+ const map = {
60
+ cast_iron: "\u94F8\u94C1",
61
+ ductile_iron: "\u7403\u58A8\u94F8\u94C1",
62
+ steel: "\u94A2",
63
+ pe: "PE",
64
+ pvc: "PVC",
65
+ concrete: "\u6DF7\u51DD\u571F",
66
+ hdpe: "HDPE",
67
+ copper: "\u94DC",
68
+ unknown: "\u672A\u77E5"
69
+ };
70
+ return map[k] ?? k;
71
+ }
72
+ function healthRangeLabel(k) {
73
+ const map = {
74
+ excellent: "80-100",
75
+ good: "60-80",
76
+ fair: "40-60",
77
+ poor: "20-40",
78
+ critical: "0-20"
79
+ };
80
+ return map[k] ?? "";
81
+ }
82
+ function buildLegend(mode) {
83
+ switch (mode) {
84
+ case "type":
85
+ return legendByType();
86
+ case "diameter":
87
+ return legendByDiameter();
88
+ case "status":
89
+ return legendByStatus();
90
+ case "material":
91
+ return legendByMaterial();
92
+ case "health":
93
+ return legendByHealth();
94
+ default:
95
+ return legendByType();
96
+ }
97
+ }
98
+
99
+ export { buildLegend, legendByDiameter, legendByHealth, legendByMaterial, legendByStatus, legendByType };
100
+ //# sourceMappingURL=chunk-YS2ICFVK.js.map
101
+ //# sourceMappingURL=chunk-YS2ICFVK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/style/legend.ts"],"names":[],"mappings":"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","file":"chunk-YS2ICFVK.js","sourcesContent":["/**\n * 管网图例(Legend)\n *\n * 每个组件都可以在浮层面板显示一份图例。本文件是图例数据生成器,\n * 业务方可拿到后用任意 UI 库渲染。\n */\n\nimport type { ColorByMode } from '../types';\nimport {\n PIPELINE_TYPE_COLORS,\n PIPELINE_TYPE_LABELS,\n PIPE_STATUS_COLORS,\n PIPE_STATUS_META,\n HEALTH_LEVEL_COLORS,\n HEALTH_LEVEL_LABELS,\n PIPE_MATERIAL_COLORS,\n} from './pipelineTheme';\n\nexport interface LegendItem {\n label: string;\n color: string;\n /** 可选样式(实线/虚线) */\n style?: 'solid' | 'dashed';\n /** 圆形图标用(设备点) */\n shape?: 'rect' | 'circle' | 'triangle';\n}\n\nexport interface LegendSection {\n title: string;\n items: LegendItem[];\n}\n\n/** 按\"管线大类\"生成图例 */\nexport function legendByType(): LegendSection {\n return {\n title: '管线类型',\n items: Object.keys(PIPELINE_TYPE_COLORS).map((k) => ({\n label: PIPELINE_TYPE_LABELS[k as keyof typeof PIPELINE_TYPE_LABELS],\n color: PIPELINE_TYPE_COLORS[k as keyof typeof PIPELINE_TYPE_COLORS],\n })),\n };\n}\n\n/** 按\"管径\"生成图例 */\nexport function legendByDiameter(): LegendSection {\n return {\n title: '管径(mm)',\n items: [\n { label: '≤50 支管', color: '#4ade80' },\n { label: '50-150 配水/配气', color: '#60a5fa' },\n { label: '150-300 干管', color: '#f59e0b' },\n { label: '300-600 主管', color: '#ef4444' },\n { label: '≥600 主干', color: '#7f1d1d' },\n ],\n };\n}\n\n/** 按\"状态\"生成图例(含动画标识) */\nexport function legendByStatus(): LegendSection {\n return {\n title: '管段状态',\n items: (Object.keys(PIPE_STATUS_COLORS) as Array<keyof typeof PIPE_STATUS_COLORS>).map(\n (k) => {\n const meta = PIPE_STATUS_META[k];\n return {\n label: meta.label,\n color: PIPE_STATUS_COLORS[k],\n style: meta.animation === 'dashed' ? ('dashed' as const) : ('solid' as const),\n };\n }\n ),\n };\n}\n\n/** 按\"材质\"生成图例 */\nexport function legendByMaterial(): LegendSection {\n return {\n title: '管材',\n items: Object.entries(PIPE_MATERIAL_COLORS).map(([k, v]) => ({\n label: materialLabel(k),\n color: v,\n })),\n };\n}\n\n/** 按\"健康度\"生成图例 */\nexport function legendByHealth(): LegendSection {\n return {\n title: '健康等级',\n items: Object.entries(HEALTH_LEVEL_COLORS).map(([k, v]) => ({\n label: `${HEALTH_LEVEL_LABELS[k]}(${healthRangeLabel(k)})`,\n color: v,\n })),\n };\n}\n\nfunction materialLabel(k: string): string {\n const map: Record<string, string> = {\n cast_iron: '铸铁',\n ductile_iron: '球墨铸铁',\n steel: '钢',\n pe: 'PE',\n pvc: 'PVC',\n concrete: '混凝土',\n hdpe: 'HDPE',\n copper: '铜',\n unknown: '未知',\n };\n return map[k] ?? k;\n}\n\nfunction healthRangeLabel(k: string): string {\n const map: Record<string, string> = {\n excellent: '80-100',\n good: '60-80',\n fair: '40-60',\n poor: '20-40',\n critical: '0-20',\n };\n return map[k] ?? '';\n}\n\n/** 通用入口:按模式取图例 */\nexport function buildLegend(mode: ColorByMode): LegendSection {\n switch (mode) {\n case 'type':\n return legendByType();\n case 'diameter':\n return legendByDiameter();\n case 'status':\n return legendByStatus();\n case 'material':\n return legendByMaterial();\n case 'health':\n return legendByHealth();\n default:\n return legendByType();\n }\n}\n"]}