---
title: 查询示例(自动提取中心线如墙体道路)
source: https://vjmap.com/guide/queryCase5.html
---

# 查询示例(自动提取中心线如墙体道路)


## 前言
CAD图纸中的中心线提取是一项关键的几何信息简化技术，在不同领域具有重要应用价值。在建筑类图纸中，通过算法提取墙体的中心线，这种简化后的中心线便于进行空间分析、路径规划或BIM模型重构。对于能源领域，巷道中心线的提取更为关键，它能准确反映地下通道的走向、转折点和连接关系，为设计、逃生路线规划等提供基础框架。本质上，中心线提取实现了从具象图形到抽象拓扑的转换，是CAD数据处理中不可或缺的智能化预处理步骤。
CAD图纸中心线的提取技术，需要设计人员需要手动描画中心线，不仅耗时耗力，而且容易因人为误差影响精度。相比人工操作，自动提取中心线不仅速度更快，还能减少人为错误，确保数据一致性，并支持批量处理大规模图纸。这一技术进步极大降低了人工成本，推动了CAD数据处理向智能化、高效化方向发展。

## 效果展示
提取墙体中心线
![](https://vjmap.com/blogimages/center_wall.gif)

提取巷道中心线
![](https://vjmap.com/blogimages/center_tube.gif)

视频教程:

https://www.bilibili.com/video/BV14coEY5EdR/

<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=114336408277122&bvid=BV14coEY5EdR&cid=29413214389&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

## 基本操作

在[唯杰地图管理云平台](https://vjmap.com/app/cloud) 上传要提取中心线的CAD图形，成功打开后，点击“更多功能”里面的“自动提取中心线（如墙体、道路)”

![image-20250414152232758](https://vjmap.com/blogimages/202504141522806.png)


### 界面控制
- 窗口可拖动：通过标题栏拖动整个设置窗口
- 底图透明度：使用滑块调节底图透明度（0-1之间）
- 关闭按钮：点击右上角"关闭"按钮关闭设置窗口

## 中心线提取

## 参数设置

### 平行线距离设置
1. 距离对设置
    - 可添加多个距离对
    - 每个距离对包含最小距离和最大距离
    - 使用"拾距"按钮可以直接从图上测量距离

2. 自动设置
    - 点击"自动设置数值参数中其他距离项"可自动计算其他距离参数


**这步设置很重要，不同的图纸设置值不同，需要根据实际图纸进行设置。**

因为图中可能存在不同的平行线宽，如下图所示，墙体厚度不同，这时候需要增加不同的距离对。

![image-20250414153556060](https://vjmap.com/blogimages/202504141535109.png)



修改完距离选项后，需点击 `自动设置数值参数中其他距离项` 自动计算其他距离参数


### 数值参数
1. 距离参数
    - 中心线段能合并的最大距离 (在此范围之内的中心线将合并成一条中心线)
    - 允许的线段断开距离 （查找平行线时，如果平行线有断开时，断开距离小于此值将进行合并）
    - 中心线段允许的最小距离 （如果最后计算出的中心线距离小于此值将被排除)
    - 共线容差距离值 （判断是否共线的容差距离值）
    - 去除重复点容差值 （去除重复点的容差距离值）
2. 精度参数
    - 精确到小数点后几位（0-10位）
    - 双线都重叠的最小比例（0-1）（用于判断平行线是否有中心线）
    - 判断平行线斜率角度误差（0-90度）（平行线斜率误差角度）
    - 合并中心线斜率角度误差（0-90度）（合并中心线时斜率误差角度）

### 处理选项
- 是否连接设置允许间隔范围内的线
- 是否处理合并端点
- 是否排除小于最小距离的线
- 是否把相连的线合成一条
- 中心线是否以GeoJson格式返回 (用于调试数据)
- 是否显示平行线坐标 (用于调试数据)
- 是否显示提取的线坐标 (用于调试数据)

### 自动提取中心线
1. 点击"自动提取中心线"按钮
2. 系统会自动分析当前视图范围内的图形并提取中心线

### 手动矩形提取
1. 点击"手动矩形提取中线"按钮
2. 在地图上绘制一个矩形区域
3. 系统会提取该区域内的中心线

### 多边形提取
1. 点击"多边形提取中线"按钮
2. 在地图上绘制一个多边形区域
3. 系统会提取该区域内的中心线

**注：如果参数设置对的情况下，因为图形其他元素影响导致自动提取不对时，可采取以下办法：**

(1) 点击工具栏中的图层菜单 ，“只显示指定图层”， 可自动识别当前图层中的数据，防止其他数据干扰。

(2) 也可以通过手动矩形或多边形选择指定区域的图形数据进行提取。

## 工具功能

### 中心线编辑工具
- 显示/隐藏中心线：点击对应按钮切换中心线的显示状态

- 编辑/浏览模式切换：切换中心线的编辑和浏览模式

    - 编辑模式下：

  可点击中心线，对坐标进行拖动编辑，或按`Delete`键进行删除

  ![image-20250414161148669](https://vjmap.com/blogimages/202504141611712.png)

    - 浏览模式下：

      鼠标移动到中心线上时，会显示当前中心线的属性数据，点击线，会弹出此线的详细坐标数据和属性数据，可进行修改编辑

![image-20250414161514529](https://vjmap.com/blogimages/202504141615564.png)

​        如可在这里输入中心线的`名称值`，或者直接修改坐标值。

### 手动采集
- 手动采集线：点击按钮后在地图上采集二维线

- 手动采集三维线：点击按钮后在地图上采集三维线

  如果没有自动提取到的数据，可以用手动采集的方式去进行采集。手动采集三维线时，会根据当前点的图纸内容自动给当前点赋值高程（如果没有找到相关高程值可手动输入）

  ![image-20250414162038735](https://vjmap.com/blogimages/202504141620779.png)

### 中心线编辑
- 拆分中心线：选择一条中心线，指定拆分点进行拆分

  ![image-20250414162650071](https://vjmap.com/blogimages/202504141626114.png)

- 合并中心线：选择两条中心线进行合并

  合并过程与拆分刚好相反，选择两条中心线，会自动合并成一条中心线

- 查看中心线数据：查看当前中心线的详细数据

  查看中心线既可查看当前所有中心线数据，也可在这里直接修改中心线数据。

  **如可把当前处理好的中心线这里复制出来，下次的时候，再把数据拷贝到这里进行还原。**

  ![image-20250414162757031](https://vjmap.com/blogimages/202504141627076.png)

## 坐标高程处理
如果需要给中心线的每个点赋值高程值时，需要先`自动找到图中所有高程注记`或 `手动增加高程注记` ，然后再根据这些点的高程值给中心线的每个点进行插值赋值。

### 高程注记处理
1. 自动找高程注记
    - 点击"自动找高程注记"按钮

    - 系统会自动识别图中的高程注记

      ![image-20250414163522616](https://vjmap.com/blogimages/202504141635665.png)

      自动找高程注记的流程为：会查找所有符合半径大小的圆，再搜索圆旁边的高程值。

      搜索到的高程值旁边会加上相同颜色的一个填充圆点。如搜索到的高程值1146.983是绿色的，查找的文字"1146.983"上面会显示绿色的小填充圆点。这样就能**直观的看到自动找到的高程值来源于图中的哪个文字**，**如果不对的话，可以点击高程注记右上角的关闭按钮来进行删除**。



2. 手动增加高程注记
    - 点击"手动增加高程注记"按钮

    - 在地图上点击位置添加高程值

      对于没有自动找到的高程值，可以手动在一起位置增加对应的高程值。手动增加的高程值会以蓝色文字进行显示，以区别于自动搜索到的高程值。

      ![image-20250414165344400](https://vjmap.com/blogimages/202504141653456.png)

3. 高程注记管理
    - 删除高程注记：删除所有自动识别的高程注记

    - 删除手动高程注记：删除手动添加的高程注记

    - 中心线高程自动赋值：根据高程注记自动为中心线赋值

      中心线高程自动赋值是根据`自动找到图中所有高程注记`和 `手动增加高程注记`对图中的所有中心线上的点进行高程插值赋值。

      ![image-20250414170003060](https://vjmap.com/blogimages/202504141700112.png)

      ​     没有高程注记的点，会根据其他点的坐标自动插值

      如果线的颜色是红色，表明这条线上没有找到任何高程值，所有高程值赋值失败，需手动增加高程注记后再重新赋值

      ![image-20250414170313222](https://vjmap.com/blogimages/202504141703259.png)

## 效果展示

### 三维效果
- 中心线三维管道效果：将中心线转换为三维管道效果

  ![image-20250414170750772](https://vjmap.com/blogimages/202504141707824.png)

- 中心线拉伸效果：显示中心线的拉伸效果

- ![image-20250414171252950](https://vjmap.com/blogimages/202504141712993.png)

- 移除拉伸效果：清除拉伸效果



## 使用步骤
1. 先进行`平行线距离设置`、点击`自动设置数值参数中其他距离项`自动计算其他距离参数
2. 提取中心线时，建议先使用`自动提取`功能，如果效果不理想再尝试`手动提取`
3. 如果需要处理高程时，建议先使用`自动找高程注记`功能，再进行`中心线高程自动赋值`, 如果出现红色的线，根据需要手动添加或修改
4. 使用三维效果，查看数据是否正确，再依次排查修改。


## SDK用法
```js
 /**
 * 提取中心线命令参数接口
 * @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,
 *   // ... 其他参数
 * });
```
