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

问题描述

我很难弄清楚如何在 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,3,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.0,0.5),NSExpression(format: "MGL_MATCH(index,3.0,1.0)
   ]
  
   contourLayer.linewidth = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel,[9: linewidthStops[0],16: linewidthStops[1]])

解决方法

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

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

zoom 9

zoom 16

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...