# 地铁线路DSL设计器 **Repository Path**: embed2026/metro_editor ## Basic Information - **Project Name**: 地铁线路DSL设计器 - **Description**: Metro Editor是一款专为地铁线路数据编辑、编译、可视化与分析而设计的桌面工具。它基于C# WPF构建,提供了完整的图形化界面,支持从线路定义、站点管理、票价规则到运行参数的全流程编辑,并内置了编译/反编译、地图微调、通勤分析等高级功能。其核心引擎集成了物理级列车运行时间计算与多目标路径规划,可支撑专业级的城市轨道交通出行分析与路网管理。 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-14 - **Last Updated**: 2026-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Metro Editor – 地铁线路编辑器 [![.NET](https://img.shields.io/badge/.NET-6.0-purple)](https://dotnet.microsoft.com/) [![License](https://img.shields.io/badge/License-GPL--3.0-blue.svg)](LICENSE) **Metro Editor** 是一款专为地铁线路数据编辑、编译、可视化与分析而设计的桌面工具。它基于 **C# WPF** 构建,提供了完整的图形化界面,支持从线路定义、站点管理、票价规则到运行参数的全流程编辑,并内置了编译/反编译、地图微调、通勤分析等高级功能。其核心引擎集成了**物理级列车运行时间计算**与**多目标路径规划**,可支撑专业级的城市轨道交通出行分析与路网管理。 --- ## 主要特性 ### 编辑与编译 - **多文档编辑**:基于 AvalonEdit 的高亮编辑器,支持 `.metro` 语法高亮,提供撤销/重做、查找/替换等标准编辑功能。 - **双向编译**:将 `.metro` 文本格式编译为压缩的 `.bmetro` 二进制文件,也可反向反编译为明文 JSON。 - **嵌入式导出**:将编译后的路网数据导出为专为嵌入式设备设计的 `.mbin` 二进制格式(零拷贝、大端序),或生成可直接烧录的 C 语言代码(含完整解析器)。支持多语言站名、预计算区间运行时间,适配 STM32/FreeRTOS 等资源受限平台。 - **批量处理**:支持批量编译/反编译,一键处理多个文件。 ### 数据管理 - **站点管理**:可视化添加、删除、批量导入站点,并支持高德地图 API 自动校准坐标。 - **线路与方向生成**:通过向导式窗口快速生成线路定义(LINE)和方向定义(DIRECTION),并支持预览。 - **地图微调**:内置简易地图控件,通过拖拽站点进行位置微调,实时更新坐标。 - **票价与时间参数编辑**:独立窗口管理普通票价、特殊线路票价、换乘规则、停站时间,实时生成配置代码。 ### 分析与可视化 - **通勤分析**:选择起点站,计算到所有站点的最优路径(距离、换乘、时间、票价、痛苦度),并支持导出 CSV。 - **城市/线路详情**:查看城市基本信息、线路列表及每条线路的站点详情(含换乘信息)。 - **路线查询**:独立窗口查询任意两站之间的路径,展示分段详情。 - **区间运行时间计算器**:基于列车编组、功率、限速等参数,绘制运行时间与区间长度、限速、功率的关系曲线(内置物理模型)。 ### 嵌入式导出 - **MBIN 二进制格式**:紧凑的二进制数据布局,强制大端序,支持零拷贝直接映射到结构体,无需解析,适合 Flash 存储与 OTA 升级。 - **C 代码生成**:一键生成 `metro_parser.h`、`metro_parser.c` 和 `metro_data.h` 三份文件,包含完整的结构体定义、大端读取宏、Dijkstra 路径规划、票价计算等函数,可直接集成到嵌入式工程中。 - **多语言站名支持**:站点主名与备用名分离存储,嵌入式端通过语言索引快速获取对应翻译,适配国际/多语言场景。 - **预计算优化**:区间运行时间和换乘时间在 PC 端预先算好,嵌入式设备只需做整数加法即可完成路径搜索,无需浮点运算或物理模型计算。 - **工作流整合**:通过主编辑器的“编译并导出”对话框,可在 `.mbin` / `.c/.h` / `.bmetro` / `.json` 四种格式间任意选择,一次编译,多端部署。 ### 导入与迁移 - **OSM 数据导入**:从 OpenStreetMap JSON 数据中提取地铁信息,生成 `.metro` 文件。 - **语法迁移**:支持将旧版 `.metro` 语法一键迁移到新版块结构(`PROGRAM_DEFINE`、`LINE_DEFINE` 等)。 ### 高级路径规划引擎 - **多目标优化**:支持距离、换乘次数、票价、时间、站点数的综合权重搜索。 - **物理级运行时间**:基于戴维斯阻力公式和恒功率牵引模型,精确计算区间运行时间。 - **拥挤度建模**:引入换乘等待时间的拥挤度惩罚(平均等待趟数模型)。 - **特殊线路处理**:自动识别机场线、磁悬浮等特殊线路,并应用独立的票价规则。 --- ## 主要窗口一览 | 窗口类 | 功能描述 | |--------|----------| | `MainWindow` | 主编辑器,包含代码编辑区、错误列表、预览面板、站台/方向/线路列表等多个标签页。 | | `SettingsWindow` | 全局设置:字体大小、字体名称、高德 API Key、路径搜索权重(长度/换乘/票价/时间/站点/特殊票价)。 | | `TimeParameterEditorWindow` | 编辑默认时间参数(站内换乘、出站换乘、停站、进站平均时间),自定义换乘规则和停站时间。 | | `FareEditorWindow` | 编辑普通票价(起步价、线性扩展、分段票价)和特殊线路票价(统一票价/区间票价)。 | | `ManagerStationWindow` | 站点管理:批量添加、删除、高德坐标修正、计算中心坐标,并生成 `STATION_LIST` 代码。 | | `EditStationWindow` | 编辑单个站点(站名、经纬度、城市),支持高德校准和复制代码。 | | `EditLineWindow` | 生成线路定义(线路 ID、名称、颜色、城市、编组、速度、开通年份、功率、刹车、链接等)。 | | `EditDirectionWindow` | 生成/修改方向定义,支持环线/支线/快车/建设中标记,可自由拖拽站点顺序。 | | `MapEditorWindow` | 基于 `MetroMapControl` 的地图编辑,通过拖拽调整站点位置,实时预览 `STATION_DEFINE` 代码。 | | `CommuteAnalysisWindow` | 通勤分析:选择起点站,计算到所有站点的路径指标,支持导出 CSV。 | | `RouteDetailWindow` | 路线查询:输入起点和终点,显示总距离、时间、票价,并以可展开分段列表展示详细路径。 | | `CityInfoWindow` | 城市详情:显示城市名、版本、更新日期、总里程、站点/线路数量、票价规则以及线路列表(含颜色、长度、标签等)。 | | `LineDetailWindow` | 线路详情:显示线路基本信息(名称、城市、编组、速度、开通年份、长度、标签)以及站点列表(含主线/支线标记)。 | | `BatchCompileWindow` | 批量编译:添加文件列表,选择输出格式(.bmetro / .json)和输出目录,批量编译。 | | `BatchDecompileWindow` | 批量反编译:添加 `.bmetro` 文件,反编译为 `.json` 输出到指定目录。 | | `BatchPendingWindow` | 批量设置暂缓站点:选择线路,勾选站点,生成暂缓代码并复制。 | | `OsmImportWindow` | 从 OSM JSON 文件导入地铁数据,生成 `.metro` 预览,可保存。 | | `IntervalTimeCalculatorWindow` | 区间运行时间计算器:输入编组、功率、限速、制动减速度,绘制运行时间与区间长度/限速/功率的关系曲线。 | | `FindReplaceDialog` | 查找与替换对话框,支持区分大小写、全字匹配。 | | `AboutWindow` | 关于对话框,显示版本、版权信息及开源地址。 | | `AddSegmentDialog` / `AddSpecialFareDialog` / `AddStopTimeDialog` / `AddTransferDialog` | 各类添加子项对话框。 | | `LineSelectorWindow` | 简单线路选择器。 | | `InputDialog` | 通用输入对话框。 | --- ## 快速开始 ### 系统要求 - Windows 7 或更高版本 - .NET Framework 4.7.2 或 .NET Core / .NET 5+(视项目配置而定) ### 运行 1. 下载已编译的可执行文件(或从源码生成)。 2. 双击 `MetroEditor.exe` 启动。 3. 主界面打开后,可通过菜单或工具栏执行各项操作。 ### 基本工作流 1. **创建/打开文件**:使用“文件”菜单新建或打开 `.metro` 文本文件。 2. **编辑内容**:在主编辑器中编写或修改线路定义、站点列表、方向等语法。 3. **编译**:点击“编译”将当前文件编译为 `.bmetro` 二进制文件。 4. **反编译**:点击“反编译”将 `.bmetro` 文件还原为 JSON 格式。 5. **管理站点**:通过“站点管理”窗口批量添加站点,校准坐标。 6. **生成线路/方向**:通过“生成线路”/“生成方向”向导快速生成定义代码。 7. **设置票价/时间参数**:使用独立编辑器调整票价规则和换乘/停站时间。 8. **通勤分析**:利用“通勤分析”窗口评估线路通达性。 9. **地图微调**:使用“站点拖拽微调”在地图上调整站点位置。 --- ## 架构概览 ### 核心编译引擎(`MetroLang.Compiler`) - **词法分析器(`Lexer`)**:将 `.metro` 源文本分解为 Token 流,支持预处理注释和字符串保护。 - **语法解析器(`Parser`)**:基于递归下降的语法分析,提供前瞻和错误恢复机制。 - **命令处理器(`ICommandHandler`)**:每个顶级块(`PROGRAM_DEFINE`、`LINE_DEFINE`、`DIRECTION_DEFINE` 等)均有独立处理器,负责解析子命令并填充编译上下文(`Context`)。 - **后处理器(`PostProcessor`)**:执行语义优化——去重方向、推断城市归属、展开换乘模板、标记远期车站等。 - **JSON 导出器(`JsonExport`)**:将 `Context` 映射为标准化的 `JsonRoot` 对象,供前端或 Web 服务使用。 ### 反编译器(`MetroDecompiler`) - 将 `JsonRoot` 对象还原为可读的 `.metro` 源码。 - **智能反向方向识别**:自动检测方向对并输出 `REV` 简写,大幅减少冗余代码。 - **条件输出**:仅在有自定义数据时生成对应块(如 `DWELL_TIME_DEFINE`)。 ### 路径规划引擎(`PathFinding`) - **图构建(`MetroGraph`)**:将路网数据抽象为图结构,节点 = 特定方向上的车站,边 = 运行边或换乘边。 - **多目标搜索**:改进的 Dijkstra 算法,支持距离、换乘、时间、票价、站点数的加权组合。 - **物理运行时间(`TrainTimeCalculator`)**:基于戴维斯阻力公式 + 恒功率牵引模型,采用自适应辛普森积分精确计算区间运行时间。 - **票价计算(`FareCalculator`)**:支持普通里程计费、特殊线路统一票价/分段票价/区间附加费,可处理 `UseLines` 线路组。 - **换乘等待模型(`TimeCalculator`)**:计算换乘站的候车时间,公式为 `T/2 + t + (C-1)*T`,其中 C 为拥挤度系数。 ### 辅助工具(`Tool`) - **`MigrationHelper`**:利用“旧源码→编译→JSON→反编译”闭环实现语法迁移。 - **`MetadataExtractor`**:从路网 JSON 中提取线路静态属性(颜色、编组、速度等)。 - **`OsmMetroExtractor`**:解析 OSM 数据,自动构建线路方向和站间距。 - **`MBINExporter` / `CCodeExporter`**:将编译后的路网数据序列化为专为嵌入式环境优化的二进制格式(`.mbin`),或生成包含完整解析器的 C 语言代码(`.h`/`.c`),支持多语言站名、预计算区间时间,实现“编译一次,部署到 PC/手机/嵌入式”的跨平台工作流。 --- ## 开发与构建 ### 技术栈 - **语言**:C# - **框架**:WPF (.NET Framework 或 .NET Core) - **编辑器控件**:AvalonEdit(用于语法高亮和代码编辑) - **绘图**:OxyPlot(用于区间计算图表) - **地图控件**:自定义 `MetroMapControl`(基于 WPF 画布) - **数据序列化**:JSON (Newtonsoft.Json)、二进制压缩 (GZip) ### 构建步骤 1. 克隆或下载源码。 2. 使用 Visual Studio 2022+ 打开解决方案(`.sln`)。 3. 还原 NuGet 包(如有)。 4. 选择目标框架(如 `net48` 或 `net6.0-windows`)。 5. 生成解决方案(`Ctrl+Shift+B`)。 --- ## 文档 项目附带三份详细参考文档,位于 `doc/` 目录下,供开发者深入理解数据格式、语言语法及运行时间计算模型: | 文档 | 说明 | |------|------| | [`Json格式参考文档.md`](doc/Json格式参考文档.md) | 描述编译生成的 JSON 数据结构的完整字段说明,涵盖站点、线路、票价、运营参数、时段规则、无障碍设施及优惠策略等。 | | [`MetroLang参考文档.md`](doc/MetroLang参考文档.md) | MetroLang 领域特定语言的完整语法手册,包含所有命令、块结构、条件编译及示例代码。 | | [`列车运行时间计算.md`](doc/列车运行时间计算.md) | 详细推导了基于物理模型的区间运行时间估算方法,包括 Davis 阻力公式、恒功率牵引、制动模型及站台等待时间(含拥挤度)的数学推导与参数说明。 | 这些文档是理解和扩展本项目的重要参考资料。 --- ## 语法参考(内置) 程序内置了“语法参考”标签页,列出了所有支持的命令及示例。主要包括: - `STATION_LIST`:站点列表定义 - `LINE`:线路定义 - `DIRECTION`:方向定义 - `MONEY_START` / `MONEY_LIST` / `MONEY_CALC`:票价规则 - `SPECIAL_MONEY`:特殊线路票价 - `DEFAULT_TIME` / `TRANSFER` / `DWELL_TIME`:时间参数 - `PENDING_STATION`:暂缓站点 - 更多详细说明请参考软件内置帮助及 `doc/` 目录下的文档。 --- ## 贡献与反馈 欢迎提交 Issue 或 Pull Request。项目开源地址:[Gitee](https://gitee.com/embed2026/metro_editor) --- ## 许可证 本项目采用 **MIT 许可证**,详情见 LICENSE 文件。 --- *Power By 2026 诚岩电子*