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

booleanEqual

先看结论

两个同类型几何的坐标是否逐一相等,按指定小数位比较。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-29 · 引用本文
turf.booleanEqual(feature1, feature2, options?) → boolean

参数

参数类型默认说明
feature1Geometry | Feature—第一个几何
feature2Geometry | Feature—第二个几何
options.precisionnumber6比较时保留的小数位数

比较规则

项是否参与比较
几何类型是,类型不同直接为假
坐标顺序是,顶点顺序不同为假
环的起点是,起点不同为假
属性 properties否
要素 id否

这意味着两个描述同一块面、但起点或顶点顺序不同的多边形, 会被判为不相等。比较前先做规范化。

示例

var pt1 = turf.point([0, 0]);
var pt2 = turf.point([0, 0]);
var pt3 = turf.point([1, 1]);

console.log(turf.booleanEqual(pt1, pt2));   // true
console.log(turf.booleanEqual(pt2, pt3));   // false

/* 属性不同不影响结果 */
pt2.properties = { name: '任意' };
console.log(turf.booleanEqual(pt1, pt2));   // true

精度选项

var a = turf.point([116.3912634, 39.9073599]);
var b = turf.point([116.3912635, 39.9073598]);

console.log(turf.booleanEqual(a, b));                    // false,默认 6 位
console.log(turf.booleanEqual(a, b, { precision: 5 }));  // true,5 位相同

精度按四舍五入后比较,不是按绝对距离。6 位小数在赤道约 0.1 米, 足以吸收不同的坐标存储格式,但挡不住真实的测量差异。

规范化后再比较

function normalizeRing(polygon) {
  var ring = polygon.geometry.coordinates[0].slice(0, -1);

  /* 找经度最小的顶点作为起点,保证两次遍历得到同一顺序 */
  var start = 0;
  for (var i = 1; i < ring.length; i++) {
    if (ring[i][0] < ring[start][0]) { start = i; }
  }

  var rotated = ring.slice(start).concat(ring.slice(0, start));
  rotated.push(rotated[0]);

  return turf.polygon([rotated]);
}

turf.booleanEqual(normalizeRing(p1), normalizeRing(p2));

规范化只处理起点,不处理环方向。方向相反时还要额外反转数组, 否则同一块面的顺时针与逆时针表示仍会被判为不同。

它不是几何等价判断。 顶点加密、简化、起点不同都会让结果变成假,即使形状几乎一样。 需要形状级比较时用 turf.difference 双向求差并检查面积是否为零。

引用本文

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