# 查询示例(自动提取中心线如墙体道路)

# 前言

CAD图纸中的中心线提取是一项关键的几何信息简化技术,在不同领域具有重要应用价值。在建筑类图纸中,通过算法提取墙体的中心线,这种简化后的中心线便于进行空间分析、路径规划或BIM模型重构。对于能源领域,巷道中心线的提取更为关键,它能准确反映地下通道的走向、转折点和连接关系,为设计、逃生路线规划等提供基础框架。本质上,中心线提取实现了从具象图形到抽象拓扑的转换,是CAD数据处理中不可或缺的智能化预处理步骤。 CAD图纸中心线的提取技术,需要设计人员需要手动描画中心线,不仅耗时耗力,而且容易因人为误差影响精度。相比人工操作,自动提取中心线不仅速度更快,还能减少人为错误,确保数据一致性,并支持批量处理大规模图纸。这一技术进步极大降低了人工成本,推动了CAD数据处理向智能化、高效化方向发展。

# 效果展示

提取墙体中心线

提取巷道中心线

视频教程:

https://www.bilibili.com/video/BV14coEY5EdR/

# 基本操作

唯杰地图管理云平台 (opens new window) 上传要提取中心线的CAD图形,成功打开后,点击“更多功能”里面的“自动提取中心线(如墙体、道路)”

image-20250414152232758

# 界面控制

  • 窗口可拖动:通过标题栏拖动整个设置窗口
  • 底图透明度:使用滑块调节底图透明度(0-1之间)
  • 关闭按钮:点击右上角"关闭"按钮关闭设置窗口

# 中心线提取

# 参数设置

# 平行线距离设置

  1. 距离对设置

    • 可添加多个距离对
    • 每个距离对包含最小距离和最大距离
    • 使用"拾距"按钮可以直接从图上测量距离
  2. 自动设置

    • 点击"自动设置数值参数中其他距离项"可自动计算其他距离参数

这步设置很重要,不同的图纸设置值不同,需要根据实际图纸进行设置。

因为图中可能存在不同的平行线宽,如下图所示,墙体厚度不同,这时候需要增加不同的距离对。

image-20250414153556060

修改完距离选项后,需点击 自动设置数值参数中其他距离项 自动计算其他距离参数

# 数值参数

  1. 距离参数
    • 中心线段能合并的最大距离 (在此范围之内的中心线将合并成一条中心线)
    • 允许的线段断开距离 (查找平行线时,如果平行线有断开时,断开距离小于此值将进行合并)
    • 中心线段允许的最小距离 (如果最后计算出的中心线距离小于此值将被排除)
    • 共线容差距离值 (判断是否共线的容差距离值)
    • 去除重复点容差值 (去除重复点的容差距离值)
  2. 精度参数
    • 精确到小数点后几位(0-10位)
    • 双线都重叠的最小比例(0-1)(用于判断平行线是否有中心线)
    • 判断平行线斜率角度误差(0-90度)(平行线斜率误差角度)
    • 合并中心线斜率角度误差(0-90度)(合并中心线时斜率误差角度)

# 处理选项

  • 是否连接设置允许间隔范围内的线
  • 是否处理合并端点
  • 是否排除小于最小距离的线
  • 是否把相连的线合成一条
  • 中心线是否以GeoJson格式返回 (用于调试数据)
  • 是否显示平行线坐标 (用于调试数据)
  • 是否显示提取的线坐标 (用于调试数据)

# 自动提取中心线

  1. 点击"自动提取中心线"按钮
  2. 系统会自动分析当前视图范围内的图形并提取中心线

# 手动矩形提取

  1. 点击"手动矩形提取中线"按钮
  2. 在地图上绘制一个矩形区域
  3. 系统会提取该区域内的中心线

# 多边形提取

  1. 点击"多边形提取中线"按钮
  2. 在地图上绘制一个多边形区域
  3. 系统会提取该区域内的中心线

注:如果参数设置对的情况下,因为图形其他元素影响导致自动提取不对时,可采取以下办法:

(1) 点击工具栏中的图层菜单 ,“只显示指定图层”, 可自动识别当前图层中的数据,防止其他数据干扰。

(2) 也可以通过手动矩形或多边形选择指定区域的图形数据进行提取。

# 工具功能

# 中心线编辑工具

  • 显示/隐藏中心线:点击对应按钮切换中心线的显示状态

  • 编辑/浏览模式切换:切换中心线的编辑和浏览模式

    • 编辑模式下:

    可点击中心线,对坐标进行拖动编辑,或按Delete键进行删除

    image-20250414161148669

    • 浏览模式下:

      鼠标移动到中心线上时,会显示当前中心线的属性数据,点击线,会弹出此线的详细坐标数据和属性数据,可进行修改编辑

image-20250414161514529

​ 如可在这里输入中心线的名称值,或者直接修改坐标值。

# 手动采集

  • 手动采集线:点击按钮后在地图上采集二维线

  • 手动采集三维线:点击按钮后在地图上采集三维线

    如果没有自动提取到的数据,可以用手动采集的方式去进行采集。手动采集三维线时,会根据当前点的图纸内容自动给当前点赋值高程(如果没有找到相关高程值可手动输入)

    image-20250414162038735

# 中心线编辑

  • 拆分中心线:选择一条中心线,指定拆分点进行拆分

    image-20250414162650071

  • 合并中心线:选择两条中心线进行合并

    合并过程与拆分刚好相反,选择两条中心线,会自动合并成一条中心线

  • 查看中心线数据:查看当前中心线的详细数据

    查看中心线既可查看当前所有中心线数据,也可在这里直接修改中心线数据。

    如可把当前处理好的中心线这里复制出来,下次的时候,再把数据拷贝到这里进行还原。

    image-20250414162757031

# 坐标高程处理

如果需要给中心线的每个点赋值高程值时,需要先自动找到图中所有高程注记手动增加高程注记 ,然后再根据这些点的高程值给中心线的每个点进行插值赋值。

# 高程注记处理

  1. 自动找高程注记

    • 点击"自动找高程注记"按钮

    • 系统会自动识别图中的高程注记

      image-20250414163522616

      自动找高程注记的流程为:会查找所有符合半径大小的圆,再搜索圆旁边的高程值。

      搜索到的高程值旁边会加上相同颜色的一个填充圆点。如搜索到的高程值1146.983是绿色的,查找的文字"1146.983"上面会显示绿色的小填充圆点。这样就能直观的看到自动找到的高程值来源于图中的哪个文字如果不对的话,可以点击高程注记右上角的关闭按钮来进行删除

  2. 手动增加高程注记

    • 点击"手动增加高程注记"按钮

    • 在地图上点击位置添加高程值

      对于没有自动找到的高程值,可以手动在一起位置增加对应的高程值。手动增加的高程值会以蓝色文字进行显示,以区别于自动搜索到的高程值。

      image-20250414165344400

  3. 高程注记管理

    • 删除高程注记:删除所有自动识别的高程注记

    • 删除手动高程注记:删除手动添加的高程注记

    • 中心线高程自动赋值:根据高程注记自动为中心线赋值

      中心线高程自动赋值是根据自动找到图中所有高程注记手动增加高程注记对图中的所有中心线上的点进行高程插值赋值。

      image-20250414170003060

      ​ 没有高程注记的点,会根据其他点的坐标自动插值

      如果线的颜色是红色,表明这条线上没有找到任何高程值,所有高程值赋值失败,需手动增加高程注记后再重新赋值

      image-20250414170313222

# 效果展示

# 三维效果

  • 中心线三维管道效果:将中心线转换为三维管道效果

    image-20250414170750772

  • 中心线拉伸效果:显示中心线的拉伸效果

  • image-20250414171252950

  • 移除拉伸效果:清除拉伸效果

# 使用步骤

  1. 先进行平行线距离设置、点击自动设置数值参数中其他距离项自动计算其他距离参数
  2. 提取中心线时,建议先使用自动提取功能,如果效果不理想再尝试手动提取
  3. 如果需要处理高程时,建议先使用自动找高程注记功能,再进行中心线高程自动赋值, 如果出现红色的线,根据需要手动添加或修改
  4. 使用三维效果,查看数据是否正确,再依次排查修改。

# SDK用法

 /**
 * 提取中心线命令参数接口
 * @interface ExtractCenterLinesParams
 */
interface ExtractCenterLinesParams {
  /** 是否包含边界 */
  isContains: boolean;
  
  /** 边界坐标字符串 */
  bounds: string;
  
  /** 最小间距,多个值用逗号分隔 */
  minSpaceDistance: string;
  
  /** 最大间距,多个值用逗号分隔 */
  maxSpaceDistance: string;
  
  /** 地图ID */
  mapid?: string;
  
  /** 地图版本 */
  version?: string;
  
  /** 图层 */
  layer?: string;
  
  /** 是否为几何渲染模式 */
  geom?: boolean;
  
  /** 共线容差距离值 */
  collinearTolerance: number;
  
  /** 去除重复点容差值 */
  duplicateTolerance: number;
  
  /** 允许的线段断开距离 */
  maxGapDistance: number;
  
  /** 精确到小数点后几位 */
  numDecimalDigits: number;
  
  /** 双线都重叠的最小比例 */
  minDlMinRatio: number;
  
  /** 判断平行线斜率角度误差(度) */
  paralleSlopeAngleTolerance: number;
  
  /** 合并中心线斜率角度误差(度) */
  mergeSlopeAngleTolerance: number;
  
  /** 中心线段能合并的最大距离 */
  maxCenterMergeDistance: number;
  
  /** 中心线段允许的最小距离 */
  minCenterDistance: number;
  
  /** 是否连接设置允许间隔范围内的线 */
  bConnectGrapLine: boolean;
  
  /** 是否处理合并端点 */
  bMergeNode: boolean;
  
  /** 是否排除小于最小距离的线 */
  bFilterShortLine: boolean;
  
  /** 是否把相连的线合成一条 */
  bMergeLine: boolean;
  
  /** 中心线是否以GeoJson格式返回 */
  bCenterGeoJson: boolean;
  
  /** 是否显示平行线坐标 */
  bSaveParalleLineJson: boolean;
  
  /** 是否显示提取的线坐标 */
  bExtractLines: boolean;
}

/**
 * 提取中心线命令
 * @function extractCenterLines
 * @param {ExtractCenterLinesParams} params - 提取中心线参数
 * @param {string} [options="_null"] - 选项参数
 * @param {string} [version="v1"] - API版本
 * @returns {Promise<any>} 返回提取的中心线数据
 * @description
 * 该命令用于从地图中提取中心线,支持自动提取和手动区域提取。
 * 可以通过设置不同的参数来控制提取的精度和效果。
 * 
 * @example
 * const result = await svc.execCommand("extractCenterLines", {
 *   isContains: true,
 *   bounds: "x1,y1,x2,y2",
 *   minSpaceDistance: "2.5,3.5",
 *   maxSpaceDistance: "7.5,8.5",
 *   collinearTolerance: 1.0,
 *   duplicateTolerance: 0.2,
 *   // ... 其他参数
 * });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99