diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleFactory.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleFactory.kt index c23176a57..bdf6cd624 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleFactory.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleFactory.kt @@ -194,6 +194,8 @@ object RNMBXStyleFactory { setSymbolAvoidEdges(layer, styleValue) "symbolSortKey" -> setSymbolSortKey(layer, styleValue) + "symbolZOffset" -> + setSymbolZOffset(layer, styleValue) "symbolZOrder" -> setSymbolZOrder(layer, styleValue) "iconAllowOverlap" -> @@ -1559,6 +1561,24 @@ object RNMBXStyleFactory { } } + fun setSymbolZOffset(layer: SymbolLayer, styleValue: RNMBXStyleValue ) { + if (styleValue.isExpression()) { + val expression = styleValue.getExpression() + if (expression != null) { + layer.symbolZOffset(expression) + } else { + Logger.e("RNMBXSymbol", "Expression for symbolZOffset is null") + } + } else { + val value = styleValue.getDouble(VALUE_KEY) + if (value != null) { + layer.symbolZOffset(value) + } else { + Logger.e("RNMBXSymbol", "value for symbolZOffset is null") + } + } + } + fun setSymbolZOrder(layer: SymbolLayer, styleValue: RNMBXStyleValue ) { if (styleValue.isExpression()) { val expression = styleValue.getExpression() diff --git a/docs/SymbolLayer.md b/docs/SymbolLayer.md index 7f9f17644..c481eea82 100644 --- a/docs/SymbolLayer.md +++ b/docs/SymbolLayer.md @@ -150,6 +150,7 @@ This is now deprecated, use Image component instead. * symbolPlacement
* symbolSpacing
* symbolAvoidEdges
+* symbolZOffset
* symbolSortKey
* symbolZOrder
* iconAllowOverlap
diff --git a/docs/docs.json b/docs/docs.json index e5da3472f..843bd1d24 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -5904,6 +5904,29 @@ "namespace": "layout" } }, + { + "name": "symbolZOffset", + "type": "number", + "values": [], + "units": "meters", + "default": 0, + "description": "Specifies an uniform elevation from the ground, in meters.", + "requires": [], + "disabledBy": [], + "allowedFunctionTypes": [], + "expression": { + "interpolated": true, + "parameters": [ + "zoom", + "feature" + ] + }, + "mbx": { + "fullName": "paint-symbol-symbol-z-offset", + "name": "symbol-z-offset", + "namespace": "paint" + } + }, { "name": "symbolZOrder", "type": "enum", diff --git a/ios/RNMBX/RNMBXStyle.swift b/ios/RNMBX/RNMBXStyle.swift index 761f80080..8d6a6d1c9 100644 --- a/ios/RNMBX/RNMBXStyle.swift +++ b/ios/RNMBX/RNMBXStyle.swift @@ -177,6 +177,8 @@ func symbolLayer(layer: inout SymbolLayer, reactStyle:Dictionary, o self.setSymbolAvoidEdges(&layer, styleValue:styleValue); } else if (prop == "symbolSortKey") { self.setSymbolSortKey(&layer, styleValue:styleValue); + } else if (prop == "symbolZOffset") { + self.setSymbolZOffset(&layer, styleValue:styleValue); } else if (prop == "symbolZOrder") { self.setSymbolZOrder(&layer, styleValue:styleValue); } else if (prop == "iconAllowOverlap") { @@ -1283,6 +1285,15 @@ func setSymbolSortKey(_ layer: inout SymbolLayer, styleValue: RNMBXStyleValue) layer.symbolSortKey = styleValue.mglStyleValueNumber(); +} + +func setSymbolZOffset(_ layer: inout SymbolLayer, styleValue: RNMBXStyleValue) +{ + + + layer.symbolZOffset = styleValue.mglStyleValueNumber(); + + } func setSymbolZOrder(_ layer: inout SymbolLayer, styleValue: RNMBXStyleValue) diff --git a/src/utils/MapboxStyles.d.ts b/src/utils/MapboxStyles.d.ts index dedd1d5a8..57e03a886 100644 --- a/src/utils/MapboxStyles.d.ts +++ b/src/utils/MapboxStyles.d.ts @@ -689,6 +689,10 @@ export interface SymbolLayerStyleProps { * Sorts features in ascending order based on this value. Features with lower sort keys are drawn and placed first. When `iconAllowOverlap` or `textAllowOverlap` is `false`, features with a lower sort key will have priority during placement. When `iconAllowOverlap` or `textAllowOverlap` is set to `true`, features with a higher sort key will overlap over features with a lower sort key. */ symbolSortKey?: Value; + /** + * Specifies an uniform elevation from the ground, in meters. + */ + symbolZOffset?: Value; /** * Determines whether overlapping symbols in the same layer are rendered in the order that they appear in the data source or by their yPosition relative to the viewport. To control the order and prioritization of symbols otherwise, use `symbolSortKey`. */ diff --git a/src/utils/styleMap.ts b/src/utils/styleMap.ts index 137aa6346..9acd20b03 100644 --- a/src/utils/styleMap.ts +++ b/src/utils/styleMap.ts @@ -72,6 +72,7 @@ const styleMap = { symbolSpacing: StyleTypes.Constant, symbolAvoidEdges: StyleTypes.Constant, symbolSortKey: StyleTypes.Constant, + symbolZOffset: StyleTypes.Constant, symbolZOrder: StyleTypes.Enum, iconAllowOverlap: StyleTypes.Constant, iconIgnorePlacement: StyleTypes.Constant, diff --git a/style-spec/v8.json b/style-spec/v8.json index 808d518f0..5fa98c309 100644 --- a/style-spec/v8.json +++ b/style-spec/v8.json @@ -1848,6 +1848,33 @@ }, "property-type": "data-driven" }, + "symbol-z-offset": { + "type": "number", + "default": 0, + "minimum": 0, + "units": "meters", + "doc": "Specifies an uniform elevation from the ground, in meters.", + "sdk-support": { + "basic functionality": { + "js": "3.7.0", + "android": "11.7.0", + "ios": "11.7.0" + }, + "data-driven styling": { + "js": "3.7.0", + "android": "11.7.0", + "ios": "11.7.0" + } + }, + "expression": { + "interpolated": true, + "parameters": [ + "zoom", + "feature" + ] + }, + "property-type": "data-driven" + }, "symbol-z-order": { "type": "enum", "values": {