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

union

先看结论

把两个多边形合并成一个整体,重叠部分只保留一次。

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

参数

参数类型说明
polygon1Polygon / MultiPolygon / Feature第一个面
polygon2Polygon / MultiPolygon / Feature第二个面

返回值

合并后的面。两个面相邻或重叠时返回 Polygon,完全分离时返回 MultiPolygon。 因此下游代码必须同时处理这两种类型。

示例

var west = turf.polygon([[[116.30, 39.88], [116.40, 39.88], [116.40, 39.96],
                          [116.30, 39.96], [116.30, 39.88]]]);
var east = turf.polygon([[[116.38, 39.90], [116.48, 39.90], [116.48, 39.98],
                          [116.38, 39.98], [116.38, 39.90]]]);

var merged = turf.union(west, east);

console.log(merged.geometry.type);              // Polygon
console.log(turf.area(merged) / 1e6);           // 合并后面积

var sum = (turf.area(west) + turf.area(east)) / 1e6;
console.log(sum - turf.area(merged) / 1e6);     // 重叠部分的面积

面积核对

合并后的面积等于两者面积之和减去交集面积,这条恒等式是校验结果是否可信的 最直接手段。算出来的差值为负,说明输入的环有重叠或自相交问题。

属性会丢

union 只返回几何,属性通常为空对象。合并行政区、 合并地块时属性怎么处理属于业务决定:取第一个、取并集、 或者按面积占优取一个。写法上先合并,再赋值:

var merged = turf.union(west, east);
merged.properties = {
  name: '西部片区 + 东部片区',
  source: [west.properties.code, east.properties.code]
};

多个面依次合并

函数只接受两个面。批量合并时成对累加,每次合并的结果作为下一次调用的输入。 合并顺序会影响中间结果的顶点数,但最终几何相同。

var parts = [west, east, north];
var result = parts.reduce(function (acc, cur) {
  return turf.union(acc, cur);
});

/* 结果类型可能在中途从 Polygon 变成 MultiPolygon */
console.log(result.geometry.type);

面数量上百时,成对合并的耗时会明显上升。相邻面先按空间索引分组, 每组合并一次,再合并组结果,可以减少重复计算。

和 dissolve 的区别

合并同类要素并去掉内部边界,是 GIS 里的「融合」操作。 union 只处理两个输入,不按属性分组。 需要按字段融合整个图层时,先把同组要素合并, 再把结果收集成 FeatureCollection。

合并前统一环方向。输入面的环方向混乱时,个别版本的合并结果会出现 内环被当成外环的情况。用 turf.rewind 规范化后再合并, 结果更稳定。

引用本文

经纬志(2026)。《union》。https://www.jingweizhi.com/turf/api/union.html(访问日期 2026-11-03)。