Skip to content

Apply style to WMS layer

View on GitHub

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

Image of Apply style to WMS layer 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, the toggle button will be enabled. Click it to toggle between the first and second styles of the WMS layer.

How it works

  1. Create a WMS layer with the URL of the service and the names of the layers you want using WMSLayer.init(url:layerNames:).
  2. When the layer is done loading, get its list of style strings using WMSLayerInfo.styles.
  3. Set one of the styles using WMSSublayer.currentStyle.

Relevant API

  • WMSLayer
  • WMSSublayer
  • WMSSublayerInfo

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

ApplyStyleToWMSLayerView.swift
Use dark colors for code blocksCopy
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
// Copyright 2025 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
//
//   https://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 ArcGIS
import SwiftUI

struct ApplyStyleToWMSLayerView: View {
    /// The map displayed by the map view.
    @State private var map: Map = {
        let map = Map(spatialReference: SpatialReference(wkid: .init(26915)!))
        map.minScale = 7_000_000
        return map
    }()
    /// The viewpoint of the map view.
    @State private var viewpoint: Viewpoint?

    /// A WMS layer with multiple styles.
    @State private var wmsSublayer: WMSSublayer?
    /// The error thrown by the WMS sublayer load operation.
    @State private var wmsSublayerLoadError: Error?

    /// The styles of the WMS layer.
    @State private var styles: [String] = []
    /// The current style.
    @State private var selectedStyle = ""

    var body: some View {
        // Display the map in a map view.
        MapView(map: map, viewpoint: viewpoint)
            .onViewpointChanged(kind: .centerAndScale) { newViewpoint in
                viewpoint = newViewpoint
            }
            .task {
                // Create the WMS layer and add it to the map.
                let wmsLayer = WMSLayer(
                    url: URL(string: "https://imageserver.gisdata.mn.gov/cgi-bin/mncomp?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities")!,
                    layerNames: ["mncomp"]
                )
                map.addOperationalLayer(wmsLayer)
                // Load the WMS layer to get the styles.
                do {
                    try await wmsLayer.load()
                    viewpoint = wmsLayer.fullExtent.map { Viewpoint(boundingGeometry: $0) }
                    wmsSublayer = wmsLayer.sublayers.first as? WMSSublayer
                    styles = wmsLayer.layerInfos.first?.styles ?? []
                    selectedStyle = styles.first ?? ""
                } catch {
                    wmsSublayerLoadError = error
                }
            }
            .toolbar {
                ToolbarItem(placement: .bottomBar) {
                    Picker("Style", selection: $selectedStyle) {
                        ForEach(styles, id: \.self) { style in
                            let title = switch style {
                            case "default": "Default"
                            case "stretch": "Contrast Stretch"
                            default: "Unknown"
                            }
                            Text(title)
                                .tag(style)
                        }
                    }
                    .pickerStyle(.segmented)
                    .onChange(of: selectedStyle) {
                        wmsSublayer?.currentStyle = selectedStyle
                    }
                }
            }
            .errorAlert(presentingError: $wmsSublayerLoadError)
    }
}

#Preview {
    ApplyStyleToWMSLayerView()
}

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