Change the style of a Web Map Service (WMS) layer.
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
- Create an
AGSWMSLayer
specifying the URL of the service and the layer names you want. - When the layer is done loading, get its array of
AGSWMSSublayer
s. - Change the current style of the
AGSWMSSublayer
to one of the styles from itsstyles
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
//
// 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]
}
}