# 测点设计坐标生成工具简明说明

## 软件功能

本工具用于根据测线控制点自动生成理论测点坐标。用户导入测线起点、拐点、终点等控制点后，软件按指定点距沿折线累计里程插值，生成测点 `ID / Line / Station / X / Y / H`。

主要功能：

- 支持按测线折线实际长度插值。
- 支持 CSV、DAT、XLSX、XLS 输入。
- 支持 CSV、DAT、XLSX、XLS 输出。
- 支持 DXF 图形输出。
- EXE 版本支持生成 Surfer Post 数据和调用 Surfer 生成 Post 图。
- DXF 测线可选择输出设计线、向上取整延长线，或两者同时输出。

## 输入格式

推荐输入表头如下：

```csv
ID,Line,Station,X,Y,H
L1_P1,L1,P1,1000,5000,10
L1_P2,L1,P2,1030,5000,10
L1_P3,L1,P3,1030,5040,10
```

字段定义：

- `ID`：原始控制点编号，可为空。
- `Line`：测线号。同一线号的点按文件行顺序连接。
- `Station`：原始点号，可为空。
- `X`：北坐标。
- `Y`：东坐标。
- `H`：高程，可为空。

如果文件没有表头，软件默认前 6 列依次为 `ID, Line, Station, X, Y, H`。生成坐标至少需要指定 `X` 和 `Y`。

## 输出格式

默认输出表头：

```csv
ID,Line,Station,X,Y,H
```

字段定义：

- `ID`：生成测点编号。
- `Line`：线号。
- `Station`：从首点开始的累计距离。
- `X`：插值后的北坐标。
- `Y`：插值后的东坐标。
- `H`：插值后的高程。

DXF 坐标规则：

- CAD 横坐标 = 输入/输出中的 `Y`
- CAD 纵坐标 = 输入/输出中的 `X`

## 插值规则

同一条测线按文件行顺序连接控制点。例如：

```text
P1 -> P2 -> P3
```

线路长度按分段折线累计：

```text
总长 = P1-P2 + P2-P3
```

不是直接计算首尾点直线距离。

如果测线总长不是点距的整数倍，软件会向上取整，多生成一个测点。例如总长 70、点距 20，则最后一个测点在 80 位置，超出设计线 10。

软件也可以在小里程方向延伸一个点距。例如首点里程为 0、点距为 20，启用小里程延伸后会增加 `-20` 测点。

## 注意事项

- 同一 `Line` 的控制点必须按实际测线顺序排列。
- 拐点不需要特殊标识，只要作为同一线号下的中间行输入即可。
- 坐标列必须为数字。
- 高程列可为空；为空时输出高程为空。
- Surfer Post 自动生成需要本机安装 Surfer，并且 Surfer COM 可用。
- 网页版不提供 Surfer Post 图生成功能；Surfer Post 功能在 EXE 版本中使用。
- 如需不同测线在垂直方向上一一对应编号，请勾选“按点距对应编号”。启用后，相同累计距离位置使用相同序号。
- 如需生成方形/正交网格，请勾选“方形网格对齐”。软件会以第一条有效测线为基准，按点距在基准线上取点，再过这些点作垂线与其它测线求交；同一序号的点会落在同一条垂向线上。没有交点的位置不会生成点。

## 测试样例

样例输入文件：

[sample_input.csv](sample_input.csv)

样例输出文件：

[sample_output_spacing20.csv](sample_output_spacing20.csv)

样例测试参数：

- 点距：`20`
- ID 格式：`Line_序号`
- Station 小数位：`2`
- 坐标小数位：`3`
- 不勾选“保留控制点”

该样例中：

- `L1` 设计折线长度为 `70`，按 20 点距向上取整后输出到 `80`。
- `L2` 设计长度为 `50`，按 20 点距向上取整后输出到 `60`。
