中心线提取
大约 3 分钟
中心线提取
从双线要素(如道路轮廓、巷道边线)中自动提取中心线。
在线示例
在线演示{target="_blank"}
功能概述
中心线提取算法可将成对的平行线(双线)自动识别并计算出它们的中心线。典型应用场景:
- 道路轮廓线 → 道路中心线
- 矿井巷道边线 → 巷道中心线
- 管线双线 → 管线中心线
- 河流边线 → 河流中心线
使用方式
方式一:命令面板
在菜单栏 工具 → 提取中心线 或 Ribbon 工具 标签页中点击 提取中心线 按钮,打开参数面板进行提取。
方式二:代码调用
const { Engine, Layer, PolylineEnt, BulgePoints, BulgePoint, getWebCadCoreService } = vjcad;
// 1. 收集线段数据(格式:[[[x,y],[x,y],...], ...])
const lines = [
[[0, 2.5], [100, 2.5]], // 上边线
[[0, -2.5], [100, -2.5]], // 下边线
];
// 2. 配置参数并调用 WASM
const wasmService = getWebCadCoreService();
const result = wasmService.extractCenterlineSync({
lines,
config: {
minSpaceDistance: [4], // 双线最小间距
maxSpaceDistance: [6], // 双线最大间距
maxGapDistance: 15, // 断开允许距离
collinearTolerance: 1.0, // 共线容差
}
});
// 3. 创建中心线实体
if (result.centerlines && result.centerlines.length > 0) {
const layer = new Layer("Centerline");
layer.color = 1;
Engine.currentDoc.layers.add(layer);
for (const polyline of result.centerlines) {
const bp = new BulgePoints();
for (const pt of polyline) {
bp.add(new BulgePoint([pt[0], pt[1]], 0));
}
const pline = new PolylineEnt(bp, false);
pline.setDefaults();
pline.layer = "Centerline";
Engine.pcanvas.addEntity(pline);
}
Engine.pcanvas.redraw();
}算法流程
输入双线数据
↓
1. 分解为线段 + 合并共线线段
↓
2. 识别平行线对(斜率相似 + 间距在范围内)
↓
3. 计算中心线(两侧垂足取中点)
↓
4. 合并断开的中心线段
↓
5. 合并端点到附近线段
↓
6. 最终合并相连的中心线
↓
输出中心线参数说明
平行线距离
| 参数 | 默认值 | 说明 |
|---|---|---|
minSpaceDistance | [2.5] | 双线最小间距数组,支持多组距离 |
maxSpaceDistance | [7.5] | 双线最大间距数组,与最小间距一一对应 |
提示
支持配置多组间距以处理不同宽度的双线。例如同时提取宽 5m 和宽 10m 的道路:
minSpaceDistance: [4, 9],
maxSpaceDistance: [6, 11],数值参数
| 参数 | 默认值 | 说明 |
|---|---|---|
collinearTolerance | 1.0 | 共线判断容差距离 |
duplicateTolerance | 0.2 | 去除重复点的容差 |
maxGapDistance | 15 | 允许的线段断开距离 |
numDecimalDigits | 3 | 坐标精确的小数位数 |
minDlMinRatio | 0.01 | 双线重叠的最小比例 |
paralleSlopeAngleTolerance | 1.5 | 判断平行线的斜率角度误差(度) |
mergeSlopeAngleTolerance | 20 | 合并中心线的角度误差(度) |
maxCenterMergeDistance | 15 | 中心线端点合并的最大距离 |
minCenterDistance | 5.1 | 中心线的最小长度(短于此值的线段将被过滤) |
处理选项
| 参数 | 默认值 | 说明 |
|---|---|---|
connectGapLine | true | 是否连接允许间隔范围内的线 |
mergeNode | true | 是否处理合并端点 |
filterShortLine | true | 是否过滤短于最小距离的线 |
mergeLine | true | 是否把相连的线合成一条 |
输入输出格式
输入
{
"lines": [
[[x1,y1], [x2,y2], ...],
[[x1,y1], [x2,y2], ...]
],
"config": { ... }
}lines 支持两种格式:
- 简单数组:
[[[x,y],[x,y],...], ...] - GeoJSON FeatureCollection:标准 GeoJSON 格式(支持 LineString 和 MultiLineString)
输出
[
[[x1,y1], [x2,y2], ...],
[[x1,y1], [x2,y2], ...]
]