次の方法で共有


iOS SDK のデータドリブン スタイル式 (プレビュー)

Note

Azure Maps iOS SDK の廃止

iOS 用 Azure Maps Native SDK は非推奨となり、2025 年 3 月 31 日に廃止されます。 サービスの中断を回避するには、2025 年 3 月 31 日までに Azure Maps Web SDK に移行します。 詳細については、「Azure Maps iOS SDK 移行ガイド」を参照してください。

レイヤーでは述語と式を使用して、表示する内容とその書式設定方法を決定します。 ''述語'' は、Objective-C の NSArray のコア データまたは項目の結果をフィルター処理するのと同じ NSPredicate クラスによって表されます。 述語は、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 }

フィーチャーに特定のプロパティがあるかどうかをテストするには、属性を NULL または NIL と比較します。 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

IN および CONTAINS 演算子を使用して、値がコレクション内に表示されるかどうか、文字列がより大きな文字列の部分文字列であるかどうか、または評価されたフィーチャー (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 開発者向けドキュメント「Predicate Programming Guide」の「Predicate Format String Syntax」の章をご覧ください。

オペランドの例

バブルとシンボルのレイヤーでは、既定でデータ ソース内のすべてのジオメトリの座標がレンダリングされます。 この動作により、多角形または線の頂点を強調表示できます。 レイヤーの filter オプションを使用すると、述語内で NSExpression.geometryTypeAZMVariable を使って、レンダリングされるフィーチャーのジオメトリの種類を制限できます。 次の例では、Point 機能のみがレンダリングされるようにバブル レイヤーを制限できます。

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

次の例では、Point 機能と Polygon 機能の両方をレンダリングできます。

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 クラスを使用して再作成できます。 または、これらの JSON ベースの式を ios アプリと共有 (たとえば、応答にアタッチ) し、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)
                )
            )
        )
    ]
)

集計

集計式には式の配列を含めることができます。 場合によっては、集計式で配列をラップする代わりに、配列自体を使用できます。

変数

iOS SDK では、レイヤー オプションで使用する次の変数を定義します。

フィーチャー識別子

フィーチャーの ID。 この変数は、NSExpression.featureIdentifierAZMVariable プロパティに対応します。

書式設定文字列の構文: $featureIdentifier

機能のプロパティ

フィーチャーのプロパティ オブジェクト。 この変数は、NSExpression.featurePropertiesAZMVariable プロパティに対応します。

書式設定文字列の構文: $featureAttributes

累積されたフィーチャー

これまでに累積されたクラスター プロパティの値。 これは、クラスター化された DataSource ソースの clusterProperties オプションでのみ使用できます。 この変数は、NSExpression.featureAccumulatedAZMVariable プロパティに対応します。

書式設定文字列の構文: $featureAccumulated

geometry 型

フィーチャーによって表されるジオメトリの種類。 フィーチャーの種類は次のいずれかの文字列です。

  • ポイント フィーチャーの場合は Point。これは Point クラスに対応します。
  • ポイント コレクション フィーチャーの場合は MultiPoint。これは PointCollection クラスに対応します。
  • ポリライン フィーチャーの場合は LineString。これは Polyline クラスに対応します。
  • 複数のポリライン フィーチャーの場合は MultiLineString。これは MultiPolyline クラスに対応します。
  • 多角形フィーチャーの場合は Polygon。これは Polygon クラスに対応します。
  • 複数の多角形フィーチャーの場合は MultiPolygon。これは MultiPolygon クラスに対応します。
  • ジオメトリ コレクション フィーチャーの場合は GeometryCollection。これは GeometryCollection クラスに対応します。

この変数は NSExpression.geometryTypeAZMVariable プロパティに対応します。

書式設定文字列の構文: $geometryType

変数の例

オペランドの例」を参照してください。

ズーム

現在のズーム レベル。 レイヤーのスタイル オプションでは、この変数は、トップ レベルの interpolation または step 式のターゲットとしてのみ表示される場合があります。 この変数は NSExpression.zoomLevelAZMVariable プロパティに対応します。

書式設定文字列の構文: $zoomLevel

ズームの例

既定では、ヒート マップ レイヤーにレンダリングされるデータ ポイントの半径には、すべてのズーム レベルの固定ポイント半径が含まれます。 マップがズームされると、データがまとめて集計され、ヒート マップ レイヤーの外観が変化します。 zoom 式を使用すると、各データ ポイントによってマップの同じ物理領域がカバーされるように、各ズーム レベルの半径をスケーリングできます。 これにより、ヒート マップ レイヤーの外観は、より静的で一貫性の高いものになります。 マップの各ズーム レベルは、垂直方向および水平方向のポイント数が前のズーム レベルの 2 倍になっています。 ズーム レベルごとに半径が 2 倍になるようにスケーリングすると、すべてのズーム レベルで外観に一貫性のあるヒート マップが作成されます。 これを実現するには、次のように、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 の数値に評価されます。 これは interpolation 式または step 式と組み合わせて使用して、ヒート マップの色分けに使用される色のグラデーションが定義されます。 ヒート マップ レイヤーの 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

Note

線レイヤーの 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 式の例

interpolation および step 式

interpolation および step 式は、補間曲線またはステップ関数に沿って値を計算するために使用できます。 これらの式では、入力として数値を返す式 (NSExpression(forKeyPath: "temperature") など) を受け取ります。 入力値は、入力値と出力値のペアに対して評価され、補間曲線またはステップ関数に最適な値が判断されます。 出力値は "分岐点" と呼ばれます。 各分岐点の入力値は数値で、昇順である必要があります。 出力値は、数値、数値の配列、または色である必要があります。

interpolation 式

interpolation 式は、分岐点値間を補間することで、継続的で滑らかな値のセットを計算するために使用できます。

interpolation 式で使用できる補間メソッドには、次の 3 種類があります。

名前 説明 パラメーター
ExpressionInterpolationMode.linear 分岐点のペア間を直線的に補間します。 nil
ExpressionInterpolationMode.exponential 分岐点間を指数関数的に補間します。 基数が指定されており、出力の増加率を制御します。 この値が大きくなるほど、出力は範囲の上限値に偏るように増加します。 基数の値が 1 に近づくと、より直線的に増加する出力が生成されます。 指数補間の基数を指定する、数値に評価される式。
ExpressionInterpolationMode.cubicBezier 指定された制御点により定義された 3 次ベジエ曲線を使用して補間します。 4 つの式を含む配列または集計式。各式は数値に評価されます。 4 つの数値は、3 次ベジエ曲線の制御点です。

これらの異なる種類の補間の外観の例を次に示します。

Linear 指数 3 次ベジエ
線形補間グラフ 指数補間グラフ 3 次ベジエ補間グラフ
補間の式の例

次の例では線状補間式を使用して、ポイント フィーチャーの 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
                ])
            )
        )
    ]
)

次の図では、上記の式に対して色を選択する方法を示します。

補間式の例

ステップ式

step 式を使用すると、分岐点により定義された区分定数関数を評価することで、非連続的な階段状の結果値を計算できます。

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
                ])
            )
        )
    ]
)

次の図では、上記の式に対して色を選択する方法を示します。

ステップ式の例

関連情報

式をサポートする次のレイヤーの詳細を参照してください。