Datadrivna formatuttryck i iOS SDK (förhandsversion)
Kommentar
Azure Kartor iOS SDK-tillbakadragning
Azure Kartor Native SDK för iOS är nu inaktuell och kommer att dras tillbaka den 3/31/25. För att undvika tjänststörningar migrerar du till Azure Kartor Web SDK senast 3/31/25. Mer information finns i migreringsguiden för Azure Kartor iOS SDK.
Lager använder predikat och uttryck för att avgöra vad som ska visas och hur det ska formateras. Predikat representeras av samma NSPredicate
klass som filtrerar resultat från Kärndata eller objekt i en NSArray
i Objective-C.
Predikat baseras på uttryck som representeras av NSExpression
klassen.
I det här dokumentet beskrivs den specifika delmängden av predikat- och uttryckssyntaxen som stöds av denna SDK. En mer allmän introduktion till predikat och uttryck finns i dokumentationen om predikatprogrammering i Apple Developer.
Använda predikat för att filtrera vektordata
De flesta lagerklasser visar Feature
objekt som du kan visa eller dölja baserat på funktionens egenskaper. Använd alternativet filter
för att endast inkludera de funktioner i källlagret som uppfyller ett villkor som du definierar.
Operatorer
Följande jämförelseoperatorer stöds:
NSPredicateOperatorType |
Formatera strängsyntax |
---|---|
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 } |
Om du vill testa om en funktion har eller saknar en specifik egenskap jämför du attributet med NULL
eller NIL
. Predikat som skapas med initieraren NSPredicate(value:)
stöds också. Strängoperatorer och anpassade operatorer stöds inte.
Följande sammansatta operatorer stöds:
NSCompoundPredicateType |
Formatera strängsyntax |
---|---|
NSAndPredicateType |
predicate1 AND predicate2 predicate1 && predicate2 |
NSOrPredicateType |
predicate1 OR predicate2 predicate1 \|\| predicate2 |
NSNotPredicateType |
NOT predicate !predicate |
Följande aggregeringsoperatorer stöds:
NSPredicateOperatorType |
Formatera strängsyntax |
---|---|
NSInPredicateOperatorType |
key IN { 'iOS', 'macOS', 'tvOS', 'watchOS' } |
NSContainsPredicateOperatorType |
{ 'iOS', 'macOS', 'tvOS', 'watchOS' } CONTAINS key |
Du kan använda operatorerna IN
och CONTAINS
för att testa om ett värde visas i en samling, om en sträng är en delsträng av en större sträng eller om den utvärderade funktionen (SELF
) ligger inom en viss Feature
.
Följande kombinationer av jämförelseoperatorer och modifierare stöds:
NSComparisonPredicateModifier |
NSPredicateOperatorType |
Formatera strängsyntax |
---|---|---|
NSAllPredicateModifier |
NSNotEqualToPredicateOperatorType |
ALL haystack != needle |
NSAnyPredicateModifier |
NSEqualToPredicateOperatorType |
ANY haystack = needle SOME haystack = needle |
Följande alternativ för jämförelsepredikat stöds för jämförelse- och aggregeringsoperatorer som används i predikatet:
NSComparisonPredicateOptions |
Formatera strängsyntax |
---|---|
NSCaseInsensitivePredicateOption |
'QUEBEC' =[c] 'Quebec' |
NSDiacriticInsensitivePredicateOption |
'Québec' =[d] 'Quebec' |
Andra alternativ för jämförelsepredikat stöds inte, nämligen l
(för språkkänslighet) och n
(för normalisering). En jämförelse är språkkänslig så länge den är skiftlägeskänslig eller diakritisk. Alternativ för jämförelsepredikat stöds inte med jämförelsemodifierare som ALL
och ANY
.
Operander
Operander i predikat kan vara variabler, nyckelsökvägar eller nästan allt annat som kan visas i ett uttryck.
Automatisk typgjutning utförs inte. Därför matchar en funktion endast ett predikat om dess värde för egenskapen i fråga är av samma typ som det värde som anges i predikatet. Använd operatorn CAST()
för att konvertera en nyckelsökväg eller variabel till en matchande typ:
- Om du vill omvandla ett värde till ett tal använder du
CAST(key, 'NSNumber')
. - Om du vill omvandla ett värde till en sträng använder du
CAST(key, 'NSString')
. - Om du vill omvandla ett värde till en färg använder du
CAST(key, 'UIColor')
. - Om du vill omvandla ett
UIColor
objekt till en matris använder duCAST(noindex(color), 'NSArray')
.
Mer information om strängsyntaxen för predikatformat finns i kapitlet "Predicate Format String Syntax" i dokumentationen om predikatprogrammering i Apple Developer.
Exempel på operander
Bubbel- och symbolskikt återger som standard koordinaterna för alla geometrier i en datakälla. Det här beteendet kan markera hörnen för en polygon eller en rad. Alternativet filter
för lagret kan användas för att begränsa geometritypen för de funktioner som återges med hjälp NSExpression.geometryTypeAZMVariable
av ett predikat. I följande exempel begränsas ett bubbellager så att endast Point
funktioner återges.
let layer = BubbleLayer(source: source, options: [
.filter(
from: NSPredicate(format: "%@ == \"Point\"", NSExpression.geometryTypeAZMVariable)
)
])
I följande exempel kan både Point
och Polygon
funktioner återges.
let layer = BubbleLayer(source: source, options: [
.filter(
from: NSCompoundPredicate(orPredicateWithSubpredicates: [
NSPredicate(format: "%@ == \"Point\"", NSExpression.geometryTypeAZMVariable),
NSPredicate(format: "%@ == \"Polygon\"", NSExpression.geometryTypeAZMVariable)
])
)
])
Använda uttryck för att konfigurera lageralternativ
Ett uttryck kan innehålla underuttryck av olika typer. Varje typ av uttryck som stöds beskrivs nedan.
Några exempel i det här avsnittet av dokumentet använder följande funktion för att demonstrera olika sätt på vilka dessa uttryck kan användas.
{
"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"
}
}
}
Följande kod visar hur du manuellt skapar den här GeoJSON-funktionen i en app.
// 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"])
Följande kod visar hur du deserialiserar den strängifierade versionen av JSON-objektet till en GeoJSON-funktion i en app.
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-baserad
Azure Kartor Web SDK stöder också datadrivna formatuttryck som representeras med hjälp av en JSON-matris. Samma uttryck kan återskapas med hjälp av den interna NSExpression
klassen i iOS SDK. Alternativt kan dessa JSON-baserade uttryck delas till ios-appen (till exempel kopplat till svaret) och skickas till NSExpression(azmJSONObject:)
metoden. Ta till exempel följande JSON-uttryck.
var exp = ['get','title'];
Den snabba versionen av ovanstående uttryck skulle vara ["get", "title"]
och kan läsas in i iOS SDK på följande sätt.
let jsonResponse = ["get", "title"]
let exp = NSExpression(azmJSONObject: jsonResponse)
Med den här metoden kan du enkelt återanvända formatuttryck mellan mobila appar och webbappar som använder Azure Kartor.
Den här videon ger en översikt över datadriven formatering i Azure Kartor.
Internet of Things Show – datadriven formatering med Azure Kartor
Konstanta värden
Ett konstant värde kan vara av någon av följande typer:
UIColor
String
NSNumber.boolValue
NSNumber.doubleValue
[Float]
[String]
NSValue.cgVectorValue
NSValue.uiEdgeInsetsValue
Exempel på konstantvärden
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)))
Nyckelsökvägar
Ett nyckelsökvägsuttryck refererar till en egenskap för objektet Feature
som utvärderas för visning. Om en polygons Feature.properties
ordlista till exempel innehåller floorCount
nyckeln refererar nyckelsökvägen floorCount
till värdet för egenskapen när du utvärderar just den polygonen floorCount
.
Vissa tecken kanske inte används direkt som en del av en nyckelsökväg i en formatsträng. Om en funktions egenskap till exempel heter ISO 3166-1:2006
, skulle en uttrycksformatsträng av lowercase(ISO 3166-1:2006)
eller en predikatformatsträng ISO 3166-1:2006 == 'US-OH'
för generera ett undantag. Använd i stället en %K
platshållare eller NSExpression(forKeyPath:)
initieraren:
NSPredicate(format: "%K == 'US-OH'", "ISO 3166-1:2006")
NSExpression(
forFunction: "lowercase:",
arguments: [NSExpression(forKeyPath: "ISO 3166-1:2006")]
)
Functions
Av de funktioner som fördefinierades av NSExpression(forFunction:arguments:)
metoden stöds följande delmängd i lageralternativ:
Parametern Initializer | Formatera strängsyntax |
---|---|
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') |
Följande fördefinierade funktioner stöds inte :
Parametern Initializer | Formatera strängsyntax |
---|---|
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) |
Villkorssatser
Villkor stöds via den inbyggda NSExpression(forAZMConditional:trueExpression:falseExpression:)
metoden och TERNARY()
operatorn. Om du behöver uttrycka flera fall ("else-if") kan du antingen kapsla en villkorsstyrd i en villkorsstyrd eller använda matchningsuttrycket.
Exempel på villkorsstyrda villkor
I följande exempel går vi igenom olika predikat tills det hittar ett som utvärderas till true
och sedan returnerar dess sanna uttryck. Om inga predikat utvärderas till true
returneras det sista falska uttrycket.
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)
)
)
)
]
)
Aggregeringar
Aggregerade uttryck kan innehålla uttrycksmatriser. I vissa fall är det möjligt att använda själva matrisen i stället för att omsluta matrisen i ett aggregerat uttryck.
Variabler
Th iOS SDK definierar följande variabler för användning med lageralternativ.
Funktionsidentifierare
En funktions ID. Den här variabeln motsvarar NSExpression.featureIdentifierAZMVariable
egenskapen.
Formatera strängsyntax: $featureIdentifier
Funktionsegenskaper
En funktions egenskapsobjekt. Den här variabeln motsvarar NSExpression.featurePropertiesAZMVariable
egenskapen.
Formatera strängsyntax: $featureAttributes
Funktion ackumulerad
Värdet för en klusteregenskap som ackumulerats hittills.
Detta kan bara användas i clusterProperties
alternativet för en klustrad DataSource
källa.
Den här variabeln motsvarar NSExpression.featureAccumulatedAZMVariable
egenskapen.
Formatera strängsyntax: $featureAccumulated
Geometrityp
Typen av geometri som representeras av funktionen. En funktionstyp är en av följande strängar:
Point
för punktfunktioner som motsvararPoint
klassen.MultiPoint
för punktsamlingsfunktioner som motsvararPointCollection
klassen.LineString
för polylinefunktioner som motsvararPolyline
klassen.MultiLineString
för flera polylines-funktioner som motsvararMultiPolyline
klassen.Polygon
för polygonfunktioner som motsvararPolygon
klassen.MultiPolygon
för flera polygonfunktioner som motsvararMultiPolygon
klassen.GeometryCollection
för geometrisamlingsfunktioner som motsvararGeometryCollection
klassen.
Den här variabeln motsvarar NSExpression.geometryTypeAZMVariable
egenskapen.
Formatera strängsyntax: $geometryType
Exempel på variabler
Se Operands-exempel.
Zooma
Den aktuella zoomnivån.
I lagrets formatalternativ kan den här variabeln bara visas som mål för en interpolering på översta nivån eller ett steguttryck.
Den här variabeln motsvarar NSExpression.zoomLevelAZMVariable
egenskapen.
Formatera strängsyntax: $zoomLevel
Zooma exempel
Som standard har radien av datapunkter som återges i värmekartlagret en fast punktradie för alla zoomnivåer. När kartan zoomas aggregeras data och värmekartlagret ser annorlunda ut. Ett zoom
uttryck kan användas för att skala radien för varje zoomnivå så att varje datapunkt täcker samma fysiska område på kartan. Det gör att värmekartlagret ser mer statiskt och konsekvent ut. Varje zoomningsnivå på kartan har dubbelt så många punkter lodrätt och vågrätt som den tidigare zoomnivån. Om du skalar radien, så att den fördubblas med varje zoomnivå, skapas en värmekarta som ser konsekvent ut på alla zoomnivåer. Det kan utföras med uttrycket zoom
med ett base 2 exponential interpolation
uttryck, med punktradien inställd för den minsta zoomnivån och en skalad radie för den maximala zoomnivå som beräknas enligt pow(2, maxZoom - minZoom) * radius
nedan.
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
])
)
)
]
)
HeatMap-densitet
Kerneldensitetens uppskattning av en skärmpunkt i ett heatmap-lager, med andra ord ett relativt mått på hur många datapunkter som trängs runt en viss pixel.
Den här variabeln utvärderas till ett tal mellan 0 och 1.
Den används i kombination med ett interpolation
eller step
ett uttryck för att definiera den färgtoning som används för att färglägga värmekartan.
Kan endast användas i heatmapColor
alternativet för termisk kartskikt.
Den här variabeln motsvarar NSExpression.heatmapDensityAZMVariable
egenskapen.
Formatera strängsyntax: $heatmapDensity
Dricks
Färgen vid index 0, i ett interpolationsuttryck eller standardfärgen för en stegfärg, definierar färgen på det område där det inte finns några data. Färgen på index 0 kan användas för att definiera en bakgrundsfärg. Många föredrar att ange det här värdet till transparent eller halvtransparent svart.
Exempel på HeatMap-densitet
I det här exemplet används ett linerinterpolationsuttryck för att skapa en jämn färgtoning för återgivning av värmekartan.
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)
])
)
)
]
)
Förutom att använda en jämn toning för att färglägga en värmekarta kan färger anges inom en uppsättning intervall med hjälp av ett steguttryck. Om du använder ett steguttryck för att färglägga värmekartan bryts densiteten visuellt upp i områden som liknar en kontur- eller radarformatkarta.
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
])
)
)
]
)
Mer information finns i artikeln Lägg till ett termisk kartskikt .
Radförlopp
Ett tal som anger det relativa avståndet längs en linje vid en viss punkt längs linjen.
Den här variabeln utvärderas till 0 i början av raden och 1 i slutet av raden.
Den kan bara användas med LineLayerOption.strokeGradient
alternativet för linjeskiktet.
Den motsvarar NSExpression.lineProgressAZMVariable
egenskapen.
Formatera strängsyntax: $lineProgress
Kommentar
Alternativet strokeGradient
för linjeskiktet kräver lineMetrics
att alternativet för datakällan anges till true
.
Exempel på radförlopp
I det NSExpression.lineProgressAZMVariable
här exemplet används uttrycket för att tillämpa en färgtoning på linjestrecket.
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
])
)
)
]
)
Azure Kartor-specifika metoder
I följande avsnitt visas specifika för Azure Kartor metoder som utökar NSExpression
klassen
Matcha uttryck
Ett matchningsuttryck är en typ av villkorsuttryck som tillhandahåller switch-statement som logik. Indata kan vara valfritt uttryck som NSExpression(forKeyPath: "entityType")
returnerar en sträng eller ett tal. Det matchade uttrycket är en ordlista som ska ha nycklar som uttryck som utvärderas antingen till en sträng eller ett tal eller till en matris med alla strängar eller alla tal och värden som alla uttryck. Om indatauttryckstypen inte matchar typen av nycklar är resultatet standardåterställningsvärdet.
Exempel på matchningsuttryck
I följande exempel tittar vi på entityType
egenskapen för en Point
funktion i ett bubbellager och söker efter en matchning. Om den hittar en matchning returneras det angivna värdet eller returnerar återställningsvärdet.
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)
)
)
]
)
I följande exempel används ett uttryck som utvärderar till strängmatris för att ange en uppsättning etiketter som alla ska returnera samma värde. Den här metoden är mycket effektivare än att lista varje etikett individuellt. Om egenskapen entityType
i det här fallet är "restaurant"
eller "grocery_store"
returneras röd färg.
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)
)
)
]
)
Sammansejningsuttryck
Ett sammansejsningsuttryck stegar genom en uppsättning uttryck tills det första värdet som inte är null hämtas och returnerar det värdet.
Exempel på sammansejsningsuttryck
I följande exempel används ett sammanslåst uttryck för att ange textField
alternativet för ett symbolskikt. Om egenskapen title
saknas i funktionen eller är inställd på nil
söker uttrycket efter egenskapen, om den subTitle
saknas eller nil
returnerar den en tom sträng.
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: "")
])
)
]
)
Kopplingsuttryck
Sammanfogar flera strängar. Varje värde måste vara en sträng eller ett tal.
Exempel på kopplingsuttryck
I följande exempel kopplas temperature
egenskapen för punktfunktionen och "°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)
]
)
Ovanstående uttryck renderar en pin-kod på kartan med texten "64°F"
överlagrad ovanpå den som visas i följande bild.
Interpolering och steguttryck
Interpolerings- och steguttryck kan användas för att beräkna värden längs en interpolerad kurva eller stegfunktion. Dessa uttryck tar in ett uttryck som returnerar ett tal som indata, till exempel NSExpression(forKeyPath: "temperature")
. Indatavärdet utvärderas mot par med indata- och utdatavärden för att fastställa det värde som bäst passar den interpolerade kurvan eller stegfunktionen. Utdatavärdena kallas "stopp". Indatavärdena för varje stopp måste vara ett tal och vara i stigande ordning. Utdatavärdena måste vara ett tal, en matris med tal eller en färg.
Interpolationsuttryck
Ett interpolationsuttryck kan användas för att beräkna en kontinuerlig, smidig uppsättning värden genom att interpolera mellan stoppvärden.
Det finns tre typer av interpoleringsmetoder som kan användas i ett interpolationsuttryck:
Name | beskrivning | Parametrar |
---|---|---|
ExpressionInterpolationMode.linear |
Interpolerar linjärt mellan stoppparet. | nil |
ExpressionInterpolationMode.exponential |
Interpolerar exponentiellt mellan stoppen. En bas anges och styr den hastighet med vilken utdata ökar. Högre värden gör att utdata ökar mer mot den övre änden av intervallet. Ett basvärde nära 1 ger en utdata som ökar linjärt. | Ett uttryck som utvärderas till ett tal och som anger basen för exponentiell interpolation. |
ExpressionInterpolationMode.cubicBezier |
Interpolerar med hjälp av en kubisk Bezier-kurva som definieras av de angivna kontrollpunkterna. | En matris eller ett aggregeringsuttryck som innehåller fyra uttryck, var och en utvärderar till ett tal. De fyra talen är kontrollpunkter för Bézier-kubikkurvan. |
Här är ett exempel på hur dessa olika typer av interpolationer ser ut.
Linjär | Exponentiellt | Kubik bezier |
---|---|---|
Exempel på interpoleringsuttryck
I följande exempel används ett linjärt interpolationsuttryck för att ange bubbleColor
egenskapen för ett bubbellager baserat på temperature
egenskapen för punktfunktionen. Om värdet temperature
är mindre än 60 returneras den blå färgen. Om den är mellan 60 och mindre än 70 returneras gult. Om det är mellan 70 och mindre än 80 returneras orange. Om den är 80 eller högre returneras rött.
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
])
)
)
]
)
Följande bild visar hur färgerna väljs för ovanstående uttryck.
Steguttryck
Ett steguttryck kan användas för att beräkna diskreta, stegvisa resultatvärden genom att utvärdera en bitvis konstant funktion som definieras av stopp.
Steguttryck returnerar utdatavärdet för stoppet precis före indatavärdet, eller från-värdet om indata är mindre än det första stoppet.
Exempel på steguttryck
I följande exempel används ett steguttryck för att ange bubbleColor
egenskapen för ett bubbellager baserat på temperature
egenskapen för punktfunktionen. Om värdet temperature
är mindre än 60 returneras blått. Om den är mellan 60 och mindre än 70 returneras gult. Om det är mellan 70 och mindre än 80 returneras orange. Om den är 80 eller högre returneras rött.
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
])
)
)
]
)
Följande bild visar hur färgerna väljs för ovanstående uttryck.
Ytterligare information
Läs mer om de lager som stöder uttryck: