turf.mask()函数处理10个及以上多边形时无法返回运行结果
turf.mask() 多掩膜场景无响应根因与修复
核心触发原因
- 逐次裁剪逻辑的性能瓶颈
6.3.0版本的turf.mask没有实现批量布尔运算,而是对传入的掩膜多边形逐次做差集:从初始的全球覆盖面开始,每拿到一个圆形,就对当前结果做一次裁剪,计算所有边界交点、拆分多边形、移除重叠部分。
你当前的配置里,单个圆形设了steps:64(64个顶点的高精度正多边形),搭配写反的bbox参数、1000公里的大半径,生成的圆形会出现大量边界交叉、完全重叠的情况。9个圆的总交点计算量刚好在JS单线程的可处理范围内;只要数量到10个,整体计算量会跳涨几个数量级,直接阻塞主线程,表现为持续计算、无返回、无报错。 - 6.3.0版本的已知拓扑bug
该版本的差集裁剪模块存在未修复的遍历逻辑问题:处理多重重叠多边形时,边界交点的排序环节会进入无限循环,既不会抛出错误,也不会主动终止计算。
可落地修复方案
- 降低圆形精度:把
steps参数从64调整到8-16,完全满足常规空间分析的精度要求,同时将单个多边形的顶点数降低75%以上,大幅减少计算量 - 修正bbox格式:标准bbox的参数顺序为
[minLng, minLat, maxLng, maxLat],你当前传入的参数把经纬度的最大、最小值写反了,会导致随机点分布范围异常,进一步推高圆形重叠概率 - 调整圆形半径,避免生成的圆形在随机点分布范围内出现大面积重叠
- 处理10个以上掩膜的场景,建议升级到Turf 7.x版本,新版重写了空间布尔运算逻辑,替换了逐次裁剪的实现方式,可从根本上解决多掩膜场景的性能问题和无限循环bug
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

