2

我们现在可以在 gl-js 中对标记进行聚类:

https://www.mapbox.com/mapbox-gl-js/example/cluster/

在 mapbox-gl-js 中的聚类中是否有与标记过滤器等效的方法,如本示例中的传单:

https://www.mapbox.com/mapbox.js/example/v1.0.0/filtering-marker-clusters/

4

1 回答 1

2

我也遇到了这个问题,并相信应该有一种方法可以根据集合中特征的属性进一步过滤集群层。但是根据我的理解(我真诚地希望有一种我还没有想出的更好的方法),因为您在源上声明它是要被聚类的,所以没有办法区分聚类特征。我想出的一种解决方法是在过滤器更改时动态添加源和层。

例如:如果您按子类别 ID 进行过滤,您可以削减与该子类别 ID 匹配的原始 FeatureCollection,并使用该 FeatureCollection 创建一个新源,并将集群设置为 true,为标记添加图层,然后添加集群就像他们在示例中布置的那样。并且无论何时该过滤器发生变化,您都可以切换该标记层的可见性(尚未测试该部分),或者只是将其删除并添加新的,重复之前的步骤。这种方法的许多缺点是无法在整个数据集上使用常规过滤器(如果有的话),并且它的性能不如使用过滤器。

如果使用 mapbox 中的地震数据,代码可能如下所示:

var data = "https://www.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson";
var filterID = 1.87; // Arbitrary number
var paredData = _.filter(data.features, function(feature){
  if (feature["Primary ID"] === filterID) {
    return feature;
  }
})

// Remove all of the layers and source associated 
// with a previous filter if needed 
if (map.getSource("earthquake-filter") { 
  map.removeLayer("earthquake-filter");
  map.removeLayer("earthquake-filter-cluster");
  map.removeLayer("earthquake-filter-cluster-count");
  map.removeSource("earthquake-filter");
}

map.addSource("earthquake-filter", {
  type: "geojson",
  data: {
    type: "FeatureCollection",
    features: paredData
  },
  cluster: true,
  clusterMaxZoom: 14,
  clusterRadius: 50
});

并像他们在示例中所做的那样继续。

不是我最喜欢的解决方案,但它是迄今为止我发现的唯一一个有效的解决方案。希望这可以帮助。

于 2016-05-06T18:51:13.900 回答