pointInPolygon
判断一个点是否位于多边形内部,返回布尔值。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
point | Point / Feature | 待判断的点,[经度, 纬度] |
polygon | Polygon / MultiPolygon | 支持带洞面与多面;第一个环为外环 |
options.ignoreBoundary | boolean | 默认 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)。