经纬志
首页 / Turf.js / 教程

插值与网格

先看结论

手上只有几十个采样点,要画出一整片连续分布,就要靠插值。 另一类需求是把空间切成规则网格再逐格统计。两者都输出大量新几何, 计算成本远高于几何判断。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-29 · 引用本文

反距离加权插值

interpolate 用采样点的某个数值属性,反距离加权推算出格网值。 gridType 决定格子形状,cellSize 决定密度。

var samples = turf.featureCollection([
  turf.point([116.38, 39.90], { value: 42 }),
  turf.point([116.40, 39.91], { value: 58 }),
  turf.point([116.42, 39.89], { value: 35 }),
  turf.point([116.44, 39.92], { value: 71 })
]);

var grid = turf.interpolate(samples, 0.5, {
  gridType: 'point',        // point | square | hex
  property: 'value',
  units: 'kilometers',
  weight: 2                 // 距离的幂次,越大越「只信近处」
});

console.log(grid.features.length);
console.log(grid.features[0].properties);   // 含 value 插值结果

cellSize 的单位由 units 决定。0.5 公里在市区尺度上是 很细的网格,几十平方公里的范围就会生成上万个点。先用 2 到 5 公里验证流程, 再往下调。

gridType输出几何适用
pointPoint 集合再做等值线、热力
squarePolygon 集合逐格着色、栅格化
hexPolygon 集合(六边形)视觉上更均匀的统计单元

等值线

isolines 把连续插值结果切成不同级别的线,输入必须是带数值属性的点集。 断点数组就是等值线的级别,顺序无所谓,内部会排序。

var lines = turf.isolines(samples, [30, 40, 50, 60, 70], {
  zProperty: 'value',
  commonProperties: { unit: 'μg/m³' }
});

lines.features.forEach(function (f) {
  console.log(f.properties.value, f.geometry.type);
});

断点太少,图上只有几条稀疏的线;断点太多,线会密集到糊成一片。 实际显示时按数据范围取 5 到 10 个级别,并给不同级别配不同颜色。

三角网

tin 把点集连成三角面。它不做插值,也不合并属性, 适合做地形剖面、找相邻采样点之间的关系。

var mesh = turf.tin(samples);

console.log('三角面数', mesh.features.length);
console.log(mesh.features[0].geometry);     // 三个顶点的坐标

规则网格生成

网格函数只负责切格子,本身不带数据。逐格统计需要再做一次点面判断。

var hexes = turf.hexGrid(turf.bbox(samples), 1, {
  units: 'kilometers',
  properties: { grid: 'hex' }
});

hexes.features.forEach(function (cell) {
  var inside = samples.features.filter(function (p) {
    return turf.booleanPointInPolygon(p, cell);
  });
  cell.properties.count = inside.length;
});

console.log(hexes.features.length, '个格子');

网格边界取 bbox,不是 bboxPolygon。hexGrid 等函数的第一个参数 是 [minX, minY, maxX, maxY] 形式的数组。传一个面要素进去, 会被当成四点数组解析,生成出完全错位的网格。

注意事项

属性不是数字

插值读取的 property 必须是数字。字符串形式的 "42" 在部分版本会被转成 NaN, 结果整片网格的值都是 null,且不报错。

插值范围超出数据范围

interpolate 只在采样点的外包范围内生成格网。想在范围外也画, 需要手动扩 bbox 并把边缘值固定,插值函数本身不做外推。

网格数量爆炸

0.1 公里的方格在 100 平方公里范围里是十万个面。浏览器端生成这么大的 FeatureCollection 会卡住主线程,改为服务端出瓦片或在 Web Worker 里算。

引用本文

经纬志(2026)。《插值与网格》。https://www.jingweizhi.com/turf/tutorial/interpolation.html(访问日期 2026-11-03)。