GeoJSONcn
GeoJSONcn / 技术专栏 / 用 Turf.js 给 GeoJ…

用 Turf.js 给 GeoJSON 做缓冲区分析:从坐标点到影响范围

发布于 2026-07-21 · GeoJSONcn 技术团队 · 阅读约 5 分钟

做空间数据时经常碰到一类需求:给一个点(比如某门店的经纬度),圈出它周围 3 公里能配送的范围。这个操作叫缓冲区分析(Buffer),说白了就是围着几何要素往外画一圈。下面用 Turf.js 演示怎么把任意 GeoJSON 要素变成带半径的影响范围,再聊几个实际会踩的坑。

一、一个点的缓冲区

turf.buffer 默认走测地线计算,按地球曲面算距离,而不是把经纬度当平面直角坐标硬算。这一点在国内坐标系上差别很大:如果你的点是 WGS84 经纬度,直接 buffer 就能拿到正确的公里范围。

import * as turf from '@turf/turf';

// 北京天安门,WGS84 经纬度
const point = turf.point([116.397428, 39.90923]);

// 生成 5 公里缓冲区
const buffered = turf.buffer(point, 5, { units: 'kilometers' });

console.log('缓冲区要素:', buffered.geometry.type); // Polygon
console.log('面积(平方公里):', turf.area(buffered) / 1e6); // 约 78.5

units 决定半径单位:

| units 值 | 含义 | 适用场景 | | kilometers | 公里 | 门店配送圈、服务半径 | | miles | 英里 | 海外业务 | | degrees | 度 | 粗略估算,不建议 | | radians | 弧度 | 纯数学计算 |

二、线和面的缓冲区

缓冲不止用于点。一条河流(LineString)做 200 米缓冲,得到河道保护带;一个区县 Polygon 做 1 公里缓冲,能圈出跨行政区的影响范围。

const line = turf.lineString([[116.39, 39.90], [116.41, 39.92]]);
const riverBuffer = turf.buffer(line, 200, { units: 'meters' });

三、两个性能坑

buffer 在复杂多边形上很慢。先用抽稀或 TopoJSON 压缩把顶点降下来,再 buffer,速度能差一个量级(见 series-07、series-13)。

buffer 结果最好烘焙进静态文件,别每次请求都在前端实时算。想看效果,把缓冲后的 Polygon 直接叠到天地图或 OSM 底图上(series-12)就行,不用让用户浏览器跑几何运算。

四、坐标系小心

上面的例子都是 WGS84。国内网页底图大多是 GCJ-02 偏移坐标,如果你的点在 GCJ-02 下,先转回 WGS84 再 buffer,否则圈出来的范围会整体漂几百米。坐标系统一的问题在 series-02 里展开过。

小结

缓冲区是最常用的空间分析之一:门店配送圈、噪声影响带、河道保护范围都靠它。Turf.js 一行 turf.buffer 出结果。走测地线、先降采样再算、坐标系对齐,基本不会出错。