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

pointInPolygon

先看结论

判断一个点是否位于多边形内部,返回布尔值。

最后验证 2026-11-03 · Turf.js 7.x · 更新 2026-10-27 · 引用本文
turf.pointInPolygon(point, polygon, options) → boolean

参数

参数类型说明
pointPoint / Feature待判断的点,[经度, 纬度]
polygonPolygon / MultiPolygon支持带洞面与多面;第一个环为外环
options.ignoreBoundaryboolean默认 false,即边界上的点算在内部

函数名说明

7.x 的正式名称是 booleanPointInPolygon, pointInPolygon 是同一实现的别名,两者可互换。 引用的构建版本较旧、拿不到别名时,用正式名即可。

var inPoly = turf.pointInPolygon || turf.booleanPointInPolygon;
console.log(inPoly(turf.point([116.39, 39.90]), polygon));

示例

var park = turf.polygon([[
  [116.300, 39.950], [116.360, 39.950], [116.360, 39.995],
  [116.300, 39.995], [116.300, 39.950]
]]);

var inside = turf.point([116.330, 39.970]);
var outside = turf.point([116.380, 39.970]);
var onEdge  = turf.point([116.300, 39.970]);

console.log(turf.pointInPolygon(inside, park));     // true
console.log(turf.pointInPolygon(outside, park));    // false
console.log(turf.pointInPolygon(onEdge, park));     // true
console.log(turf.pointInPolygon(onEdge, park, { ignoreBoundary: true })); // false

带洞面

第二个环起视为洞。点落在洞里返回 false, 落在洞的边线上按 ignoreBoundary 的设定处理。 洞的环方向不需要特意调整,判断不依赖方向; 但如果要做相交、合并运算,先统一环方向更稳妥。

MultiPolygon

多面逐个判断,命中任意一个子面即为 true。 子面之间有重叠也不影响结果。

批量判断的性能

这个函数每次调用都要遍历面的所有顶点。几千个点没问题, 几万个点对高精度边界时耗时会明显上升。三种优化按代价从低到高:

  • 先用 turf.bbox 的矩形做粗筛,排除面外的点。
  • 面只解析一次,避免在循环里重复构造 Feature。
  • 点量超过十万时,改用网格索引或后端空间数据库。
var box = turf.bbox(park);

var hits = coords.filter(function (c) {
  if (c[0] < box[0] || c[0] > box[2] || c[1] < box[1] || c[1] > box[3]) {
    return false;
  }
  return turf.pointInPolygon(turf.point(c), park);
});

边界判断不稳定时

边界由浮点数表示,一个理论上落在边上的点可能因为精度被算作内部或外部。 需要稳定的归属时,不要依赖边界语义:要么给数据加缓冲, 要么在业务上指定优先级(例如行政归属按编码匹配,而不是按几何判断)。

坐标顺序反了会得到稳定的 false。从 Leaflet 的 latLng 或后端 [lat, lng] 数据取值时, 必须交换成 [lng, lat],否则点会落到地球另一侧。

引用本文

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