如何在 NSExpression 中组合 Mapbox mgl_interpolate 和 MGL_Match?

How do I combine Mapbox mgl_interpolate and MGL_Match in an NSExpression?

我很难弄清楚如何使用 iOS 中的 Swift 将匹配应用于轮廓索引值以及不同的缩放级别,以根据索引值设置不同的线宽样式.从缩放级别 9 开始,索引值为 10 的行意味着 1.5,具有 5 的行意味着 1,所有其他的默认为 0.5。这是 JSON 等价物:

[
    "interpolate",
    ["linear"],
    ["zoom"],
    9,
    [
        "match",
        ["get", "index"],
        [10],
        1.5,
        [5],
        1,
        0.5
    ],
    16,
    [
        "match",
        ["get", "index"],
        [10],
        3,
        [5],
        2,
        1
    ]
]

我明白如果这只是一个问题,所有的线都是相同的宽度,我会怎么做:

layer.lineWidth = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", [9: 1, 16: 2])

有没有办法用另一个包含 MGL_MATCH 的 NSExpression 替换 1 和 2(分别在 9 和 16 之后),例如:

   let lineWidthStops = [
          NSExpression(format: "MGL_MATCH(index, 10, %@, 5, %@, %@)", 1.5, 1.0, 0.5),
          NSExpression(format: "MGL_MATCH(index, 10, %@, 5, %@, %@)", 3.0, 1.5, 1.0)
   ]
  
   contourLayer.lineWidth = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", [9: lineWidthStops[0], 16: lineWidthStops[1]])

是的,您可以在插值表达式中引用 NSExpressions 数组,但是,您需要将 MGL_MATCH 表达式中的字符串格式化程序 %@ 更改为浮点数说明符 %f 如以下代码所示:

        let lineWidthStops = [
                 NSExpression(format: "MGL_MATCH(index, 10, %f, 5, %f, %f)", 1.5, 1.0, 0.5),
                 NSExpression(format: "MGL_MATCH(index, 10, %f, 5, %f, %f)", 5.0, 1.5, 1.0)
          ]