基于数组的 Mapbox 过滤器

Mapbox filters based on array

我有以下数组:

test = ['a', 'b', 'c']

如果数组中存在地图上的对象,我想过滤它们。 是否可以将此过滤器与数组一起使用:

mapObj.setFilter("hover", ['all', ["in", "letter", test[0]]]);

或者,过滤数组中存在的对象的最佳方法是什么?

嗯,mapbox 的setFilter 函数不接受数组作为参数。您将需要使用适合他们 API 的格式,这基本上在此处“设置成员资格过滤器”下进行了描述。

https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter

要过滤多个变量,Set Membership Filters 需要特定格式,即

["in", key, v0, ..., vn]

其中 v0 到 vn 是您的数组中产生的元素

["in", "letter", "a", "b", "c"]

可以编写一个函数将数组转换为这种格式。可能是这样的:

function buildFilter(arr) {
  var filter = ['in', 'letter'];

  if (arr.length === 0) {
     return filter;
  }
  
  for(var i = 0; i < arr.length; i += 1) {
    filter.push(arr[i]);
  }
  
  return filter;
}

var filterBy = ['a', 'b', 'c'];
var myFilter = buildFilter(filterBy);

console.log(myFilter);

// then you would use it like this:
// mapObj.setFilter("hover", buildFilter(['a', 'b', 'c']));

实际上有一种本机方法可以做到这一点,如 "Filter features within mapview" example 所示。

您必须使用元素的唯一属性(最好是唯一 ID)。在您的情况下,假定属性为 "letter",代码将如下所示:

mapObj.setFilter('hover', ['match', ['get', 'letter'], test, true, false])

为了更好地理解代码,请查看 documentation about the match expression

您还可以使用:

['in', 'letter'].concat(test);

其中 test 是您的值数组。

["in", "letter", ...test] ES6

应该可以。

我像 this 一样将它与 .map 一起使用。我认为你应该避免使用额外的连接方法。

         this.$store.map.setFilter(layerName, [
          'match',
          ['get', filterPropertyName],
          currentValues.map((feature) => {
            return feature;
          }),
          true,
          false
        ])