经纬志
首页 / Turf.js / API 文档

buffer

先看结论

按给定半径扩展点、线或面,返回缓冲后的多边形。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-27 · 引用本文
turf.buffer(geojson, radius, options) → Feature<Polygon | MultiPolygon>

参数

参数类型说明
geojsonGeometry / Feature点、线、面均可
radiusnumber扩展距离,单位由 units 决定
options.unitsstring默认 kilometers
options.stepsnumber默认 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)。