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 数据