mapbox / mapbox-plugins-ios

Experimental plugins to supercharge your maps ⚡️
ISC License
7 stars 8 forks source link

Showing Street Name Layer on Top of Traffic Source Layer #24

Closed hastiranjkesh closed 5 years ago

hastiranjkesh commented 5 years ago

I want street name layer to be on top of the traffic layer. After adding traffic to my map view via addToMapView method, I tried to find the traffic source layer and street name layer by their identifiers, then I removed the street name layer and inserted it again on top of traffic layer. But It does not work. Am I doing wrong? How is the best way to bring street name layer on top of traffic layer?

var trafficPlugin: MBXTrafficPlugin?
...

trafficPlugin?.add(to: mapView)

let bundle = Bundle.init(for: MBXTrafficPlugin.self)
guard let bundleIdentifier = bundle.bundleIdentifier else { return }

if let layers = self.mapView.style?.layers.reversed() {
    var streetNameLayer: MGLStyleLayer?
    var trafficStreetLayer: MGLLineStyleLayer?
    for layer in layers {
        if layer.identifier == "road_direction_ft_brg" {
            streetNameLayer = layer
            continue
        }
         if layer.isKind(of: MGLLineStyleLayer.self) {
            let tLayer = layer as! MGLLineStyleLayer
            if tLayer.sourceIdentifier == bundleIdentifier + "-traffic-source" {
                trafficStreetLayer = tLayer
                continue
            }
        }
        if streetNameLayer != nil, trafficStreetLayer != nil {
            break
        }
    }
    guard let streetLayer = streetNameLayer, let trafficLayer = trafficStreetLayer else { return }
    self.mapView.style?.removeLayer(streetLayer)
    self.mapView.style?.insertLayer(streetLayer, above: trafficLayer)
 } 
hastiranjkesh commented 5 years ago

I solved my problem by changing bottom three lines of code to these:

guard let streetLayer = streetNameLayer else { return }
self.mapView.style?.removeLayer(streetLayer)
guard let topLayer = self.mapView.style?.layer(withIdentifier: "org.cocoapods.MapboxPlugins-traffic-motorway-layer") else { return }
self.mapView.style?.insertLayer(streetLayer, above: topLayer)

It works but I want to know is there a better way or not?