按字符串化 JSON 数组 属性 中包含的值过滤图层

Filter a Layer By a Value Contained in a Stringified JSON Array Property

我们的一个 Mapbox tilesets 中的一个表有一个字符串化的 JSON array 属性 of ids:

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

我想使用此 属性 过滤特征,但似乎无法在 Predicates and Expressions documentation 中找到实现它的方法。因此,例如,我想过滤功能,以便仅显示 "string_id" 或 "a" 的功能。

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

更新

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

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

iOS 地图 SDK 不支持 INCONTAINSLIKE 字符串,among other operators. Under the hood, the SDK translates NSExpressions and NSPredicates to the expression syntax described in the Mapbox Style Specification.

如您所述,样式规范缺少用于 searching for substrings. It also lacks an operator for splitting a string 或将字符串转换为 JSON 对象的运算符(目前还没有问题,但您可以随意打开一个)。

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

您可能 运行 遇到的另一个限制是特征查询结果 can’t have feature properties set to nested objects and arrays

自 Mapbox iOS SDK v5.8.0-alpha.1 起,现在支持此功能。

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