首页 / Turf.js / API 文档
booleanEqual
先看结论
两个同类型几何的坐标是否逐一相等,按指定小数位比较。
turf.booleanEqual(feature1, feature2, options?) → boolean
参数
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
feature1 | Geometry | Feature | — | 第一个几何 |
feature2 | Geometry | Feature | — | 第二个几何 |
options.precision | number | 6 | 比较时保留的小数位数 |
比较规则
| 项 | 是否参与比较 |
|---|---|
| 几何类型 | 是,类型不同直接为假 |
| 坐标顺序 | 是,顶点顺序不同为假 |
| 环的起点 | 是,起点不同为假 |
属性 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)。