首页 / Turf.js / API 文档
intersect
先看结论
求两个多边形的交集,返回公共部分的面。
turf.intersect(feature1, feature2) → Feature<Polygon | MultiPolygon> | null
参数
| 参数 | 类型 | 说明 |
|---|---|---|
feature1 | Polygon / MultiPolygon / Feature | 第一个面 |
feature2 | Polygon / 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 减去 B | turf.difference |
面积别用平面公式估算。交集可能很小,用包围盒近似会得到完全错误的比例。
直接调 turf.area,结果单位是平方米。
经纬志(2026)。《intersect》。https://www.jingweizhi.com/turf/api/intersect.html(访问日期 2026-11-03)。