You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mapbox GL集群图层过滤后获取点数量计算圆半径问题

Mapbox GL集群过滤后按要素数量设置半径的解决方法

核心问题

图层的filter是在渲染阶段筛选要素,不会修改数据源层面集群的point_count统计值——这个值是集群所有原始要素的总数,不是过滤后的数量,所以直接调用["get","point_count"]自然得不到你要的结果。

正确实现步骤

1. 在数据源层面统计符合条件的要素数

修改数据源配置,通过clusterProperties自定义一个统计字段,累加符合属性条件的要素数量:

const clusterSource = {
  type: 'geojson',
  data: yourGeoJSONData,
  cluster: true,
  clusterRadius: 50, // 按需调整集群半径
  clusterProperties: {
    // 统计property等于value的要素数量
    filtered_count: [
      '+',
      ['case', ['==', ['get', 'property'], 'value'], 1, 0],
      ['accumulated', 'filtered_count']
    ]
  }
};

2. 图层中使用自定义统计字段计算半径

不需要在图层加filter,而是通过表达式控制显示和半径:

const clusterLayer = {
  id: 'clusters',
  type: 'circle',
  source: 'your-source-id',
  filter: ['has', 'point_count'], // 仅渲染集群要素
  paint: {
    circle-color: '#51bbd6',
    // 用自定义的filtered_count计算半径
    circle-radius: ['*', ['get', 'filtered_count'], 10],
    // 可选:隐藏没有符合条件要素的集群
    circle-opacity: ['case', ['>', ['get', 'filtered_count'], 0], 1, 0]
  }
};

3. 单独处理非集群的单个要素

如果需要显示符合条件的单个点,单独创建图层:

const singlePointLayer = {
  id: 'single-points',
  type: 'circle',
  source: 'your-source-id',
  filter: ['all', ['!has', 'point_count'], ['==', 'property', 'value']],
  paint: {
    circle-color: '#ff4444',
    circle-radius: 6
  }
};

注意事项

之前用clusterProperties没生效,大概率是没做条件累加——必须在clusterProperties里用case判断属性是否匹配,再通过accumulated累加统计值,这样集群才会存储你需要的过滤后数量。

内容的提问来源于stack exchange,提问作者shahrooz bazrafshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:17:24