一、需求背景
在工程测量领域,CAD断面数据常以特定格式.hdm的文本文件存储。把些数据需要转换为平面坐标用于施工放样或三维建模(应付监理这里假装没看到),断面不合格那么调整断面的中里程和高程里程文件,需要得到对应的平面坐标上交文件(交监理)为了应对这个问题 ,才有了本项目。
需实现以下核心功能:
-
文件解析:识别里程、基准点坐标和断面偏距数据
-
坐标计算:根据轴线方向自动计算各偏距点平面坐标
-
数据导出:生成符合行业标准的DAT格式坐标文件(cass软件需要)
二、需求背景
1.功能架构图
graph TD
A[文件解析模块] --> B[数据计算模块]
B --> C[数据展示模块]
C --> D[数据导出模块]
2.功能模块说明
| 模块名称 | 功能描述 |
|---|---|
| 文件解析 | 解析BEGIN块,提取里程、基准点坐标、断面编号和偏距数据 |
| 坐标计算 | 根据相邻断面中点确定轴线方向,计算垂直于轴线的偏距点坐标 |
| 数据展示 | 以表格形式显示断面编号、里程、偏距、高程及计算后的XY坐标 |
| 数据导出 | 将结果导出为DAT格式文件,格式:点号,,X坐标,Y坐标,高程 |
三、技术实现
1. 开发环境
-
IDE:Visual Studio 2022
-
框架:.NET Framework 4.8
-
关键技术:Windows Forms、正则表达式、向量计算
2. 核心代码实现
(1) 文件解析模块
// 使用正则表达式解析BEGIN行
var match = Regex.Match(line, @"BEGIN,([\d.]+),\(([\d.]+),([\d.]+)\):(\d+)");
if (match.Success)
{
currentSection = new Section
{
Station = double.Parse(match.Groups[1].Value),
BaseX = double.Parse(match.Groups[2].Value),
BaseY = double.Parse(match.Groups[3].Value),
Number = int.Parse(match.Groups[4].Value),
Offsets = new List<OffsetPoint>()
};
}
(2) 坐标计算算法
// 计算轴线方向向量
double dx = next.BaseX - current.BaseX;
double dy = next.BaseY - current.BaseY;
// 计算垂直单位向量(右正左负)
double perpDx = dy / length;
double perpDy = -dx / length;
// 坐标计算公式
offset.CalculatedX = current.BaseX + offset.Distance * perpDx;
offset.CalculatedY = current.BaseY + offset.Distance * perpDy;
(3) 数据导出功能
// 生成DAT格式内容
lines.Add($"{pointNumber},,{x},{y},{elevation}");
// 文件写入
File.WriteAllLines(sfd.FileName, lines);
3. 界面设计关键代码
// DataGridView数据绑定
var displayData = sections.SelectMany(s => s.Offsets.Select(o => new {
断面编号 = s.Number,
里程 = s.Station,
偏距 = o.Distance,
高程 = o.Value,
X坐标 = o.CalculatedX.ToString("F3"),
Y坐标 = o.CalculatedY.ToString("F3")
})).ToList();
dataGridView.DataSource = displayData;
四、运行效果
-
主界面展示

-
操作流程
-
Step1:点击"打开文件"选择
.hdm文件 -
Step2:自动计算并显示坐标数据
-
Step3:点击"导出数据"生成
断面坐标数据.dat
-
-
输出文件示例dat格式的文件 测绘的都懂
4392

被折叠的 条评论
为什么被折叠?



