Skip to content

Commit 8282a7c

Browse files
authored
feat: add HillshadeLayer component (#4151)
* feat: add HillshadeLayer component Add full HillshadeLayer support with iOS (Swift + Fabric) and Android native implementations. Uses raster-dem source for terrain visualization. * add HillshadeLayer example (Grand Canyon)
1 parent 05c3876 commit 8282a7c

File tree

16 files changed

+1179
-0
lines changed

16 files changed

+1179
-0
lines changed

__tests__/interface.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ describe('Public Interface', () => {
4040
'BackgroundLayer',
4141
'RasterLayer',
4242
'RasterParticleLayer',
43+
'HillshadeLayer',
4344
'SkyLayer',
4445
'Terrain',
4546
'Atmosphere',

android/src/main/java/com/rnmapbox/rnmbx/RNMBXPackage.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import com.rnmapbox.rnmbx.components.styles.layers.RNMBXCircleLayerManager
3131
import com.rnmapbox.rnmbx.components.styles.layers.RNMBXFillExtrusionLayerManager
3232
import com.rnmapbox.rnmbx.components.styles.layers.RNMBXFillLayerManager
3333
import com.rnmapbox.rnmbx.components.styles.layers.RNMBXHeatmapLayerManager
34+
import com.rnmapbox.rnmbx.components.styles.layers.RNMBXHillshadeLayerManager
3435
import com.rnmapbox.rnmbx.components.styles.layers.RNMBXLineLayerManager
3536
import com.rnmapbox.rnmbx.components.styles.layers.RNMBXModelLayerManager
3637
import com.rnmapbox.rnmbx.components.styles.layers.RNMBXRasterLayerManager
@@ -161,6 +162,7 @@ class RNMBXPackage : TurboReactPackage() {
161162
managers.add(RNMBXCircleLayerManager())
162163
managers.add(RNMBXSymbolLayerManager())
163164
managers.add(RNMBXRasterLayerManager())
165+
managers.add(RNMBXHillshadeLayerManager())
164166
if (RNMBXRasterParticleLayerManager.isImplemented) {
165167
managers.add(RNMBXRasterParticleLayerManager())
166168
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.rnmapbox.rnmbx.components.styles.layers
2+
3+
import android.content.Context
4+
import com.mapbox.maps.extension.style.layers.generated.HillshadeLayer
5+
import com.rnmapbox.rnmbx.components.styles.RNMBXStyle
6+
import com.rnmapbox.rnmbx.components.styles.RNMBXStyleFactory
7+
import com.rnmapbox.rnmbx.utils.Logger
8+
9+
class RNMBXHillshadeLayer(context: Context?) : RNMBXLayer<HillshadeLayer?>(
10+
context!!
11+
) {
12+
override fun makeLayer(): HillshadeLayer {
13+
return HillshadeLayer(iD!!, mSourceID!!)
14+
}
15+
16+
override fun addStyles() {
17+
mLayer?.also {
18+
RNMBXStyleFactory.setHillshadeLayerStyle(it, RNMBXStyle(context, mReactStyle, mMap!!))
19+
} ?: run {
20+
Logger.e("RNMBXHillshadeLayer", "mLayer is null")
21+
}
22+
}
23+
24+
fun setSourceLayerID(asString: String?) {
25+
// no-op
26+
}
27+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.rnmapbox.rnmbx.components.styles.layers
2+
3+
import com.facebook.react.bridge.Dynamic
4+
import com.facebook.react.uimanager.ThemedReactContext
5+
import com.facebook.react.uimanager.ViewGroupManager
6+
import com.facebook.react.uimanager.annotations.ReactProp
7+
import com.facebook.react.viewmanagers.RNMBXHillshadeLayerManagerInterface
8+
9+
class RNMBXHillshadeLayerManager : ViewGroupManager<RNMBXHillshadeLayer>(),
10+
RNMBXHillshadeLayerManagerInterface<RNMBXHillshadeLayer> {
11+
override fun getName(): String {
12+
return REACT_CLASS
13+
}
14+
15+
override fun createViewInstance(reactContext: ThemedReactContext): RNMBXHillshadeLayer {
16+
return RNMBXHillshadeLayer(reactContext)
17+
}
18+
19+
// @{codepart-replace-start(LayerManagerCommonProps.codepart-kt.ejs,{layerType:"RNMBXHillshadeLayer"})}
20+
@ReactProp(name = "id")
21+
override fun setId(layer: RNMBXHillshadeLayer, id: Dynamic) {
22+
layer.iD = id.asString()
23+
}
24+
25+
@ReactProp(name = "existing")
26+
override fun setExisting(layer: RNMBXHillshadeLayer, existing: Dynamic) {
27+
layer.setExisting(existing.asBoolean())
28+
}
29+
30+
@ReactProp(name = "sourceID")
31+
override fun setSourceID(layer: RNMBXHillshadeLayer, sourceID: Dynamic) {
32+
layer.setSourceID(sourceID.asString())
33+
}
34+
35+
@ReactProp(name = "aboveLayerID")
36+
override fun setAboveLayerID(layer: RNMBXHillshadeLayer, aboveLayerID: Dynamic) {
37+
layer.setAboveLayerID(aboveLayerID.asString())
38+
}
39+
40+
@ReactProp(name = "belowLayerID")
41+
override fun setBelowLayerID(layer: RNMBXHillshadeLayer, belowLayerID: Dynamic) {
42+
layer.setBelowLayerID(belowLayerID.asString())
43+
}
44+
45+
@ReactProp(name = "layerIndex")
46+
override fun setLayerIndex(layer: RNMBXHillshadeLayer, layerIndex: Dynamic) {
47+
layer.setLayerIndex(layerIndex.asInt())
48+
}
49+
50+
@ReactProp(name = "minZoomLevel")
51+
override fun setMinZoomLevel(layer: RNMBXHillshadeLayer, minZoomLevel: Dynamic) {
52+
layer.setMinZoomLevel(minZoomLevel.asDouble())
53+
}
54+
55+
@ReactProp(name = "maxZoomLevel")
56+
override fun setMaxZoomLevel(layer: RNMBXHillshadeLayer, maxZoomLevel: Dynamic) {
57+
layer.setMaxZoomLevel(maxZoomLevel.asDouble())
58+
}
59+
60+
@ReactProp(name = "reactStyle")
61+
override fun setReactStyle(layer: RNMBXHillshadeLayer, style: Dynamic) {
62+
layer.setReactStyle(style.asMap())
63+
}
64+
65+
@ReactProp(name = "sourceLayerID")
66+
override fun setSourceLayerID(layer: RNMBXHillshadeLayer, sourceLayerID: Dynamic) {
67+
layer.setSourceLayerID(sourceLayerID.asString())
68+
}
69+
70+
@ReactProp(name = "filter")
71+
override fun setFilter(layer: RNMBXHillshadeLayer, filterList: Dynamic) {
72+
layer.setFilter(filterList.asArray())
73+
}
74+
75+
@ReactProp(name = "slot")
76+
override fun setSlot(layer: RNMBXHillshadeLayer, slot: Dynamic) {
77+
layer.setSlot(slot.asString())
78+
}
79+
// @{codepart-replace-end}
80+
81+
companion object {
82+
const val REACT_CLASS = "RNMBXHillshadeLayer"
83+
}
84+
}

0 commit comments

Comments
 (0)