GIS

GIS Buffer是什么

了解GIS中Buffer(缓冲区)的基本概念、点线面缓冲区、缓冲距离、缓冲区分析以及Buffer与空间查询和GIS空间分析之间的关系。

阅读约 85 分钟

GIS Buffer是什么

Buffer(缓冲区)是GIS空间分析中非常常见的一种操作。

它的作用是:

以一个Geometry为基础,按照指定距离向外扩展,生成一个新的区域。

例如:

Point
  ↓
Buffer 1000m
  ↓
圆形区域

一条道路:

LineString
  ↓
Buffer 500m
  ↓
道路两侧500米范围

一个行政区域:

Polygon
  ↓
Buffer 1000m
  ↓
向外扩展后的区域

因此Buffer可以简单理解为:

Geometry
    ↓
指定距离
    ↓
Buffer
    ↓
新的Polygon

Buffer能够做什么

Buffer广泛应用于:

  • 距离范围分析
  • 服务区分析
  • 道路影响范围分析
  • 环境影响分析
  • 城市规划
  • 土地分析
  • 地理围栏
  • 空间查询
  • 风险区域分析

例如:

查询学校周边500米以内的居民区。

可以转换成:

学校Point
    ↓
Buffer 500m
    ↓
500米范围Polygon
    ↓
与居民区相交

Buffer的基本原理

Buffer的核心流程:

Geometry
    ↓
指定距离
    ↓
计算空间范围
    ↓
生成Polygon

例如:

Point
  ●
  ↓
Buffer 100m
  ↓
  ○

最终生成一个围绕原始Geometry的区域。

Point Buffer

Point是最容易理解的Buffer类型。

例如:

POINT (116.397 39.908)

执行:

Buffer 1000m

得到:

       ○○○
    ○       ○
   ○    ●    ○
    ○       ○
       ○○○

中心:

是原始Point。

外部:

是Buffer区域。

因此:

Point
    ↓
Buffer
    ↓
Circle-like Polygon

Point Buffer的常见应用

例如:

学校服务范围

学校
 ↓
Buffer 1000m
 ↓
1公里服务范围

医院覆盖范围

医院
 ↓
Buffer 5000m
 ↓
5公里医疗服务范围

基站覆盖分析

基站
 ↓
Buffer
 ↓
理论覆盖范围

POI附近查询

商店
 ↓
Buffer 500m
 ↓
查询附近居民

LineString Buffer

LineString Buffer用于分析线状对象周围的区域。

例如一条道路:

──────────────

执行:

Buffer 100m

得到:

══════════════════
══════════════════
──────────────
══════════════════
══════════════════

即:

道路中心线两侧100米范围。

道路Buffer

道路Buffer是非常典型的GIS应用。

例如:

道路
    ↓
Buffer 50m
    ↓
道路影响范围

可以用于:

  • 道路噪声分析
  • 道路绿化规划
  • 拆迁影响分析
  • 道路周边建筑分析
  • 道路服务范围分析

例如:

Road
  ↓
Buffer 100m
  ↓
Select Buildings
  ↓
影响范围内建筑物

河流Buffer

河流也可以进行Buffer分析。

例如:

河流
  ↓
Buffer 200m
  ↓
河流保护范围

然后查询:

保护范围
    ↓
Intersect
    ↓
建筑物

就可以找出:

河流200米范围内的建筑物。

Polygon Buffer

Polygon也可以创建Buffer。

例如一个公园:

┌──────────┐
│   Park   │
└──────────┘

向外Buffer:

    ┌──────────────┐
    │              │
    │  ┌────────┐  │
    │  │  Park  │  │
    │  └────────┘  │
    │              │
    └──────────────┘

例如:

Park
 ↓
Buffer 500m
 ↓
公园周边500米范围

Polygon的负Buffer

Buffer距离不仅可以是正数,也可以是负数。

例如:

Polygon
    ↓
Buffer -100m
    ↓
向内部收缩

示意:

原始区域

┌──────────────┐
│              │
│  ┌────────┐  │
│  │        │  │
│  └────────┘  │
│              │
└──────────────┘

负Buffer常用于:

  • 区域收缩
  • 边界内缩
  • 几何处理
  • 安全距离分析

不过当负Buffer距离过大时,Polygon可能完全消失。

Buffer距离

Buffer最重要的参数之一就是距离。

例如:

Buffer = 100m

表示:

向Geometry周围扩展100米

常见距离:

10m
50m
100m
500m
1km
5km

但需要特别注意:

Buffer距离的单位取决于Geometry使用的坐标系以及具体GIS计算方式。

Buffer的单位问题

这是GIS开发中非常重要的问题。

例如Geometry使用:

EPSG:4326

坐标单位是:

如果直接执行:

Buffer 100

这个100通常并不是100米。

它更可能代表:

100°

这显然不是想要的结果。

因此进行米制Buffer分析时,需要特别注意坐标系和计算方法。

为什么经纬度不能直接当米使用

EPSG:4326通常使用:

经度
纬度

单位是角度。

例如:

POINT (116.397 39.908)

这里:

116.397
39.908

不是米。

因此:

Buffer 100

不能简单理解成:

100米

如果需要准确的米制Buffer,需要使用合适的投影坐标系,或者使用支持地理坐标计算的Buffer算法。

投影坐标系Buffer

如果数据使用适合区域分析的投影坐标系,例如单位为米的投影:

X = 米
Y = 米

那么:

Buffer 100

通常就可以理解为:

100米

流程:

WGS84
 ↓
投影坐标系
 ↓
Meter
 ↓
Buffer 100m

因此:

做距离和Buffer分析时,选择合适的坐标参考系统非常重要。

地理坐标Buffer

对于经纬度数据,也可以使用基于地球曲面的距离计算方式。

例如:

WGS84 Point
    ↓
Geodesic Buffer
    ↓
1000m

这种方式不会简单地把经纬度当作平面米制坐标。

适合:

  • 全球数据
  • 大范围数据
  • 经纬度数据
  • 需要地球曲率考虑的分析

Buffer输出通常是什么

对于常见的点、线、面Buffer:

Point
    ↓
Polygon

LineString
    ↓
Polygon

Polygon
    ↓
Polygon

也就是说:

Buffer通常会生成一个新的Polygon Geometry。

例如:

POINT
 ↓
BUFFER
 ↓
POLYGON

Buffer与Geometry

Buffer本质上是Geometry的一种空间运算。

可以理解为:

Geometry
    ↓
Buffer(distance)
    ↓
Geometry

例如:

Point
    ↓
Buffer(1000)
    ↓
Polygon

或者:

LineString
    ↓
Buffer(100)
    ↓
Polygon

Buffer与空间查询

Buffer经常与空间查询结合。

例如:

查询某个医院1公里范围内的学校。

步骤:

医院
 ↓
Buffer 1000m
 ↓
医院服务范围
 ↓
Spatial Query
 ↓
学校

最终得到:

范围内学校

Buffer与Intersects

Buffer经常和Intersects配合使用。

例如:

Road
 ↓
Buffer 100m
 ↓
Buffer Polygon
 ↓
Intersects
 ↓
Buildings

意思是:

查询与道路100米缓冲区相交的建筑物。

Buffer与Contains

例如:

Hospital
 ↓
Buffer 1000m
 ↓
Service Area
 ↓
Contains
 ↓
POI

可以查询:

哪些POI位于医院1公里范围内。

Buffer与Within

也可以反过来判断:

Point
 ↓
Within
 ↓
Buffer

例如:

居民点
    ↓
Within
    ↓
学校1公里Buffer

表示:

居民点是否位于学校1公里范围内。

Buffer与Distance

Buffer和Distance经常一起出现。

Distance回答:

A和B之间距离是多少?

例如:

Point A
    ↓
Distance
    ↓
500m
    ↓
Point B

Buffer回答:

距离A 500米以内的区域在哪里?

例如:

Point A
    ↓
Buffer 500m
    ↓
区域

因此:

Distance
    ↓
计算距离

Buffer
    ↓
生成距离范围

Buffer与Nearest

例如需要找到:

离某个医院最近的学校。

可以使用:

Hospital
 ↓
Distance
 ↓
Schools
 ↓
Sort
 ↓
Nearest

而如果需要:

查询医院2公里范围内的所有学校。

则更适合:

Hospital
 ↓
Buffer 2000m
 ↓
Spatial Query
 ↓
Schools

Buffer的端点样式

对于LineString Buffer,端点可以有不同样式。

常见类型:

Round
Square
Flat

例如:

Round
────────
(      )

Square
────────
┌──────┐

Flat
────────
|      |

不同的端点样式会影响最终Buffer Polygon的形状。

Buffer的连接样式

LineString中不同线段连接的位置也可以有不同样式。

常见类型:

Round
Mitre
Bevel

例如:

Round
    ╭────
────╯

Mitre
    /────
───/

Bevel
   /────
──/

这些参数通常在GIS库中称为:

joinStyle
capStyle

Buffer的精度

圆形Buffer实际上通常不会真正保存一个数学意义上的连续圆。

而是由很多线段近似。

例如:

理论圆
   ○

Polygon近似
  ╭────╮
 /      \
|        |
 \      /
  ╰────╯

因此Buffer通常需要设置:

segments

或者:

quadrantSegments

等参数。

Buffer分辨率

Buffer使用的线段越多:

segments ↑

圆形越平滑。

例如:

低分辨率

  ______
 /      \
|        |
 \______/

高分辨率

    ╭──────╮
  ╭─        ─╮
 │            │
  ╰─        ─╯
    ╰──────╯

但线段越多:

Geometry
 ↓
节点数量 ↑
 ↓
计算成本 ↑

因此需要在:

精度

和:

性能

之间进行平衡。

Buffer的空间分析流程

典型Buffer分析:

Input Geometry
    ↓
选择距离
    ↓
选择坐标系
    ↓
执行Buffer
    ↓
生成Polygon
    ↓
空间查询
    ↓
得到分析结果

例如:

学校
 ↓
1000m
 ↓
Buffer
 ↓
服务范围
 ↓
Intersect
 ↓
居民区

Buffer应用:城市规划

例如:

分析地铁站500米范围内的建筑。

流程:

地铁站
 ↓
Buffer 500m
 ↓
500米范围
 ↓
Intersect
 ↓
建筑物

可以统计:

  • 建筑数量
  • 建筑面积
  • 人口
  • 商业设施

Buffer应用:环境保护

例如:

河流两侧200米保护范围。

流程:

River
 ↓
Buffer 200m
 ↓
保护区

再进行:

Intersect
 ↓
工业企业

就可以找出:

位于河流保护范围内的企业。

Buffer应用:道路影响分析

例如:

分析高速公路两侧1公里范围。

流程:

Highway
 ↓
Buffer 1000m
 ↓
影响范围
 ↓
Intersect
 ↓
Buildings

可以进一步统计:

建筑数量
人口
土地面积

Buffer应用:地理围栏

Buffer也可以用于构建简单的地理围栏。

例如:

仓库
 ↓
Buffer 500m
 ↓
Geofence

车辆进入:

Geofence
 ↓
Contains
 ↓
AGV / Vehicle

就可以判断:

车辆是否进入指定区域。

Buffer应用:服务范围

例如:

医院
 ↓
Buffer 5km
 ↓
服务范围

多个医院:

Hospital A
 ↓
Buffer 5km

Hospital B
 ↓
Buffer 5km

Hospital C
 ↓
Buffer 5km

可以进一步分析服务区域是否存在:

覆盖空白

或者:

重复覆盖

Buffer应用:空间风险分析

例如一个危险源:

危险源
 ↓
Buffer 1000m
 ↓
风险区域

然后查询:

学校
居民区
医院
工厂

可以判断哪些对象处于风险范围内。

Buffer与叠加分析

Buffer经常作为空间叠加分析的前置步骤。

例如:

道路
 ↓
Buffer
 ↓
影响区域
 ↓
Intersect
 ↓
土地利用

或者:

河流
 ↓
Buffer
 ↓
保护区域
 ↓
Intersect
 ↓
建筑物

因此Buffer本身只是一个空间分析工具,通常还会与其他空间关系运算组合。

Buffer常见参数

不同GIS软件或GIS开发库中的参数名称可能不同,但通常包含:

distance
segments
capStyle
joinStyle

其中:

distance
    ↓
缓冲距离

segments
    ↓
曲线近似精度

capStyle
    ↓
线端样式

joinStyle
    ↓
线段连接样式

Buffer数据处理示例

输入:

POINT (116.397 39.908)

参数:

distance = 1000m

处理:

Point
 ↓
Buffer
 ↓
Polygon

输出:

Polygon
 ↓
GeoJSON

例如:

{
  "type": "Polygon",
  "coordinates": [
    [
      ...
    ]
  ]
}

Buffer与WKT

Buffer可以直接作用于WKT Geometry。

例如:

POINT (116.397 39.908)

经过:

Buffer 1000m

生成:

POLYGON ((...))

流程:

WKT
 ↓
Geometry
 ↓
Buffer
 ↓
Geometry
 ↓
WKT

因此WKT非常适合用于Buffer测试。

Buffer与GeoJSON

同样可以对GeoJSON Geometry执行Buffer:

GeoJSON
 ↓
Geometry
 ↓
Buffer
 ↓
Polygon
 ↓
GeoJSON

例如:

Point GeoJSON
    ↓
Buffer
    ↓
Polygon GeoJSON

这在Web GIS应用中非常常见。

Buffer与Shapefile

Shapefile可以作为Buffer的输入数据:

Shapefile
 ↓
读取Geometry
 ↓
Buffer
 ↓
新的Polygon
 ↓
Shapefile / GeoJSON / GeoPackage

例如:

roads.shp
 ↓
Buffer 100m
 ↓
road_buffer

最终得到道路影响范围图层。

Buffer与GeoPackage

GeoPackage非常适合保存Buffer分析结果。

例如:

city.gpkg
├── roads
├── buildings
├── rivers
└── road_buffer

这样可以在一个GeoPackage中保存:

原始数据
+
分析结果

Buffer与GeoParquet

大规模空间数据也可以执行Buffer分析。

例如:

GeoParquet
 ↓
Geometry
 ↓
Buffer
 ↓
Polygon
 ↓
GeoParquet

适合:

  • 大量道路
  • 大量POI
  • 大规模建筑物
  • 空间数据分析

Buffer常见问题

为什么Buffer距离不对?

首先检查:

CRS

尤其是:

EPSG:4326

经纬度坐标不能简单地把数字当作米。

为什么Buffer结果很粗糙?

可能是:

segments

设置过低。

提高曲线近似的分段数量可以让结果更加平滑。

为什么负Buffer后Geometry消失?

因为负Buffer会向内部收缩。

当距离超过Polygon能够承受的范围时:

Polygon
 ↓
Negative Buffer
 ↓
Empty Geometry

这是正常现象。

为什么Buffer后出现很多节点?

Buffer需要通过大量线段近似圆弧。

因此:

segments ↑
 ↓
节点数量 ↑

如果数据量很大,可能会明显增加计算成本。

Buffer知识结构

可以把Buffer总结为:

Buffer
│
├── Point
│   └── 圆形范围
│
├── LineString
│   └── 线状影响范围
│
└── Polygon
    └── 区域扩展 / 收缩

核心参数:

Buffer
├── distance
├── segments
├── capStyle
└── joinStyle

核心流程:

Geometry
    ↓
CRS
    ↓
Distance
    ↓
Buffer
    ↓
Polygon

Buffer与空间分析

Buffer经常与其他空间分析操作组合:

Buffer
    ↓
Intersect
Buffer
    ↓
Contains
Buffer
    ↓
Within
Buffer
    ↓
Distance
Buffer
    ↓
Spatial Query

因此:

Buffer是GIS空间分析中连接“距离”和“空间范围”的重要工具。

总结

Buffer(缓冲区)是一种基于Geometry和指定距离生成空间范围的GIS分析操作。

最基本的关系是:

Point
    ↓
Buffer
    ↓
Polygon
LineString
    ↓
Buffer
    ↓
Polygon
Polygon
    ↓
Buffer
    ↓
Polygon

Buffer可以用于:

距离分析
服务范围
道路影响
河流保护
风险分析
地理围栏
空间查询
城市规划

需要特别注意:

Buffer距离的单位与坐标系密切相关。使用经纬度坐标进行米制Buffer时,不能简单地把距离数字直接当成米。

可以记住:

Distance回答“距离是多少”,Buffer回答“这个距离范围在哪里”。

在GIS空间分析中,一个非常典型的流程就是:

Geometry
    ↓
Buffer
    ↓
空间范围
    ↓
Intersect / Contains / Within
    ↓
空间分析结果
🧰

相关工具

使用 IYATools 在线工具快速处理 GIS 数据