2010-Single-Sided-Buffers-in-JTS
JTS 中的单侧缓冲区
原文:Single-Sided Buffers in JTS
作者:Martin Davis
日期:2010年11月
概述
单侧缓冲区(Single-Sided Buffer)是 JTS 2010 年版本添加的重要功能。与标准缓冲区在几何图形两侧创建多边形不同,单侧缓冲区只在线的一侧生成缓冲区。
什么是单侧缓冲区?
标准缓冲区
标准缓冲区在几何图形的所有方向上扩展指定的距离,创建一个完全包围原始几何图形的多边形。
╭─────────────────╮
│ │
│ 原始线 │
│ ======== │
│ │
╰─────────────────╯
标准缓冲区
单侧缓冲区
单侧缓冲区只在线的一侧创建多边形:
═══════════════════
│ │
│ 原始线 │
╰─────────────────╯
单侧缓冲区(右侧)
方向控制
通过缓冲距离的正负号控制缓冲方向:
- 正值:在线的右侧创建缓冲区
- 负值:在线的左侧创建缓冲区
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.operation.buffer.BufferOp;
import org.locationtech.jts.operation.buffer.BufferParameters;
Geometry line = ...;
// 创建单侧缓冲区参数
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
// 右侧缓冲区(正值)
double rightDistance = 10.0;
Geometry rightBuffer = BufferOp.bufferOp(line, rightDistance, params);
// 左侧缓冲区(负值)
double leftDistance = -10.0;
Geometry leftBuffer = BufferOp.bufferOp(line, leftDistance, params);
应用场景
1. 道路缓冲区
在道路一侧创建缓冲区,例如:
- 人行道规划
- 停车带
- 噪音缓冲区
// 道路中心线
Geometry roadCenterline = ...;
// 创建道路右侧 3 米的人行道缓冲区
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
Geometry sidewalkArea = BufferOp.bufferOp(roadCenterline, 3.0, params);
2. 海岸线缓冲区
从海岸线向内陆方向创建缓冲区:
- 海岸侵蚀分析
- 沿海保护区
- 洪水风险区域
// 海岸线
Geometry coastline = ...;
// 向内陆方向创建 100 米缓冲区
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
Geometry coastalZone = BufferOp.bufferOp(coastline, 100.0, params);
3. 河流管理
在河流一侧创建管理区域:
- 河岸植被带
- 开发限制区
- 生态走廊
缓冲区参数配置
端点样式(End Cap Style)
对于单侧缓冲区,端点样式总是设置为 CAP_FLAT:
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
// 端点样式对单侧缓冲区无效,总是使用 CAP_FLAT
连接样式(Join Style)
连接样式控制线转角处的处理方式:
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
// 圆角连接(默认)
params.setJoinStyle(BufferParameters.JOIN_ROUND);
// 斜角连接
params.setJoinStyle(BufferParameters.JOIN_MITRE);
// 平角连接
params.setJoinStyle(BufferParameters.JOIN_BEVEL);
象限段数(Quadrant Segments)
控制曲线近似的精度:
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
// 设置象限段数(默认为 8)
// 数值越大,曲线越平滑
params.setQuadrantSegments(16);
斜接限制(Mitre Limit)
使用斜角连接时控制尖角的最大长度:
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
params.setJoinStyle(BufferParameters.JOIN_MITRE);
// 设置斜接限制
params.setMitreLimit(5.0);
代码示例
基本用法
import org.locationtech.jts.geom.*;
import org.locationtech.jts.operation.buffer.*;
import org.locationtech.jts.io.WKTReader;
public class SingleSidedBufferExample {
public static void main(String[] args) throws Exception {
// 创建测试线
WKTReader reader = new WKTReader();
Geometry line = reader.read("LINESTRING (0 0, 100 0, 100 100)");
// 配置单侧缓冲区参数
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
params.setJoinStyle(BufferParameters.JOIN_ROUND);
params.setQuadrantSegments(8);
// 创建右侧缓冲区
double distance = 10.0;
Geometry buffer = BufferOp.bufferOp(line, distance, params);
System.out.println("原始线: " + line);
System.out.println("单侧缓冲区: " + buffer);
}
}
双侧不同宽度
// 创建左右宽度不同的缓冲区
public Geometry createAsymmetricBuffer(Geometry line,
double leftWidth,
double rightWidth) {
BufferParameters params = new BufferParameters();
params.setSingleSided(true);
// 左侧缓冲区
Geometry leftBuffer = BufferOp.bufferOp(line, -leftWidth, params);
// 右侧缓冲区
Geometry rightBuffer = BufferOp.bufferOp(line, rightWidth, params);
// 合并两侧缓冲区
return leftBuffer.union(rightBuffer);
}
在其他工具中的支持
单侧缓冲区功能也可在以下工具中使用:
QGIS
- 处理工具箱 → 矢量几何 → 单侧缓冲区
PostGIS
-- PostGIS 中的单侧缓冲区
SELECT ST_Buffer(
geom,
10,
'side=left'
) FROM lines;
Shapely (Python)
from shapely.geometry import LineString
from shapely.ops import single_sided_buffer
line = LineString([(0, 0), (100, 0), (100, 100)])
# 右侧缓冲区
right_buffer = single_sided_buffer(line, 10, side='right')
# 左侧缓冲区
left_buffer = single_sided_buffer(line, 10, side='left')
注意事项
- 仅适用于线几何:单侧缓冲区主要用于 LineString 和 MultiLineString
- 点几何:对于点几何,单侧缓冲区与标准缓冲区相同
- 多边形:对于多边形,应使用标准缓冲区
- 方向一致性:确保线的数字化方向一致,以获得预期的缓冲方向
总结
单侧缓冲区是空间分析的重要工具,特别适用于需要在特定方向创建缓冲区的场景。JTS 提供了灵活的参数控制,可以根据不同需求定制缓冲区的形状和精度。

浙公网安备 33010602011771号