插值与网格
手上只有几十个采样点,要画出一整片连续分布,就要靠插值。 另一类需求是把空间切成规则网格再逐格统计。两者都输出大量新几何, 计算成本远高于几何判断。
反距离加权插值
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 | 输出几何 | 适用 |
|---|---|---|
point | Point 集合 | 再做等值线、热力 |
square | Polygon 集合 | 逐格着色、栅格化 |
hex | Polygon 集合(六边形) | 视觉上更均匀的统计单元 |
等值线
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)。