3

我们的一个 Mapbox 瓦片集中的一张表有一个字符串化的 JSON 数组属性 ids:

"string_ids":"[\"a\",\"b\"]"

我想使用此属性过滤功能,但似乎无法在Predicates and Expressions 文档中找到方法。因此,例如,我想过滤功能,以便仅显示具有“a”的“string_id”的功能。

我相信这将有助于解决我的问题(https://github.com/mapbox/mapbox-gl-js/issues/4113),但只是想知道此时是否还有其他解决方案?

更新

我尝试了几种不同的方法:

  • NSPredicate(format: "'a' IN CAST(string_ids, 'NSArray<NSString>')")错误:“尚未实现将表达式转换为 NSArray。”
  • NSPredicate(format: "string_ids contains[c] %@", "a")不会出错,但没有特征匹配过滤器。
  • NSPredicate(format: "string_ids LIKE 'a'")错误:“NSPredicateOperatorType:7 不受支持。”
4

2 回答 2

1

NSExpression/NSPredicate 实现在支持哪些运算符方面有所不同。(如果您查看 Apple 的 NSPredicate 文档,就会发现某些 Core Data 后端也缺乏对某些运算符的支持。)

iOS 地图 SDK 不支持IN,CONTAINSLIKE用于字符串等运算符。在底层,SDK 将 NSExpressions 和 NSPredicates 转换为 Mapbox Style Specification 中描述的表达式语法

如您所述,样式规范缺少用于搜索 substrings的运算符。它还缺少用于拆分字符串或将字符串转换为 JSON 对象的运算符(还没有问题,但可以随意打开一个)。

一种解决方法可能是使用 查询源中的功能-[MGLVectorTileSource featuresInSourceLayersWithIdentifiers:predicate:],手动评估属性值是否应显示它们,并将修改后的功能添加到新的 MGLShapeSource。

您可能遇到的另一个限制是特征查询结果不能将特征属性设置为嵌套对象和数组

于 2019-09-10T02:08:25.180 回答
0

从 Mapbox iOS SDK 的v5.8.0-alpha.1开始,现在支持此功能。

所以,为了结束我原来的问题,这个谓词现在可以按需要工作:NSPredicate(format: "string_ids contains 'a'").

于 2020-03-18T17:11:22.553 回答