你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

iOS SDK 中的数据驱动样式表达式(预览)

注意

Azure Maps iOS SDK 停用

适用于 iOS 的 Azure Maps 本机 SDK 现已弃用,将于 2025 年 3 月 31 日停用。 为了避免服务中断,请在 2025 年 3 月 31 日之前迁移到 Azure Maps Web SDK。 有关详细信息,请参阅 Azure Maps iOS SDK 迁移指南

层使用谓词和表达式来确定要显示的内容以及如何设置其格式。 谓词由相同的 NSPredicate 类表示,该类筛选 Core Data 中的结果或 Objective-C 的 NSArray 中的项。 谓词基于表达式,由 NSExpression 类表示。

本文档讨论此 SDK 支持的谓词和表达式语法的特定子集。 有关谓词和表达式的更多常规介绍,请参阅 Apple 开发人员文档中的谓词编程指南

使用谓词筛选向量数据

大多数层类显示可基于特征属性显示或隐藏的 Feature 对象。 使用 filter 选项仅包含源层中满足你定义的条件的特征。

运算符

支持下列比较运算符:

NSPredicateOperatorType 格式字符串语法
NSEqualToPredicateOperatorType key = value
key == value
NSGreaterThanOrEqualToPredicateOperatorType key >= value
key => value
NSLessThanOrEqualToPredicateOperatorType key <= value
key =< value
NSGreaterThanPredicateOperatorType key > value
NSLessThanPredicateOperatorType key < value
NSNotEqualToPredicateOperatorType key != value
key <> value
NSBetweenPredicateOperatorType key BETWEEN { 32, 212 }

若要测试某一特征是否具有特定属性,请将该属性与 NULLNIL 进行比较。 还支持使用 NSPredicate(value:) 初始化表达式创建的谓词。 不支持字符串运算符和自定义运算符。

支持下列复合运算符:

NSCompoundPredicateType 格式字符串语法
NSAndPredicateType predicate1 AND predicate2
predicate1 && predicate2
NSOrPredicateType predicate1 OR predicate2
predicate1 \|\| predicate2
NSNotPredicateType NOT predicate
!predicate

支持下列聚合运算符:

NSPredicateOperatorType 格式字符串语法
NSInPredicateOperatorType key IN { 'iOS', 'macOS', 'tvOS', 'watchOS' }
NSContainsPredicateOperatorType { 'iOS', 'macOS', 'tvOS', 'watchOS' } CONTAINS key

你可以使用 INCONTAINS 运算符来测试值是否出现在集合中、字符串是否为较大字符串的子字符串,或者计算的特征 (SELF) 是否在给定 Feature 中。

支持以下比较运算符和修饰符组合:

NSComparisonPredicateModifier NSPredicateOperatorType 格式字符串语法
NSAllPredicateModifier NSNotEqualToPredicateOperatorType ALL haystack != needle
NSAnyPredicateModifier NSEqualToPredicateOperatorType ANY haystack = needle
SOME haystack = needle

对于谓词中使用的比较和聚合运算符,支持以下比较谓词选项:

NSComparisonPredicateOptions 格式字符串语法
NSCaseInsensitivePredicateOption 'QUEBEC' =[c] 'Quebec'
NSDiacriticInsensitivePredicateOption 'Québec' =[d] 'Quebec'

不支持其他比较谓词选项,即 l(区分区域设置)和 n(规范化)。 只要比较不区分大小写或音调符号,它就是区分区域设置的。 比较谓词选项不支持比较修饰符(如 ALLANY)。

操作数

谓词中的操作数可以是变量项路径表达式中可以显示的几乎任何内容。

不执行自动类型强制转换。 因此,如果某个特征的属性值与谓词中指定的值的类型相同,则该特征仅匹配该谓词。 使用 CAST() 运算符将项路径或变量转换为匹配的类型:

  • 若要将值强制转换为数字,请使用 CAST(key, 'NSNumber')
  • 若要将值强制转换为字符串,请使用 CAST(key, 'NSString')
  • 若要将值强制转换为颜色,请使用 CAST(key, 'UIColor')
  • 若要将 UIColor 对象强制转换为数组,请使用 CAST(noindex(color), 'NSArray')

有关谓词格式字符串语法的详细信息,请参见 Apple 开发人员文档中谓词编程指南的“谓词格式字符串语法”一章。

操作数示例

默认情况下,气泡层和符号层将呈现数据源中所有几何图形的坐标。 此行为可以突出显示多边形或线条的顶点。 可以在谓词中使用 NSExpression.geometryTypeAZMVariable,通过层的 filter 选项来限制该层呈现的特征的几何类型。 以下示例限制气泡层,以便仅呈现 Point 特征。

let layer = BubbleLayer(source: source, options: [
    .filter(
        from: NSPredicate(format: "%@ == \"Point\"", NSExpression.geometryTypeAZMVariable)
    )
])

以下示例允许呈现 PointPolygon 特征。

let layer = BubbleLayer(source: source, options: [
    .filter(
        from: NSCompoundPredicate(orPredicateWithSubpredicates: [
            NSPredicate(format: "%@ == \"Point\"", NSExpression.geometryTypeAZMVariable),
            NSPredicate(format: "%@ == \"Polygon\"", NSExpression.geometryTypeAZMVariable)
        ])
    )
])

使用表达式配置层选项

表达式可以包含各种类型的子表达式。 下面讨论了每种受支持的表达式类型。

本文档部分中的一些示例使用以下特征来演示这些表达式的不同用法。

{
    "type": "Feature",
    "geometry": {
        "type": "Point",
        "coordinates": [-122.13284, 47.63699]
    },
    "properties": {
        "id": 123,
        "entityType": "restaurant",
        "revenue": 12345,
        "subTitle": "Building 40", 
        "temperature": 64,
        "title": "Cafeteria", 
        "zoneColor": "purple",
        "abcArray": ["a", "b", "c"],
        "array2d": [["a", "b"], ["x", "y"]],
        "_style": {
            "fillColor": "red"
        }
    }
}

以下代码演示如何在应用中手动创建此 GeoJSON 特征。

// Create a point feature.
let feature = Feature(Point(CLLocationCoordinate2D(latitude: 45, longitude: -100)))

// Add properties to the feature.
feature.addProperty("id", value:  123)
feature.addProperty("entityType", value: "restaurant")
feature.addProperty("revenue", value:  12345)
feature.addProperty("subTitle", value: "Building 40")
feature.addProperty("temperature", value:  64)
feature.addProperty("title", value: "Cafeteria")
feature.addProperty("zoneColor", value: "purple")
feature.addProperty("abcArray", value: ["a", "b", "c"])
feature.addProperty("array2d", value: [["a", "b"], ["x", "y"]])
feature.addProperty("_style", value: ["fillColor": "red"])

以下代码演示如何在应用中将 JSON 对象的字符串化版本反序列化为 GeoJSON 特征。

let featureString = "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-122.13284,47.63699]},\"properties\":{\"id\":123,\"entityType\":\"restaurant\",\"revenue\":12345,\"subTitle\":\"Building 40\",\"temperature\":64,\"title\":\"Cafeteria\",\"zoneColor\":\"purple\",\"abcArray\":[\"a\",\"b\",\"c\"],\"array2d\":[[\"a\",\"b\"],[\"x\",\"y\"]],\"_style\":{\"fillColor\":\"red\"}}}"

let feature = Feature.fromJson(featureString)

基于 JSON

Azure Maps Web SDK 还支持使用 JSON 数组表示的数据驱动样式表达式。 可以在 iOS SDK 中使用本机 NSExpression 类重新创建这些表达式。 或者,可以在 ios 应用上共享这些基于 JSON 的表达式(例如附加到响应),并传入 NSExpression(azmJSONObject:) 方法。 例如,我们采用以下 JSON 表达式。

var exp = ['get','title'];

以上表达式的 swift 版本为 ["get", "title"],可按如下所示读入到 iOS SDK 中。

let jsonResponse = ["get", "title"]
let exp = NSExpression(azmJSONObject: jsonResponse)

通过这种方法可以轻松在使用 Azure Maps 的移动应用与 Web 应用之间重用样式表达式。

此视频提供了 Azure Maps 中数据驱动样式的概述。

物联网显示 - Azure Maps 中的数据驱动样式

常量值

常数值可以是以下任意类型:

  • UIColor
  • String
  • NSNumber.boolValue
  • NSNumber.doubleValue
  • [Float]
  • [String]
  • NSValue.cgVectorValue
  • NSValue.uiEdgeInsetsValue

常量值示例

NSExpression(forConstantValue: UIColor.red)
NSExpression(forConstantValue: "constant")
NSExpression(forConstantValue: true)
NSExpression(forConstantValue: 20)
NSExpression(forConstantValue: [20, 21, 22])
NSExpression(forConstantValue: ["constant1", "constant2"])
NSExpression(forConstantValue: NSValue(cgVector: CGVector(dx: 2, dy: -4)))
NSExpression(forConstantValue: NSValue(uiEdgeInsets: UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)))

项路径

项路径表达式引用要进行计算以显示的 Feature 对象的属性。 例如,如果多边形的 Feature.properties 字典包含 floorCount 项,则项路径 floorCount 会在计算该特定多边形时引用 floorCount 属性的值。

某些字符不能直接用作格式字符串中项路径的一部分。 例如,如果特征的属性名为 ISO 3166-1:2006,则 lowercase(ISO 3166-1:2006) 表达式格式字符串或 ISO 3166-1:2006 == 'US-OH' 谓词格式字符串将引发异常。 请改为使用 %K 占位符或 NSExpression(forKeyPath:) 初始化表达式:

NSPredicate(format: "%K == 'US-OH'", "ISO 3166-1:2006")
NSExpression(
   forFunction: "lowercase:",
   arguments: [NSExpression(forKeyPath: "ISO 3166-1:2006")]
)

函数

NSExpression(forFunction:arguments:) 方法预定义的函数中,层选项支持以下子集:

初始化表达式参数 格式字符串语法
average: average({1, 2, 2, 3, 4, 7, 9})
sum: sum({1, 2, 2, 3, 4, 7, 9})
count: count({1, 2, 2, 3, 4, 7, 9})
min: min({1, 2, 2, 3, 4, 7, 9})
max: max({1, 2, 2, 3, 4, 7, 9})
add:to: 1 + 2
from:subtract: 2 - 1
multiply:by: 1 * 2
divide:by: 1 / 2
modulus:by: modulus:by:(1, 2)
sqrt: sqrt(2)
log: log(10)
ln: ln(2)
raise:toPower: 2 ** 2
exp: exp(0)
ceiling: ceiling(0.99999)
abs: abs(-1)
trunc: trunc(6378.1370)
floor: floor(-0.99999)
uppercase: uppercase('Elysian Fields')
lowercase: lowercase('DOWNTOWN')
noindex: noindex(0 + 2 + c)
length: length('Wapakoneta')
castObject:toType: CAST(ele, 'NSString')
CAST(ele, 'NSNumber')

不支持以下预定义函数:

初始化表达式参数 格式字符串语法
median: median({1, 2, 2, 3, 4, 7, 9})
mode: mode({1, 2, 2, 3, 4, 7, 9})
stddev: stddev({1, 2, 2, 3, 4, 7, 9})
random random()
randomn: randomn(10)
now now()
bitwiseAnd:with: bitwiseAnd:with:(5, 3)
bitwiseOr:with: bitwiseOr:with:(5, 3)
bitwiseXor:with: bitwiseXor:with:(5, 3)
leftshift:by: leftshift:by:(23, 1)
rightshift:by: rightshift:by:(23, 1)
onesComplement: onesComplement(255)
distanceToLocation:fromLocation: distanceToLocation:fromLocation:(there, here)

条件语句

通过内置 NSExpression(forAZMConditional:trueExpression:falseExpression:) 方法和 TERNARY() 运算符支持条件。 如果需要表达多个事例(“else-if”),可以在条件中嵌套条件,或使用 match 表达式

条件示例

以下示例逐步评估不同的谓词,直到找到计算结果为 true 的谓词,然后返回其 true 表达式。 如果没有任何谓词计算结果为 true,则返回最后一个 false 表达式。

let layer = BubbleLayer(
    source: source,
    options: [
        .bubbleColor(
            from: NSExpression(
                // Check to see whether a feature has a zoneColor property
                forAZMConditional: NSPredicate(format: "zoneColor != NIL"),
                // If it has a zoneColor property, use its value as a color.
                trueExpression: NSExpression(forKeyPath: "zoneColor"),
                // if not, do another check
                falseExpression: NSExpression(
                    // Check to see whether it has a temperature property with a value greater than or equal to 100.
                    forConditional: NSPredicate(format: "temperature != nil && temperature >= 100"),
                    // If it has, use red color.
                    trueExpression: NSExpression(forConstantValue: UIColor.red),
                    // If not, use green color.
                    falseExpression: NSExpression(forConstantValue: UIColor.green)
                )
            )
        )
    ]
)

聚合

aggregate 表达式可以包含表达式数组。 在某些情况下,可以使用数组本身,而不是在 aggregate 表达式中包装数组。

变量

iOS SDK 定义了以下用于层选项的变量。

特征标识符

特征 ID。 此变量与 NSExpression.featureIdentifierAZMVariable 属性相对应。

格式字符串语法:$featureIdentifier

功能属性

特征的属性对象。 此变量与 NSExpression.featurePropertiesAZMVariable 属性相对应。

格式字符串语法:$featureAttributes

累积的特征

到目前为止累积的群集属性值。 这只能在聚集的 DataSource 源的 clusterProperties 选项中使用。 此变量与 NSExpression.featureAccumulatedAZMVariable 属性相对应。

格式字符串语法:$featureAccumulated

几何类型

特征表示的几何图形类型。 特征类型是以下某个字符串:

  • Point 用于点特征,对应 Point 类。
  • MultiPoint 用于点集合特征,对应 PointCollection 类。
  • LineString 用于折线特征,对应 Polyline 类。
  • MultiLineString 用于多折线特征,对应 MultiPolyline 类。
  • Polygon 用于多边形特征,对应 Polygon 类。
  • MultiPolygon 用于多个多边形特征,对应 MultiPolygon 类。
  • GeometryCollection 用于几何图形集合特征,对应 GeometryCollection 类。

此变量与 NSExpression.geometryTypeAZMVariable 属性相对应。

格式字符串语法:$geometryType

变量示例

请参阅操作数示例

缩放

当前缩放级别。 在层的样式选项中,此变量只能作为顶级 interpolation 或 step 表达式的目标出现。 此变量与 NSExpression.zoomLevelAZMVariable 属性相对应。

格式字符串语法:$zoomLevel

缩放示例

默认情况下,热度地图层中呈现的数据点半径对所有缩放级别采用固定点半径。 缩放地图时,数据将会聚合,热度地图层将呈现不同的外观。 可以使用 zoom 表达式缩放每个缩放级别的半径,使每个数据点涵盖相同的地图物理区域。 这使热度地图层看上去更加静态且一致。 地图的每个缩放级别的垂直和水平点是前一个缩放级别的两倍。 调整半径使其在每个缩放级别中翻倍,这会创建一个在所有缩放级别下均保持一致外观的热度地图。 若要实现此目的,可将 zoom 表达式与 base 2 exponential interpolation 表达式配合使用,并为最小缩放级别设置点半径,为最大缩放级别设置标度半径(计算方式为 pow(2, maxZoom - minZoom) * radius,如下所示)。

let layer = HeatMapLayer(
   source: source,
   options: [
      .heatmapRadius(
         from: NSExpression(
            forAZMInterpolating: .zoomLevelAZMVariable,
            curveType: .exponential,
            parameters: NSExpression(forConstantValue: 2),
            stops: NSExpression(forConstantValue: [
               // For zoom level 1 set the radius to 2 points.
               1: 2,

               // Between zoom level 1 and 19, exponentially scale the radius from 2 points to 2 * 2^(maxZoom - minZoom) points.
               19: pow(2, 19 - 1) * 2
            ])
         )
      )
   ]
)

热度地图密度

热度地图层中屏幕点的内核密度估算;换句话说,它是一种衡量特定像素周围有多少数据点的相对方法。 此变量的计算结果为介于 0 到 1 之间的数字。 将此表达式与 interpolationstep 表达式相结合可以定义颜色梯度,用于在热度地图中赋色。 只能在热度地图层的 heatmapColor 选项中使用。 此变量与 NSExpression.heatmapDensityAZMVariable 属性相对应。

格式字符串语法:$heatmapDensity

提示

内插表达式中索引 0 处的颜色或递阶色的默认颜色定义没有数据的区域的颜色。 索引 0 处的颜色可用于定义背景色。 很多用户喜欢将此值设置为透明或半透明黑色。

热度地图密度示例

此示例使用线性内插表达式创建平滑颜色梯度来呈现热度地图。

let layer = HeatMapLayer(
   source: source,
   options: [
      .heatmapColor(
         from: NSExpression(
            forAZMInterpolating: .heatmapDensityAZMVariable,
            curveType: .linear,
            parameters: nil,
            stops: NSExpression(forConstantValue: [
               0: UIColor.magenta.withAlphaComponent(0),
               0.01: UIColor.magenta,
               0.5: UIColor(red: 251 / 255, green: 0, blue: 251 / 255, alpha: 1),
               1: UIColor(red: 0, green: 195 / 255, blue: 1, alpha: 1)
            ])
         )
      )
   ]
)

除了使用平滑梯度为热度地图赋色外,还可以使用 step 表达式在一组范围内指定颜色。 使用 step 表达式为热度地图赋色,可以直观地将密度分解为类似于等高线或雷达式地图的范围。

let layer = HeatMapLayer(
   source: source,
   options: [
      .heatmapColor(
         from: NSExpression(
            forAZMStepping: .heatmapDensityAZMVariable,
            from: NSExpression(forConstantValue: UIColor.clear),
            stops: NSExpression(forConstantValue: [
               0.01: UIColor(red: 0, green: 0, blue: 128 / 255, alpha: 1),
               0.25: UIColor.cyan,
               0.5: UIColor.green,
               0.75: UIColor.yellow,
               1: UIColor.red
            ])
         )
      )
   ]
)

有关详细信息,请参阅添加热度地图层文章。

线条进度

一个数字,表示沿直线上某一给定点的相对距离。 此变量在线条开头的计算值为 0,在线条末尾为 1。 只能结合线条层的 LineLayerOption.strokeGradient 选项使用它。 它与 NSExpression.lineProgressAZMVariable 属性相对应。

格式字符串语法:$lineProgress

注意

线条层的 strokeGradient 选项要求将数据源的 lineMetrics 选项设置为 true

线条进度示例

此示例使用 NSExpression.lineProgressAZMVariable 表达式对线条笔划应用颜色梯度。

let layer = LineLayer(
   source: source,
   options: [
      .strokeGradient(
         from: NSExpression(
            forAZMInterpolating: NSExpression.lineProgressAZMVariable,
            curveType: .linear,
            parameters: nil,
            stops: NSExpression(forConstantValue: [
               0: UIColor.blue,
               0.1: UIColor(red: 0.25, green: 0.41, blue: 1, alpha: 1), // Royal Blue
               0.3: UIColor.cyan,
               0.5: UIColor(red: 0, green: 1, blue: 0, alpha: 1), // Lime
               0.7: UIColor.yellow,
               1: UIColor.red
            ])
         )
      )
   ]
)

查看实时示例

特定于 AzureMaps 的方法

以下部分说明扩展 NSExpression 类的 AzureMaps 特定方法

match 表达式

match 表达式是一种提供类似 switch 语句逻辑的条件表达式。 输入可以是返回字符串或数字的任意表达式,例如 NSExpression(forKeyPath: "entityType")。 匹配的表达式是一个字典,它应该具有作为表达式的键,这些键的计算结果要么是单个字符串或数字,要么是所有字符串的数组,要么是作为任何表达式的所有数字和值。 如果输入表达式类型与键类型不匹配,则结果将是默认的回退值。

match 表达式示例

以下示例查找气泡层中某个 Point 特征的 entityType 属性并搜索匹配项。 如果找到匹配项,则返回该指定值,否则返回回退值。

let layer = BubbleLayer(
    source: source,
    options: [
        .bubbleColor(
            from: NSExpression(
                // Get the input value to match.
                forAZMMatchingKey: NSExpression(forKeyPath: "entityType"),
                // List the keys to match and the value to return for each match.
                in: [
                    // If value is "restaurant" return red color.
                    NSExpression(forConstantValue: "restaurant"): NSExpression(forConstantValue: UIColor.red),
                    // If value is "park" return green color.
                    NSExpression(forConstantValue: "park"): NSExpression(forConstantValue: UIColor.green)
                ],
                // Specify a default value to return if no match is found.
                default: NSExpression(forConstantValue: UIColor.black)
            )
        )
    ]
)

下面的示例使用一个表达式,其计算结果为字符串数组,用于指定应返回相同值的一组标签。 此方法比单独列出每个标签要高效得多。 在本例中,如果 entityType 属性为 "restaurant""grocery_store",则返回颜色“red”。

let layer = BubbleLayer(
    source: source,
    options: [
        .bubbleColor(
            from: NSExpression(
                // Get the input value to match.
                forAZMMatchingKey: NSExpression(forKeyPath: "entityType"),
                // List the keys to match and the value to return for each match.
                in: [
                    // If value is "restaurant" or "grocery_store" return red color.
                    NSExpression(forConstantValue: ["restaurant", "grocery_store"]): NSExpression(forConstantValue: UIColor.red),
                    // If value is "park" return green color.
                    NSExpression(forConstantValue: "park"): NSExpression(forConstantValue: UIColor.green)
                ],
                // Specify a default value to return if no match is found.
                default: NSExpression(forConstantValue: UIColor.black)
            )
        )
    ]
)

coalesce 表达式

coalesce 表达式逐步评估一组表达式,直到获取第一个非 null 值,然后返回该值。

coalesce 表达式示例

以下示例使用 coalesce 表达式设置符号层的 textField 选项。 如果 title 属性在特征中缺失或设置为 nil,则该表达式将查找 subTitle 属性;如果该属性缺失或为 nil,则返回空字符串。

let layer = SymbolLayer(
    source: source,
    options: [
        .textField(
            from: NSExpression(forAZMFunctionCoalesce: [
                // Try getting the title property.
                NSExpression(forKeyPath: "title"),

                // If there is no title, try getting the subTitle.
                NSExpression(forKeyPath: "subTitle"),

                // Default to an empty string.
                NSExpression(forConstantValue: "")
            ])
        )
    ]
)

Join 表达式

将多个字符串联接在一起。 每个值都必须是字符串或数字。

Join 表达式示例

下面的示例联接点特征的 temperature 属性和 "°F"

let layer = SymbolLayer(
    source: source,
    options: [
        .textField(
            from: NSExpression(forAZMFunctionJoin: [
                NSExpression(forKeyPath: "temperature"),
                NSExpression(forConstantValue: "°F")
            ])
        ),

        // Some additional style options.
        .textOffset(CGVector(dx: 0, dy: -1.5)),
        .textSize(12),
        .textColor(.white)
    ]
)

以上表达式在地图上呈现一个图钉,该图钉上叠加了文本 "64°F",如下图所示。

Join 表达式示例

interpolate 和 step 表达式

interpolation 和 step 表达式可用于计算内插曲线或 step 函数中的值。 这些表达式采用一个返回数值作为输入的表达式(例如 NSExpression(forKeyPath: "temperature"))。 将根据输入和输出值对评估输入值,以确定最拟合内插曲线或 step 函数的值。 输出值称为“stop”。 每个 stop 的输入值必须是数字并按升序排列。 输出值必须是数字、数字数组或颜色。

interpolation 表达式

使用 interpolation 表达式可以通过在 stop 值之间进行内插来计算连续的平滑值集。

可在 interpolation 表达式中使用三种类型的内插方法:

名称 说明 parameters
ExpressionInterpolationMode.linear 在 stop 对之间线性内插。 nil
ExpressionInterpolationMode.exponential 在 stop 之间指数内插。 将指定一个底数,用于控制输出的递增速度。 值越大,输出就会以越快的速度朝范围的上限递增。 接近 1 的底数值会生成以更线性方式递增的输出。 计算结果为数值的表达式,指定指数内插的基数。
ExpressionInterpolationMode.cubicBezier 使用按给定控制点定义的三次方贝塞尔曲线进行内插。 一个包含四个表达式的数组或 aggregate 表达式,每个表达式的计算结果均为数值。 这四个数值是三次方贝塞尔曲线的控制点。

以下示例演示了这些不同类型的内插的大致形式。

线性 指数 三次方贝塞尔
线性内插图 指数内插图 三次方贝塞尔曲线内插图
内插表达式示例

以下示例使用 linear interpolation 表达式基于点特征的 temperature 属性设置气泡层的 bubbleColor 属性。 如果 temperature 值小于 60,则返回颜色“blue”。 如果该值大于等于 60 且小于 70,则返回“yellow”。 如果该值大于等于 70 且小于 80,则返回“orange”。 如果该值大于等于 80,则返回“red”。

let layer = BubbleLayer(
    source: source,
    options: [
        .bubbleColor(
            from: NSExpression(
                forAZMInterpolating: NSExpression(forKeyPath: "temperature"),
                curveType: .linear,
                parameters: nil,
                stops: NSExpression(forConstantValue: [
                    50: UIColor.blue,
                    60: UIColor.yellow,
                    70: UIColor.orange,
                    80: UIColor.red
                ])
            )
        )
    ]
)

下图演示了如何为以上表达式选择颜色。

Interpolate 表达式示例

step 表达式

可以使用 step 表达式通过评估按 stop 定义的分段常数函数来计算离散的阶跃结果值。

step 表达式返回紧靠在输入值前面的 stop 的输出值;如果输入小于第一个 stop,则返回 from 值。

Step 表达式示例

以下示例使用 step 表达式基于点特征的 temperature 属性设置气泡层的 bubbleColor 属性。 如果 temperature 值小于 60,则返回“blue”。 如果该值大于等于 60 且小于 70,则返回“yellow”。 如果该值大于等于 70 且小于 80,则返回“orange”。 如果该值大于等于 80,则返回“red”。

let layer = BubbleLayer(
    source: source,
    options: [
        .bubbleColor(
            from: NSExpression(
                forAZMStepping: NSExpression(forKeyPath: "temperature"),
                from: NSExpression(forConstantValue: UIColor.blue),
                stops: NSExpression(forConstantValue: [
                    50: UIColor.blue,
                    60: UIColor.yellow,
                    70: UIColor.orange,
                    80: UIColor.red
                ])
            )
        )
    ]
)

下图演示了如何为以上表达式选择颜色。

Step 表达式示例

其他信息

详细了解支持表达式的层: