Bagikan melalui


Ekspresi gaya berbasis data di SDK iOS (Pratinjau)

Catatan

Penghentian Azure Peta iOS SDK

Azure Peta Native SDK untuk iOS sekarang tidak digunakan lagi dan akan dihentikan pada 31/3/3/25. Untuk menghindari gangguan layanan, migrasikan ke Azure Peta Web SDK dengan 3/31/25. Untuk informasi selengkapnya, lihat Panduan migrasi Azure Peta iOS SDK.

Lapisan menggunakan predikat dan ekspresi untuk menentukan apa yang harus ditampilkan dan cara memformatnya. Predikat diwakili oleh kelas NSPredicate yang sama yang memfilter hasil dari Data Inti atau item dalam NSArray di Objective-C. Predikat didasarkan pada ekspresi, diwakili oleh kelas NSExpression.

Dokumen ini membahas subset spesifik dari sintaks predikat dan ekspresi yang didukung oleh SDK ini. Untuk pengenalan yang lebih umum tentang predikat dan ekspresi, lihat Panduan Pemrograman Predikat dalam dokumentasi pengembang Apple.

Menggunakan predikat untuk memfilter data vektor

Sebagian besar kelas layer menampilkan objek Feature yang dapat Anda tampilkan atau sembunyikan berdasarkan properti fitur. Gunakan opsi filter untuk menyertakan hanya fitur di lapisan sumber yang memenuhi kondisi yang Anda tentukan.

Operator

Operator perbandingan berikut didukung:

NSPredicateOperatorType Sintaks string format
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 }

Untuk menguji apakah suatu fitur memiliki atau tidak memiliki properti tertentu, bandingkan atribut NULL dengan atau NIL. Predikat yang dibuat menggunakan inisialisasi NSPredicate(value:) juga didukung. Operator string dan operator kustom tidak didukung.

Operator gabungan berikut didukung:

NSCompoundPredicateType Sintaks string format
NSAndPredicateType predicate1 AND predicate2
predicate1 && predicate2
NSOrPredicateType predicate1 OR predicate2
predicate1 \|\| predicate2
NSNotPredicateType NOT predicate
!predicate

Operator agregat berikut didukung:

NSPredicateOperatorType Sintaks string format
NSInPredicateOperatorType key IN { 'iOS', 'macOS', 'tvOS', 'watchOS' }
NSContainsPredicateOperatorType { 'iOS', 'macOS', 'tvOS', 'watchOS' } CONTAINS key

Anda dapat menggunakan operator IN dan CONTAINS untuk menguji apakah nilai muncul dalam koleksi, apakah string adalah substring dari string yang lebih besar, atau apakah fitur yang dievaluasi (SELF) terletak dalam Feature yang diberikan.

Kombinasi pengubah dan operator perbandingan berikut didukung:

NSComparisonPredicateModifier NSPredicateOperatorType Sintaks string format
NSAllPredicateModifier NSNotEqualToPredicateOperatorType ALL haystack != needle
NSAnyPredicateModifier NSEqualToPredicateOperatorType ANY haystack = needle
SOME haystack = needle

Opsi predikat perbandingan berikut didukung untuk operator perbandingan dan agregat yang digunakan dalam predikat:

NSComparisonPredicateOptions Sintaks string format
NSCaseInsensitivePredicateOption 'QUEBEC' =[c] 'Quebec'
NSDiacriticInsensitivePredicateOption 'Québec' =[d] 'Quebec'

Pilihan predikat perbandingan lainnya tidak didukung, yaitu l (untuk sensitivitas lokal) dan n (untuk normalisasi). Perbandingan peka terhadap lokal selama tidak peka huruf besar/kecil atau diakritik. Opsi predikat perbandingan tidak didukung dengan pengubah perbandingan seperti ALL dan ANY.

Operand

Operand dalam predikat dapat berupa variabel, jalur kunci, atau hampir semua hal lain yang dapat muncul di dalam ekspresi.

Transmisi jenis otomatis tidak dilakukan. Oleh karena itu, fitur hanya cocok dengan predikat jika nilainya untuk properti yang dimaksud adalah dari jenis yang sama dengan nilai yang ditentukan dalam predikat. Gunakan operator CAST() untuk mengonversi jalur atau variabel kunci menjadi jenis yang cocok:

  • Untuk memberikan nilai ke angka, gunakan CAST(key, 'NSNumber').
  • Untuk memberikan nilai ke string, gunakan CAST(key, 'NSString').
  • Untuk memberikan nilai ke warna, gunakan CAST(key, 'UIColor').
  • Untuk mentransmisikan objek UIColor ke array, gunakan CAST(noindex(color), 'NSArray').

Untuk informasi selengkapnya tentang sintaks string format predikat, lihat bab "Sintaks String Format Predikat" dari Panduan Pemrograman Predikat dalam dokumentasi pengembang Apple.

Contoh operand

Lapisan gelembung dan simbol merender koordinat semua geometri dalam sumber data, secara default. Perilaku ini dapat menyoroti node poligon atau baris. Opsi filter dari lapisan dapat digunakan untuk membatasi jenis geometri dari fitur yang direndernya, dengan menggunakan NSExpression.geometryTypeAZMVariable dalam sebuah predikat. Contoh berikut membatasi lapisan gelembung, sehingga hanya fitur Point yang dirender.

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

Contoh berikut ini memungkinkan fitur Point dan Polygon untuk dirender.

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

Menggunakan ekspresi untuk mengonfigurasi opsi layer

Ekspresi dapat berisi subekspresi dari berbagai jenis. Masing-masing jenis ekspresi yang didukung dibahas di bawah ini.

Beberapa contoh di bagian dokumen ini menggunakan fitur berikut untuk menunjukkan berbagai cara tempat ekspresi ini dapat digunakan.

{
    "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"
        }
    }
}

Kode berikut menunjukkan cara membuat fitur GeoJSON ini secara manual dalam aplikasi.

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

Kode berikut menunjukkan cara mendeserialisasi versi objek JSON yang diuntai dalam string ke dalam fitur GeoJSON dalam aplikasi.

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)

Berbasis JSON

Azure Maps Web SDK juga mendukung ekspresi gaya berbasis data yang diwakili menggunakan array JSON. Ekspresi yang sama ini dapat dibuat ulang menggunakan kelas NSExpression native di SDK iOS. Atau, ekspresi berbasis JSON ini dapat dibagikan ke aplikasi ios (dilampirkan ke respons, misalnya) dan diteruskan ke metode NSExpression(azmJSONObject:). Misalnya, gunakan ekspresi JSON berikut.

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

Versi yang diuntai dalam string dari ekspresi di atas semestinya ["get", "title"] dan dapat dibaca dalam iOS SDK sebagai berikut.

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

Menggunakan pendekatan ini dapat memudahkan untuk menggunakan kembali ekspresi gaya antara aplikasi seluler dan aplikasi web yang menggunakan Azure Maps.

Video ini memberikan gambaran umum penggunaan gaya berbasis data di Azure Maps.

Tampilan Internet of Things - Gaya yang Didorong Data dengan Azure Maps

Nilai konstan

Nilai konstan dapat merupakan salah satu jenis berikut:

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

Contoh nilai konstan

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

Jalur utama

Ekspresi jalur kunci mengacu pada properti objek Feature yang sedang dievaluasi untuk ditampilkan. Misalnya, jika kamus poligon Feature.properties berisi kunci floorCount, maka jalur kunci floorCount mengacu pada nilai properti floorCount saat mengevaluasi poligon tertentu.

Beberapa karakter mungkin tidak digunakan secara langsung sebagai bagian dari jalur kunci dalam string format. Misalnya, jika properti fitur diberi nama ISO 3166-1:2006, string lowercase(ISO 3166-1:2006) format ekspresi atau string ISO 3166-1:2006 == 'US-OH' format predikat akan menaikkan pengecualian. Sebagai gantinya, gunakan tempat penampung %K atau inisiator NSExpression(forKeyPath:):

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

Fungsi

Dari fungsi yang telah ditentukan sebelumnya oleh metode NSExpression(forFunction:arguments:) , subset berikut didukung dalam opsi lapisan:

Parameter inisialisasi Sintaks string format
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')

Fungsi yang telah ditentukan sebelumnya berikut tidak didukung:

Parameter inisialisasi Sintaks string format
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)

Kondisional

Kondisional didukung melalui metode NSExpression(forAZMConditional:trueExpression:falseExpression:) dan operator TERNARY() bawaan. Jika Anda perlu mengekspresikan beberapa kasus (“else-if”), Anda dapat melapisi kondisional dalam kondisional atau menggunakan ekspresi pencocokan.

Contoh kondisional

Contoh berikut melangkah melalui predikat yang berbeda sampai menemukan satu yang mengevaluasi ke true, dan kemudian mengembalikan ekspresi sebenarnya. Jika tidak ada predikat yang dievaluasi ke true, ekspresi palsu terakhir dikembalikan.

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

Agregat

Ekspresi agregat dapat berisi array ekspresi. Dalam beberapa kasus, dimungkinkan untuk menggunakan array itu sendiri alih-alih membungkus array dalam ekspresi agregat.

Variabel

Th iOS SDK menentukan variabel berikut untuk digunakan dengan opsi lapisan.

Pengidentifikasi fitur

ID fitur. Variabel ini sesuai dengan properti NSExpression.featureIdentifierAZMVariable.

Sintaks string format: $featureIdentifier

Properti fitur

Objek properti fitur. Variabel ini sesuai dengan properti NSExpression.featurePropertiesAZMVariable.

Sintaks string format: $featureAttributes

Akumulasi fitur

Nilai properti kluster yang terakumulasi sejauh ini. Ini hanya dapat digunakan dalam opsi clusterProperties dari sumber DataSource berkluster. Variabel ini sesuai dengan properti NSExpression.featureAccumulatedAZMVariable.

Sintaks string format: $featureAccumulated

Jenis geometri

Jenis geometri yang diwakili oleh fitur. Jenis fitur adalah salah satu string berikut:

  • Point untuk fitur poin, sesuai dengan kelas Point.
  • MultiPoint untuk kumpulan poin, sesuai dengan kelas PointCollection.
  • LineString untuk fitur poligaris, sesuai dengan kelas Polyline.
  • MultiLineString untuk beberapa fitur poligaris, sesuai dengan kelas MultiPolyline.
  • Polygon untuk fitur poligon, sesuai dengan kelas Polygon.
  • MultiPolygon untuk beberapa fitur poligon, sesuai dengan kelas MultiPolygon.
  • GeometryCollection untuk fitur kumpulan geometri, sesuai dengan kelas GeometryCollection.

Variabel ini sesuai dengan properti NSExpression.geometryTypeAZMVariable.

Sintaks string format: $geometryType

Contoh variabel

Lihat Contoh operand.

Zoom

Tingkat zoom saat ini. Dalam opsi gaya lapisan, variabel ini mungkin hanya muncul sebagai target interpolasi tingkat atas atau ekspresi langkah. Variabel ini sesuai dengan properti NSExpression.zoomLevelAZMVariable.

Sintaks string format: $zoomLevel

Contoh zoom

Secara default, radii poin data yang dirender di lapisan peta panas memiliki radius titik tetap untuk semua tingkat pembesaran tampilan. Saat memperbesar peta, data mengagregasi bersama dan lapisan peta panas terlihat berbeda. Ekspresi zoom dapat digunakan untuk menskalakan radius untuk setiap tingkat pembesaran tampilan, sehingga setiap poin data mencakup area fisik yang sama pada peta. Ini membuat lapisan peta panas terlihat lebih statis dan konsisten. Setiap tingkat pembesaran peta memiliki piksel dua kali lebih banyak secara vertikal dan horizontal dari tingkat perbesar tampilan sebelumnya. Menskalakan radius, sehingga dua kali lipat dengan setiap tingkat perbesar tampilan, membuat peta panas yang terlihat konsisten pada semua tingkat zoom. Ini dapat dicapai menggunakan ekspresi zoom dengan ekspresi base 2 exponential interpolation dan radius piksel yang diatur untuk tingkat pembesaran tampilan minimum dan radius skala untuk tingkat pembesaran tampilan maksimum, yang dihitung sebagai pow(2, maxZoom - minZoom) * radius seperti yang ditunjukkan di bawah ini.

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

Kepadatan Peta Panas

Estimasi kepadatan kernel dari titik layar dalam lapisan peta panas; dengan kata lain, ukuran relatif dari berapa banyak titik data yang berkerumun di sekitar piksel tertentu. Variabel ini mengevaluasi ke angka antara 0 dan 1. Ini digunakan dalam kombinasi dengan ekspresi interpolation atau step untuk menentukan gradien warna yang digunakan untuk mewarnai peta panas. Hanya dapat digunakan dalam opsi heatmapColor pada lapisan peta panas. Variabel ini sesuai dengan properti NSExpression.heatmapDensityAZMVariable.

Sintaks string format: $heatmapDensity

Tip

Warna pada indeks 0, dalam ekspresi interpolasi atau warna default warna langkah, menentukan warna area di mana tidak ada data. Warna pada indeks 0 dapat digunakan untuk menentukan warna latar belakang. Banyak orang lebih suka mengatur nilai ini menjadi transparan atau hitam semi-transparan.

Contoh kepadatan Peta Panas

Contoh ini menggunakan ekspresi interpolasi linier untuk membuat gradien warna yang halus untuk merender peta panas.

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

Selain menggunakan gradien halus untuk mewarnai peta panas, warna dapat ditentukan dalam satu set rentang dengan menggunakan ekspresi langkah. Menggunakan ekspresi langkah untuk mewarnai peta panas secara visual memecah kepadatan menjadi beberapa rentang yang menyerupai peta kontur atau gaya radar.

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

Untuk informasi selengkapnya, lihat artikel Menambahkan lapisan peta panas.

Progres garis

Angka yang menunjukkan jarak relatif di sepanjang garis pada titik tertentu di sepanjang garis. Variabel ini mengevaluasi ke 0 di awal garis dan 1 di akhir baris. Ekspresi ini hanya dapat digunakan dengan opsi LineLayerOption.strokeGradient dari lapisan baris. Ini sesuai dengan properti NSExpression.lineProgressAZMVariable.

Sintaks string format: $lineProgress

Catatan

Opsi strokeGradient lapisan baris memerlukan opsi lineMetrics sumber data untuk diatur ke true.

Contoh progres baris

Contoh ini menggunakan ekspresi NSExpression.lineProgressAZMVariable untuk menerapkan gradien warna ke goresan garis.

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

Lihat contoh langsung

Metode spesifik AzureMaps

Bagian berikut menunjukkan khusus untuk metode AzureMaps yang memperluas kelas NSExpression

Ekspresi pencocokan

Ekspresi pencocokan adalah jenis ungkapan bersyarat yang menyediakan logika seperti pernyataan peralihan. Input bisa berupa ekspresi apa pun seperti NSExpression(forKeyPath: "entityType") yang mengembalikan string atau angka. Ekspresi yang cocok adalah kamus, yang harus memiliki kunci sebagai ekspresi yang mengevaluasi baik ke string tunggal atau angka atau ke array semua string atau semua angka dan nilai sebagai ekspresi apa pun. Jika jenis ekspresi input tidak cocok dengan jenis kunci, hasilnya adalah nilai fallback default.

Contoh ekspresi pencocokan

Contoh berikut mengamati properti entityType dari fitur Point dalam lapisan gelembung yang mencari kecocokan. Jika menemukan kecocokan, nilai yang ditentukan akan dikembalikan atau itu akan mengembalikan nilai mundur.

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

Contoh berikut ini menggunakan ekspresi yang mengevaluasi ke array string untuk mencantumkan serangkaian label yang semuanya harus mengembalikan nilai yang sama. Pendekatan ini jauh lebih efisien daripada mencantumkan setiap label secara terpisah. Dalam hal ini, jika entityType properti adalah "restaurant" atau "grocery_store", warna merah dikembalikan.

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

Ekspresi gabungkan

Ekspresi penggabungan melangkah melalui serangkaian ekspresi sampai nilai bukan-null pertama diperoleh, dan mengembalikan nilai tersebut.

Contoh ekspresi penggabungan

Contoh berikut menggunakan ekspresi penggabungan untuk mengatur opsi textField dari lapisan simbol. title Jika properti hilang dari fitur atau diatur ke nil, ekspresi mencari subTitle properti , jika hilang atau nil, properti mengembalikan string kosong.

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

Menggabungkan ekspresi

Menggabungkan beberapa string bersama-sama. Setiap nilai harus merupakan string atau angka.

Contoh ekspresi gabungan

Contoh berikut menggabungkan properti temperature dari fitur titik dan "°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)
    ]
)

Ekspresi di atas merender pin di peta dengan teks "64°F" dilapisi di atasnya seperti yang ditunjukkan pada gambar berikut.

Contoh ekspresi gabungan

Ekspresi interpolasi dan langkah

Ekspresi interpolasi dan langkah dapat digunakan untuk menghitung nilai di sepanjang fungsi langkah atau kurva yang diinterpolasi. Berbagai ekspresi ini mengambil ekspresi yang mengembalikan nilai numerik sebagai inputnya, misalnya NSExpression(forKeyPath: "temperature"). Nilai input dievaluasi terhadap pasangan nilai input dan output, untuk menentukan nilai yang paling sesuai dengan kurva terinterpolasi atau fungsi langkah. Nilai output disebut "stop". Nilai input untuk setiap stop harus berupa angka dan berada dalam urutan naik. Nilai output harus berupa angka, dan array angka, atau warna.

Ekspresi interpolasi

Ekspresi interpolasi dapat digunakan untuk menghitung rangkaian nilai yang berkelanjutan dan halus, dengan menginterpolasi antar nilai henti.

Terdapat tiga jenis metode interpolasi yang dapat digunakan dalam ekspresi interpolasi:

Nama Deskripsi Parameter
ExpressionInterpolationMode.linear Menginterpolasi secara linear antara sepasang stop. nil
ExpressionInterpolationMode.exponential Menginterpolasi secara eksponensial antara stop. Dasar ditentukan dan mengontrol laju peningkatan output. Nilai yang lebih tinggi membuat output semakin meningkat ke ujung atas rentang. Nilai dasar yang mendekati 1 menghasilkan output yang meningkat lebih linier. Ekspresi yang mengevaluasi ke angka, menentukan dasar interpolasi eksponensial.
ExpressionInterpolationMode.cubicBezier Menginterpolasi menggunakan kurva Bezier kubik yang didefinisikan oleh titik kontrol yang diberikan. Array atau ekspresi agregat yang berisi empat ekspresi, masing-masing mengevaluasi ke angka. Keempat angka tersebut adalah titik kontrol untuk kurva kubik Bézier.

Berikut adalah contoh tampilan berbagai jenis interpolasi ini.

Linier Eksponensial Bezier Kubik
Grafik interpolasi linier Grafik interpolasi eksponensial Grafik interpolasi Bezier Kubik
Contoh ekspresi interpolasi

Contoh berikut menggunakan ekspresi interpolasi untuk mengatur properti bubbleColor lapisan gelembung berdasarkan properti temperature dari fitur titik. temperature Jika nilainya kurang dari 60, warna biru dikembalikan. Jika antara 60 dan kurang dari 70, kuning dikembalikan. Jika antara 70 dan kurang dari 80, jeruk dikembalikan. Jika 80 atau lebih besar, merah dikembalikan.

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

Gambar berikut menunjukkan bagaimana warna dipilih untuk ekspresi di atas.

Contoh ekspresi interpolasi

Ekspresi langkah

Ekspresi langkah dapat digunakan untuk menghitung nilai hasil langkah yang diskrit dengan mengevaluasi fungsi konstanta sepotong yang ditentukan oleh henti.

Ekspresi langkah mengembalikan nilai output henti tepat sebelum nilai input, atau nilai input pertama, jika input kurang dari henti pertama.

Contoh ekspresi langkah

Contoh berikut menggunakan ekspresi langkah untuk mengatur properti bubbleColor lapisan gelembung berdasarkan properti temperature dari fitur titik. temperature Jika nilainya kurang dari 60, biru dikembalikan. Jika antara 60 dan kurang dari 70, kuning dikembalikan. Jika antara 70 dan kurang dari 80, jeruk dikembalikan. Jika 80 atau lebih besar, merah dikembalikan.

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

Gambar berikut menunjukkan bagaimana warna dipilih untuk ekspresi di atas.

Contoh ekspresi langkah

Informasi Tambahan

Pelajari selengkapnya tentang lapisan-lapisan yang mendukung ekspresi: