MapBox - 样式规范 - iOS - 数字格式

MapBox - Style Specifications - iOS - number-format

我们需要根据所选区域显示地图上的数字。我在 Mapbox 文档中找到了“数字格式”样式规范。由于我似乎找不到数字格式的自定义函数,因此方法是使用 MGL_FUNCTION 使用“数字格式”。所以我已经在这个问题上研究了一天多了。

这是我试过的一次

let locale: [String: Any] = ["locale": "en", "min-fraction-digits": 1, "max-fraction-digits": 1]
let jsonData = try? JSONSerialization.data(withJSONObject: locale, options: [])
let jsonString = String(data: jsonData!, encoding: .utf8)!

// 使用json 字符串

let formattedNumber = NSExpression(format: "MGL_FUNCTION('number-format', CAST(value, 'NSNumber'), %@)", jsonString)

// 使用字典

let formattedNumber = NSExpression(format: "MGL_FUNCTION('number-format', CAST(value, 'NSNumber'), %@)", locale)

// 使用样式规范 "object" json string

let object = NSExpression(mglJSONObject: ["object", jsonString])
let formattedNumber = NSExpression(format: "MGL_FUNCTION('number-format', CAST(value, 'NSNumber'), %@)", object)

// 使用样式规范“对象”字典

let object = NSExpression(mglJSONObject: ["object", locale])
let formattedNumber = NSExpression(format: "MGL_FUNCTION('number-format', CAST(value, 'NSNumber'), %@)", object)

全部returns'Invalid property value: [1][2]: Number-format options argument must be an object.'

希望任何人都能指出我做错了什么,以及要传递给“数字格式”样式规范的正确 syntax/object 格式。

谢谢!

number-format 支持已添加到跨平台样式解析代码 in 2019,这意味着此表达式运算符在与应用程序捆绑在一起的样式 JSON 文件中使用时可以工作,或者托管于 mapbox.com。但是,number-format 似乎并没有被添加到 iOS/macOS 地图 SDK 的 NSExpression 转换代码中。在 v10.0.0 之前 iOS/macOS 上的运行时样式 API 中,表达式始终通过 NSExpression 进行往返,即使您使用 +[NSExpression expressionWithMGLJSONObject:].

通常,当您在 NSExpression 格式字符串中使用 +[NSExpression expressionWithMGLJSONObject:]MGL_FUNCTION 时,无法识别的运算符应该可以工作。但是,NSExpression 转换代码将任何无法识别的 JSON 对象包装在 literal 表达式中,这对于 number-format 是无效的。需要有一个类似于 collator 表达式 when converting to NSExpression and when converting to JSON.

的特殊情况

一个更优雅的解决方案还包括支持将 NSNumberFormatter 嵌入到 NSExpression 中,但是在 NSNumberFormatter 选项和样式规范中 number-format 运算符接受的选项之间进行转换会更加复杂。

启用 MGL_FUNCTION(@"number-format", …) 的即时修复会非常小。您可以在将作为 v10 发布的 mapbox-gl-native-ios repository about it, though Mapbox’s priority these days is on the rewrite in mapbox-maps-ios 中打开一个问题。在 v10 中,对运行时样式 API 进行了大修,以更接近样式规范;它根本不使用 NSExpression。