mapbox gl setFilter按indexOf、contains或substring筛选

mapbox gl setFilter按indexOf、contains或substring筛选,mapbox,mapbox-gl-js,Mapbox,Mapbox Gl Js,我想使用setFilter表达式按子字符串筛选tileset中给定的特征属性。注意:我不想加载tileset外部的特性数组,我希望它只使用setFilter,而不是getFeatures函数,并且不使用循环。如果用户开始键入“smith..”,它将仅在功能键入时使用setFilter过滤掉这些功能 我只看到“==”或“match”,但不区分大小写的子字符串过滤也没有,比如索引of,包含,类似,比如['contains',feature.prop',smi']然后['contains',featu

我想使用setFilter表达式按子字符串筛选tileset中给定的特征属性。注意:我不想加载tileset外部的特性数组,我希望它只使用setFilter,而不是getFeatures函数,并且不使用循环。如果用户开始键入“
smith..
”,它将仅在功能键入时使用
setFilter
过滤掉这些功能

我只看到
“==”
“match”
,但不区分大小写的子字符串过滤也没有,比如
索引of
包含
类似
,比如
['contains',feature.prop',smi']
然后
['contains',feature.prop',smith']

我在mapbox示例中看到了示例,用于在键入时进行过滤,但我只想使用
setFilter
。它看起来不支持我想做的事情,但我想我还是会问的。必须从tileset填充任何本地特性数组是对客户端资源的浪费。它违背了一开始就将数据放在tileset中的目的


任何用于通过部分字符串解析要素属性的标准表达式,而不是完全匹配?

正如您所注意到的,Mapbox GL表达式不支持子字符串或正则表达式。因此,我认为唯一的解决办法是按照您提到的思路:获取属性值列表并将其用作自动完成

有两种方法可以获得属性值列表,而不需要进行单独的、可以说是冗余的查询

  • 使用TileJSON中的值。根据TileJSON的生成方式,它通常包含每个属性最常用值的列表(我认为最多1000个左右)
  • 使用
    querySourceFeatures()
    获取当前视口中的所有要素,然后向下过滤以查找您关心的属性值。如果用户想要过滤当前在视口之外的内容,这将没有帮助

  • 正如您所注意到的,Mapbox GL表达式不支持子字符串或正则表达式。因此,我认为唯一的解决办法是按照您提到的思路:获取属性值列表并将其用作自动完成

    有两种方法可以获得属性值列表,而不需要进行单独的、可以说是冗余的查询

  • 使用TileJSON中的值。根据TileJSON的生成方式,它通常包含每个属性最常用值的列表(我认为最多1000个左右)
  • 使用
    querySourceFeatures()
    获取当前视口中的所有要素,然后向下过滤以查找您关心的属性值。如果用户想要过滤当前在视口之外的内容,这将没有帮助