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

intersect

先看结论

求两个多边形的交集,返回公共部分的面。

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

参数

参数类型说明
feature1Polygon / MultiPolygon / Feature第一个面
feature2Polygon / MultiPolygon / Feature第二个面

返回值

相交时返回面要素;不相交、仅边界接触、输入退化时返回 null。 返回结果的属性为空,需要保留信息时手动赋值。

示例

var a = turf.polygon([[[116.35, 39.86], [116.45, 39.86], [116.45, 39.94],
                       [116.35, 39.94], [116.35, 39.86]]]);
var b = turf.polygon([[[116.40, 39.90], [116.50, 39.90], [116.50, 39.98],
                       [116.40, 39.98], [116.40, 39.90]]]);

var inter = turf.intersect(a, b);

if (inter) {
  console.log(inter.geometry.type);          // Polygon
  console.log(turf.area(inter) / 1e6);       // 平方公里
} else {
  console.log('两个面没有公共部分');
}

null 的三种来源

  • 两个面完全分离,公共区域不存在。
  • 只在边或顶点上接触,公共部分是线和点,面积为 0。
  • 输入几何非法,例如环未闭合、坐标数量不足、面自相交。

这三种情况返回值相同,业务上如果需要区分,先做一次 turf.booleanIntersects:它返回 true 而 intersect 返回 null,说明是贴边接触。

结果里的碎片

两个面边界交错时,交集可能被切成若干块,甚至出现面积接近 0 的碎片。 直接渲染会让图上出现一两像素的杂点。用面积阈值过滤, 或者只保留最大的那一块:

function largestPart(feature) {
  if (!feature || feature.geometry.type !== 'MultiPolygon') return feature;

  var best = null;
  var max = -1;
  feature.geometry.coordinates.forEach(function (coords) {
    var poly = turf.polygon(coords);
    var a = turf.area(poly);
    if (a > max) { max = a; best = poly; }
  });
  return best;
}

输入要求

7.x 支持 MultiPolygon 与带洞面。面的环必须是闭合的, 外环与内环的方向不做强制要求,但同一份数据在多个工具间流转时, 先用 turf.rewind 规范化可以减少意外的 null。 自相交的面可以用 turf.kinks 提前检测。

线、点的求交不用这个函数

需求正确函数
两条线求交点turf.lineIntersect
线被面切割turf.lineSplit
点是否在面内turf.booleanPointInPolygon
A 减去 Bturf.difference

面积别用平面公式估算。交集可能很小,用包围盒近似会得到完全错误的比例。 直接调 turf.area,结果单位是平方米。

引用本文

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