Style WMS layers

View on GitHub
Sample viewer app

Change the style of a Web Map Service (WMS) layer.

Style WMS layers sample

Use case

Layers hosted on WMS may have different pre-set styles available to apply to them. Swapping between these styles can help during visual examination of the data. For example, increasing the contrast of satellite images can help in identifying urban and agricultural areas within forested areas.

How to use the sample

Once the layer loads, tap the bottom two buttons to select a type of style.

How it works

  1. Create an AGSWMSLayer specifying the URL of the service and the layer names you want.
  2. When the layer is done loading, get its array of AGSWMSSublayers.
  3. Change the current style of the AGSWMSSublayer to one of the styles from its styles array.

Relevant API

  • AGSWMSLayer
  • AGSWMSSublayer
  • AGSWMSSublayerInfo

About the data

This sample uses a public service managed by the State of Minnesota and provides composite imagery for the state and the surrounding areas.

Tags

imagery, styles, visualization, WMS

Sample Code

StyleWebMapServiceLayerViewController.swift
                                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//
// Copyright © 2018 Esri.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

import UIKit
import ArcGIS

/// A view controller that manages the interface of the Style WMS Layers sample.
class StyleWebMapServiceLayerViewController: UIViewController {
    /// The map displayed in the map view.
    let map: AGSMap
    let layer: AGSWMSLayer
    var styles = [String]()

    /// The map view managed by the view controller.
    @IBOutlet weak var mapView: AGSMapView!
    @IBOutlet weak var segmentedControl: UISegmentedControl!

    required init?(coder aDecoder: NSCoder) {
        // Create the map.
        map = AGSMap()

        let wmsServiceURL = URL(string: "https://imageserver.gisdata.mn.gov/cgi-bin/mncomp?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities")!
        let layerNames = ["mncomp"]

        // Create the WMS layer and add it to the map.
        layer = AGSWMSLayer(url: wmsServiceURL, layerNames: layerNames)
        map.operationalLayers.add(layer)

        super.init(coder: aDecoder)

        // Load the WMS layer.
        layer.load { [weak self] (error) in
            if let error = error {
                self?.layerDidFailToLoad(with: error)
            } else {
                self?.layerDidLoad()
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        (self.navigationItem.rightBarButtonItem as! SourceCodeBarButtonItem).filenames = ["StyleWebMapServiceLayerViewController"]

        // Assign the map to the map view.
        mapView.map = map

        // The segmented control needs to be enabled here if the layer is
        // already loaded.
        updateSegmentedControlEnabledState()
    }

    /// Called in response to the layer loading successfully.
    func layerDidLoad() {
        guard let sublayer = layer.sublayers.firstObject as? AGSWMSSublayer else {
            return
        }
        styles = sublayer.sublayerInfo.styles
        // The segmented control needs to be enabled here if the view is already
        // loaded.
        updateSegmentedControlEnabledState()
    }

    /// Called in response to the layer failing to load. Presents an alert
    /// announcing the failure.
    ///
    /// - Parameter error: The error that caused loading to fail.
    func layerDidFailToLoad(with error: Error) {
        presentAlert(message: "Failed to load WMS layer")
    }

    /// Sets the enabled state of the segmented control based on whether there
    /// are multiple styles.
    func updateSegmentedControlEnabledState() {
        segmentedControl?.isEnabled = styles.count > 1
    }

    @IBAction func changeStyle(_ sender: UISegmentedControl) {
        let sublayer = layer.sublayers.firstObject as? AGSWMSSublayer
        sublayer?.currentStyle = styles[sender.selectedSegmentIndex]
    }
}

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.