在日常 GIS 数据处理中,经常需要基于已有线要素生成与之平行的新线。QGIS 提供了多种方式来实现这一需求,本文介绍两种最常用且已内置的工具,分别适用于快速出图和精细控制两种场景。
以下示例假设项目坐标系为 EPSG:3857(Web Mercator,单位为米),偏移距离设为 10 米。
适用场景:在 QGIS 中按指定距离复制一条平行线,例如道路红线偏移、管线平行布设、河道岸线生成等。
方法一:QGIS 原生工具
适用场景
- 只需要一条简单的平行线,不关心方向(左/右)
- 追求操作速度和简洁性
- 对拐角处理没有特殊要求
工具信息
算法名称: 偏移线
算法 ID: native:offsetline |
所在位置:工具箱 → 矢量几何图形 → 偏移线
操作步骤
- 打开 QGIS,在菜单栏找到 数据处理 → 工具箱(或按
Ctrl+Alt+T),打开处理工具箱面板。
- 在搜索框中输入
native:offsetline 或直接搜索 偏移线。
- 双击该工具,进入参数配置界面:
- 输入图层:选择你的线图层。
- 距离:输入
10(单位与项目坐标系一致,EPSG:3857 下即 10 米)。
- 段数:控制曲线偏移时的分段精度,默认值通常即可。
- 连接样式:选择拐角处的连接方式(圆角/斜接/斜切)。
- 点击 "运行",即可生成偏移后的平行线图层。
算法局限
- 无法指定偏移方向(左侧/右侧),默认向一侧偏移
- 对复杂拐角的处理能力有限
方法二:GRASS GIS v.parallel 工具
适用场景
- 需要精确控制平行线生成在线的左侧、右侧或两侧
- 需要处理拐角处的圆角效果
- 遇到内部拐角(凹角)生成异常,需要类似缓冲区的处理方式
- 对输出质量有较高要求
工具信息
算法名称:v.parallel
算法 ID:grass:v.parallel
所在位置:工具箱 → GRASS → 矢量 → v.parallel
参数详解
distance(主轴距离):平行线偏移距离(单位与坐标系一致)
side:偏移方向:left(左侧)、right(右侧)、both(两侧)
-r 标志:勾选后,外部拐角将变为圆角,视觉效果更平滑
-b 标志:创建类似缓冲区的平行线,可解决内部拐角(凹角)生成异常的问题
minordistance (次轴距离):沿次轴的偏移距离。(单位与坐标系一致)
angle (主轴角度):主轴的角度(以度为单位),默认值为 0
tolerance (容差):弧形折线的容差(单位与坐标系一致)
名词解释:
distance (主轴距离):平行线与原线之间的垂直距离(即侧向偏移)。
minordistance (次轴距离):平行线沿原线方向(纵向)的偏移量。
操作步骤
- 在处理工具箱搜索栏中输入
grass:v.parallel 或 v.parallel。
- 双击打开工具,配置参数:
- Input vector layer:选择你的线图层。
- Distance:输入
10。
- Side:根据需要选择
left、right 或 both。
- 勾选 -r 使外部拐角圆角化(推荐)。
- 如遇内部拐角生成问题,勾选 -b。
- 点击 "运行",等待 GRASS 处理完成。

实战建议
- 快速验证:先用方法一(原生偏移线)快速生成,查看大致效果。
- 精细调整:如果方向不对或拐角不理想,切换到方法二(v.parallel),利用
side 和 -r 参数进行精细控制。
- 批量处理:两种工具都支持 QGIS 的批处理模式(右键工具 → 作为批处理执行),可一次性对多个图层执行相同操作。
- 坐标系注意:偏移距离的单位取决于项目坐标系。如果使用 EPSG:4326(WGS84 经纬度),距离单位为度而非米,需先重投影到投影坐标系(如 EPSG:3857 或当地 UTM 投影)。
代码实现:批量执行 v.parallel
运行代码前,请修改 图层名称、输出目录和间距参数。
from qgis.core import QgsProject, QgsVectorLayer, QgsProcessingFeedback
from qgis.PyQt.QtCore import Qt, QVariant
from qgis.PyQt.QtGui import QColor, QFont, QBrush
import processing
import os
# PyQGIS Code
# 获取当前项目实例
project = QgsProject.instance()
# 获取输入图层 Lines(按名称查找)
layers = project.mapLayersByName('Lines')
if not layers:
raise ValueError("项目中未找到名为 'Lines' 的图层,请确认图层名称是否正确。")
input_layer = layers[0]
input_source = input_layer.source()
# 设置输出目录
output_dir = 'D:/output/20260724'
os.makedirs(output_dir, exist_ok=True)
# 设置等距间隔参数(单位:米,项目坐标系 EPSG:3857 为米单位)
distances = [10, 20, 30, 40, 50]
# 设置生成侧边:0=左侧(left),1=右侧(right),2=两侧(both)
sides = {
'left': 0,
'right': 1
}
# 创建处理反馈对象
feedback = QgsProcessingFeedback()
# 批量生成平行线
generated_layers = []
for distance in distances:
for side_name, side_value in sides.items():
# 构造输出文件路径和图层名称
output_name = f'Lines_Parallel_{side_name}_{distance}m'
output_path = os.path.join(output_dir, f'{output_name}.shp')
# v.parallel 算法参数
params = {
'input': input_source, # 输入线图层
'distance': distance, # 偏移距离(米)
'side': side_value, # 侧边枚举值:0=left, 1=right, 2=both
'output': output_path, # 输出文件路径
'-r': False, # 不将外拐角圆角化
'-b': False, # 不创建缓冲区样式平行线
}
try:
# 执行 grass:v.parallel 算法
result = processing.run('grass:v.parallel', params, feedback=feedback)
# 将结果加载为 QgsVectorLayer
output_layer = QgsVectorLayer(result['output'], output_name, 'ogr')
if output_layer.isValid():
# 添加到当前项目
project.addMapLayer(output_layer)
generated_layers.append(output_name)
print(f'成功生成并加载图层:{output_name} -> {output_path}')
else:
print(f'结果图层无效:{output_name}')
except Exception as e:
print(f'生成 {output_name} 时出错:{str(e)}')
print(f'\n批量生成完成,共生成 {len(generated_layers)} 个平行线图层。')

扩展阅读
官方手册:v.parallel - GRASS GIS Manual
更多问题,欢迎留言。转载须注明出处。