Mapbox v10 iOS SDK 的条件颜色表达式
Conditional color expression for Mapbox v10 iOS SDK
随着 Mapbox v10 SDK 进入发布候选阶段,我已经开始更新现有的 iOS 应用程序,该应用程序是基于先前版本的 Mapbox iOS SDK (v6.3) 构建的.该应用程序在地图上显示圆形标记以表示某些 GeoJSON 特征的位置。示例功能如下所示:
{
"properties" : {
"type" : "TRUCK",
"needsHelp" : false,
},
"id" : 12345,
"type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : [
-122.28992161530911,
47.46347019873241
]
}
}
我正在使用此 CircleLayer
的运行时样式,并且此层的 .circleColor
属性 被设置为一个表达式,其工作方式如下:
if (feature.properties.needsHelp == true) {
// the circle color should be red
} else {
// the circle color is determined by the value of the features "type" property
}
在之前版本的Mapbox iOS SDK中,表达式是使用NSExpression
实现的,当然,我使用了三元运算符和MGL_Match
运算符的组合来实现实现这种行为。使用新的 v10 iOS SDK,表达式现在有了自己的 DSL,我知道您也可以使用原始 JSON 内联定义它们,以便与 Mapbox GL JS 更加一致。不幸的是,我发现自己正在努力寻找使用新 SDK 实现此表达式逻辑的正确方法。
目前,我的表达式定义如下:
let colorExpression = Exp(.match) {
Exp(.get) { "type" }
"TRUCK"
UIColor.systemBlue
"SHIP"
UIColor.systemOrange
"AIRCRAFT"
UIColor.systemGreen
UIColor.systemGray // default color if some other "type" value
}
circleLayer.circleColor = .expression(colorExpression)
这提供了上面描述的“else”逻辑,但我仍然缺少“if”逻辑来首先检查“.needsHelp”功能属性以查看它是否为真,然后return UIColor.red.
我一直在查看 Mapbox Style Specification 文档,它看起来像'case' operator could be used to provide if/else functionality. One of the Mapbox v10 SDK examples here 展示了如何在表达式中使用 .switchCase
运算符,但我并不完全清楚我在上面定义的“其他”逻辑将适合 .switchCase
运算符的示例用法。任何人都可以对此提供一些见解吗?非常感谢。
经过反复试验,我想我找到了解决问题的方法。可能有其他(更好的?)方法来实现相同的逻辑,但下面的表达式似乎对我来说工作正常:
let colorExpression = Exp(.switchCase) {
Exp(.eq) {
Exp(.get) { "needsHelp" }
true
}
UIColor.systemRed
Exp(.match) {
Exp(.get) { "type" }
"TRUCK"
UIColor.systemBlue
"SHIP"
UIColor.systemOrange
"AIRCRAFT"
UIColor.systemGreen
UIColor.systemGray
}
}
随着 Mapbox v10 SDK 进入发布候选阶段,我已经开始更新现有的 iOS 应用程序,该应用程序是基于先前版本的 Mapbox iOS SDK (v6.3) 构建的.该应用程序在地图上显示圆形标记以表示某些 GeoJSON 特征的位置。示例功能如下所示:
{
"properties" : {
"type" : "TRUCK",
"needsHelp" : false,
},
"id" : 12345,
"type" : "Feature",
"geometry" : {
"type" : "Point",
"coordinates" : [
-122.28992161530911,
47.46347019873241
]
}
}
我正在使用此 CircleLayer
的运行时样式,并且此层的 .circleColor
属性 被设置为一个表达式,其工作方式如下:
if (feature.properties.needsHelp == true) {
// the circle color should be red
} else {
// the circle color is determined by the value of the features "type" property
}
在之前版本的Mapbox iOS SDK中,表达式是使用NSExpression
实现的,当然,我使用了三元运算符和MGL_Match
运算符的组合来实现实现这种行为。使用新的 v10 iOS SDK,表达式现在有了自己的 DSL,我知道您也可以使用原始 JSON 内联定义它们,以便与 Mapbox GL JS 更加一致。不幸的是,我发现自己正在努力寻找使用新 SDK 实现此表达式逻辑的正确方法。
目前,我的表达式定义如下:
let colorExpression = Exp(.match) {
Exp(.get) { "type" }
"TRUCK"
UIColor.systemBlue
"SHIP"
UIColor.systemOrange
"AIRCRAFT"
UIColor.systemGreen
UIColor.systemGray // default color if some other "type" value
}
circleLayer.circleColor = .expression(colorExpression)
这提供了上面描述的“else”逻辑,但我仍然缺少“if”逻辑来首先检查“.needsHelp”功能属性以查看它是否为真,然后return UIColor.red.
我一直在查看 Mapbox Style Specification 文档,它看起来像'case' operator could be used to provide if/else functionality. One of the Mapbox v10 SDK examples here 展示了如何在表达式中使用 .switchCase
运算符,但我并不完全清楚我在上面定义的“其他”逻辑将适合 .switchCase
运算符的示例用法。任何人都可以对此提供一些见解吗?非常感谢。
经过反复试验,我想我找到了解决问题的方法。可能有其他(更好的?)方法来实现相同的逻辑,但下面的表达式似乎对我来说工作正常:
let colorExpression = Exp(.switchCase) {
Exp(.eq) {
Exp(.get) { "needsHelp" }
true
}
UIColor.systemRed
Exp(.match) {
Exp(.get) { "type" }
"TRUCK"
UIColor.systemBlue
"SHIP"
UIColor.systemOrange
"AIRCRAFT"
UIColor.systemGreen
UIColor.systemGray
}
}