Mapbox GL JS clusterProperties计算点属性平均值报错及结果异常问题
Mapbox GL JS 聚类平均值计算问题说明与解决方案
错误原因
你两次写法出错的核心原因是对clusterProperties的运行逻辑理解有误:clusterProperties内的所有表达式都是聚类过程中逐点执行的聚合运算,并非聚类完成后对整个集群的最终属性做计算。
- 第一次报错是因为
let表达式不属于Mapbox规定的集群聚合表达式格式,集群聚合需要符合reduce类表达式的参数要求(初始值、单点位处理逻辑、累加逻辑),你写的let表达式缺少必要的聚合参数,因此触发参数不足的报错。 - 第二次无报错但结果异常,是因为你把除法逻辑放在了聚合过程中,相当于每加入一个点位就执行一次除法,而非等整个集群所有点位的
detections求和完成后,再除以集群总点数,最终计算结果自然和预期不符。
正确实现方案
你最终采用的写法是该场景下的标准正确方案:
步骤1:仅在集群属性中做求和聚合
map.addSource(detections_heatmap_src, { type: "geojson", data: heatmapCloud_value.recordings, cluster: true, clusterRadius: 10, // 聚类半径,默认值为50 clusterProperties: { clusterTotal: ["+", ["get", "detections"]], // 仅聚合求和所有点位的detections值 }, });
步骤2:在图层属性中计算平均值
Mapbox会自动为集群点位添加point_count属性(该集群包含的总点数),在实际使用heatmap-weight的位置做除法即可,此时计算是在聚类完全完成后执行,用到的都是完整的集群统计值,结果准确:
"heatmap-weight": [ "case", // 是集群点位的情况,用总检测值除以总点数得到平均值做插值 ["has", "point_count"], [ "interpolate", ["linear"], ["/", ["number", ["get", "clusterTotal"]], ["number", ["get", "point_count"]]], 0, 0, 6, 1, 18, 5 ], // 非集群的散点,直接用detections值做插值 ["interpolate", ["linear"], ["get", "detections"], 0, 0, 6, 1, 18, 5] ],
内容的提问来源于stack exchange,提问作者diZturbio
相关产品推荐
相关产品推荐

