首页 / Turf.js / API 文档
buffer
先看结论
按给定半径扩展点、线或面,返回缓冲后的多边形。
turf.buffer(geojson, radius, options) → Feature<Polygon | MultiPolygon>
参数
| 参数 | 类型 | 说明 |
|---|---|---|
geojson | Geometry / Feature | 点、线、面均可 |
radius | number | 扩展距离,单位由 units 决定 |
options.units | string | 默认 kilometers |
options.steps | number | 默认 8;点扩展成的圆弧段数 |
返回值
Polygon 或 MultiPolygon 的 Feature。输入面时,向外扩展; 输入线时得到走廊;输入点时得到近似圆。 结果不带输入要素的属性,需要时手动拷贝。
示例
var station = turf.point([116.391263, 39.907359], { name: '站点 A' });
var ring = turf.buffer(station, 800, {
units: 'meters',
steps: 64
});
ring.properties = { name: station.properties.name, radius: 800 };
console.log(ring.geometry.type); // Polygon
console.log(turf.area(ring) / 1e6); // 约 2.01 平方公里
steps 决定形状精度
8 段得到八边形,64 段接近圆。顶点越多,后续相交、渲染越慢。 按用途选择:
| 用途 | 建议 steps | 说明 |
|---|---|---|
| 点落区判断、批量相交 | 8–16 | 几何简单,误差可接受 |
| 常规地图展示 | 32–64 | 缩放到街道级别也看不出棱角 |
| 面积核算 | 64 以上 | 内接多边形面积偏小,段数越多越接近圆 |
半径 1 公里、8 段的八边形面积约是同半径圆面积的 90%。 用缓冲区面积做容量估算时,这个缺口会产生明显偏差。
线要素的走廊
var river = turf.lineString([
[116.30, 39.91], [116.36, 39.90], [116.42, 39.92], [116.48, 39.95]
]);
var belt = turf.buffer(river, 120, { units: 'meters', steps: 16 });
/* 拐角很急或线自相交时,结果可能是 MultiPolygon */
if (belt.geometry.type === 'MultiPolygon') {
console.log('缓冲结果被拆成', belt.geometry.coordinates.length, '块');
}
线缓冲的端点默认是圆头,没有平头选项。需要精确控制端点形状时,
先用 turf.lineSlice 截取线段,再单独处理两端。
面要素与带洞多边形
对带洞的面做缓冲,洞会向内收缩。洞的宽度小于两倍半径时,洞会被完全填平。 这是几何上的正确结果,但常被误认为「洞丢了」。 缓冲后的外环与内环顶点都会被重采样,原始轮廓不再保留。
边界情况
- 半径给 0 或负值不属于常规用法,结果不可依赖,不要用它做「无缓冲」的分支。
- 空几何或空坐标数组会让结果为空或
undefined,调用前先过滤。 - 纬度接近两极时,球面扩展与平面扩展差异巨大,结果只能作为示意。
半径单位必须显式传。turf.buffer(pt, 500) 是 500 公里。
项目里所有缓冲调用都带 { units: 'meters' },
可以一次性消除这类事故。
经纬志(2026)。《buffer》。https://www.jingweizhi.com/turf/api/buffer.html(访问日期 2026-11-03)。