In this page

Custom Runtime Style Layer

This example shows how to customize runtime map style layer.

  1. Custom building-3d layer style with zoom level

  2. Add building layer in Runtime style

  3. Custom water layer style with zoom level

  4. Custom roads layer with zoom level

For all code examples, refer to Maps Code Examples

StyleMapLayerViewController view source

1//
2//  StyleMapLayerViewController.swift
3//  maps-ios-demo
4//
5import Foundation
6import UIKit
7import Nbmap
8enum ActionType{
9    case StyleBuildingExtrusions
10    case StyleWaterWithFunction
11    case StyleRoadsWithFunction
12    case AddBuildingExtrusions
13}
14class StyleMapLayerViewController: UIViewController {
15    
16    var nbMapView: NGLMapView! {
17        didSet {
18            oldValue?.removeFromSuperview()
19            if let mapView = nbMapView {
20                view.insertSubview(mapView, at: 0)
21                mapView.delegate = self
22            }
23        }
24    }
25    var button: UIButton!
26    
27    let typeList = [
28        ActionType.StyleBuildingExtrusions,
29        ActionType.AddBuildingExtrusions,
30        ActionType.StyleWaterWithFunction,
31        ActionType.StyleRoadsWithFunction,
32    ]
33    
34    
35    var points : Array = [CLLocationCoordinate2D]()
36    
37    override func viewDidLoad() {
38        super.viewDidLoad()
39        nbMapView = NGLMapView(frame:self.view.bounds)
40        button = UIButton(type: .system)
41        button.setTitle("Settings", for: .normal)
42        button.addTarget(self, action: #selector(showSetings), for: .touchUpInside)
43        button.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
44        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
45    }
46    
47    @objc func showSetings() {
48        let tableViewController = UITableViewController(style: .plain)
49        tableViewController.tableView.delegate = self
50        tableViewController.tableView.dataSource = self
51        tableViewController.title = "Camera Settings"
52        self.present(tableViewController, animated: true)
53    }
54    
55    func performeSettings(type: ActionType) {
56        switch type {
57        case ActionType.StyleBuildingExtrusions :
58            styleBuildingExtrusions()
59            break
60        case ActionType.StyleWaterWithFunction :
61            styleWaterWithFunction()
62            break
63        case .StyleRoadsWithFunction:
64            styleRoadsWithFunction()
65            break
66        case .AddBuildingExtrusions:
67            addBuildingExtrusions()
68            break
69        }
70        
71    }
72    
73    func styleBuildingExtrusions() {
74        let layer = self.nbMapView.style?.layer(withIdentifier: "building-3d") as? NGLFillExtrusionStyleLayer
75        // Set the fill color to that of the existing building footprint layer, if it exists.
76        layer?.fillExtrusionColor = NSExpression(forConstantValue: UIColor.purple)
77        layer?.fillExtrusionOpacity = NSExpression(forConstantValue: 0.55)
78        
79    
80        nbMapView.setCenter(CLLocationCoordinate2DMake(12.98780156, 77.59956748), zoomLevel: 18, animated: true)
81    }
82    
83    func addBuildingExtrusions() {
84        let source = self.nbMapView.style?.source(withIdentifier: "openmaptiles")
85        if let source = source, self.nbMapView.style?.layer(withIdentifier: "extrudedBuildings") == nil {
86            let layer = NGLFillExtrusionStyleLayer(identifier: "extrudedBuildings", source: source)
87            layer.sourceLayerIdentifier = "building"
88            layer.fillExtrusionBase = NSExpression(forConstantValue: 20)
89            layer.fillExtrusionHeight = NSExpression(forConstantValue: 50)
90            // Set the fill color to that of the existing building footprint layer, if it exists.
91            layer.fillExtrusionColor = NSExpression(forConstantValue: UIColor.red)
92            layer.fillExtrusionOpacity = NSExpression(forConstantValue: 0.75)
93            self.nbMapView.style?.addLayer(layer)
94            
95            
96        }
97        let camera = NGLMapCamera(lookingAtCenter: CLLocationCoordinate2DMake(12.98780156, 77.59956748),
98                                  acrossDistance:600,
99                                  pitch:50,
100                                  heading:0)
101        nbMapView.fly(to: camera, withDuration: 2)
102    }
103    
104    
105    func styleWaterWithFunction() {
106        
107        let waterLayer = self.nbMapView.style?.layer(withIdentifier: "water") as? NGLFillStyleLayer
108        let waterColorStops: [NSNumber: UIColor] = [
109            6.0: UIColor.yellow,
110            8.0: UIColor.blue,
111            10.0: UIColor.red,
112            12.0: UIColor.green,
113            14.0: UIColor.blue
114        ]
115        let fillColorExpression = NSExpression(format: "ngl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", waterColorStops)
116        
117        waterLayer?.fillColor = fillColorExpression
118        
119        let fillAntialiasedStops: [NSNumber: Any] = [
120            11: true,
121            12: false,
122            13: true,
123            14: false,
124            15: true
125        ]
126        waterLayer?.fillAntialiased = NSExpression(forNGLStepping: .zoomLevelVariable, from: NSExpression(forConstantValue: false), stops: NSExpression(forConstantValue: fillAntialiasedStops))
127        
128    }
129    
130    func styleRoadsWithFunction() {
131        
132        let roadLayer = self.nbMapView.style?.layer(withIdentifier: "road_primary") as? NGLLineStyleLayer
133        roadLayer?.lineColor = NSExpression(forConstantValue: UIColor.black)
134        
135        let lineWidthStops: [NSNumber: NSNumber] = [
136            5: 5,
137            10: 10,
138            15: 15
139        ]
140        let lineWidthExpression = NSExpression(format: "ngl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", lineWidthStops)
141        roadLayer?.lineWidth = lineWidthExpression
142        roadLayer?.lineGapWidth = lineWidthExpression
143        
144        let roadLineColorStops: [NSNumber: UIColor] = [
145            5: UIColor.purple,
146            10: UIColor.purple,
147            13: UIColor.yellow,
148            16: UIColor.cyan
149        ]
150        roadLayer?.lineColor = NSExpression(format: "ngl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)", roadLineColorStops)
151        
152        roadLayer?.isVisible = true
153        
154    }
155}
156extension StyleMapLayerViewController: NGLMapViewDelegate {
157    func mapView(_ mapView: NGLMapView, didFinishLoading style: NGLStyle){
158        
159        nbMapView.setCenter(CLLocationCoordinate2DMake(12.97780156, 77.59656748), zoomLevel: 10, animated: true)
160        
161    }
162}
163extension StyleMapLayerViewController: UITableViewDelegate, UITableViewDataSource {
164    
165    func settingsTitlesForRaw(index: Int) -> String {
166        let type = typeList[index]
167        switch type {
168        case ActionType.StyleBuildingExtrusions :
169            return "Style Building Extrusions"
170        case ActionType.StyleWaterWithFunction :
171            return "Style Water with function"
172        case ActionType.StyleRoadsWithFunction :
173            return "Style Roads with function"
174        case ActionType.AddBuildingExtrusions :
175            return "Add Building Extrusions"
176        }
177    }
178    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
179        return typeList.count
180    }
181    
182    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
183        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
184        cell.textLabel?.text = settingsTitlesForRaw(index: indexPath.row)
185        return cell
186    }
187    
188    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
189        tableView.isHidden = true
190        let type = typeList[indexPath.row]
191        dismissSettings(type: type)
192    }
193    
194    func dismissSettings(type: ActionType) {
195        dismiss(animated: true)
196        performeSettings(type: type)
197    }
198}
  1. Initializing mapView: The nbMapView property is initialized in the viewDidLoad() method. It creates an instance of NGLMapView and sets it as the main view of the view controller.

  2. styleBuildingExtrusions() method: This method is called when the "Style Building Extrusions" option is selected. It retrieves the “building-3d” layer from the map style and sets the fill extrusion color and opacity. It also sets the map center and zoom level.

  3. addBuildingExtrusions() method: This method is called when the "Add Building Extrusions" option is selected. It adds a new NGLFillExtrusionStyleLayer to the map style with a source identifier of "openmaptiles". It sets the fill extrusion base and height, fill extrusion color, and opacity. It also sets a specific map camera position for animation.

  4. styleWaterWithFunction() method: This method is called when the "Style Water with function" option is selected. It retrieves the “water” layer from the map style and sets the fill color using an interpolation function based on the zoom level. It also sets the fill antialiased property using a stepped interpolation.

  5. styleRoadsWithFunction() method: This method is called when the "Style Roads with function" option is selected. It retrieves the “road_primary” layer from the map style and sets the line color using an interpolation function based on the zoom level. It also sets the line width and line gap width using an interpolation function. Additionally, it sets the layer's visibility to true.

DIDN'T FIND WHAT YOU LOOKING FOR?