Set the map view to a new viewpoint.
Use case
Programmatically navigate to a specified location in the map or scene. Use this to focus on a particular point or area of interest.
How to use the sample
The map view has several methods for setting its current viewpoint. Select a viewpoint from the UI to see the viewpoint changed using that method.
How it works
- Create an
AGSMap
object and set it to theAGSMapView
object. - Change the map's viewpoint using one of the available methods:
- Use
AGSMapView.setViewpoint(_:duration:curve:completion:)
to pan to a viewpoint over the specified length of time. - Use
AGSMapView.setViewpointCenter(_:scale:completion:)
to center the viewpoint on anAGSPoint
and set a distance from the ground using a scale. - Use
AGSMapView.setViewpointGeometry(_:padding:completion:)
to set the viewpoint to a givenAGSGeometry
.
- Use
Relevant API
- AGSGeometry
- AGSMap
- AGSMapView
- AGSPoint
- AGSViewpoint
Additional information
See the various setViewpoint methods on AGSGeoView
and AGSMapViewCommon
.
- AGSGeoView.setViewpoint(_:)
- AGSGeoView.setViewpoint(_:completion:)
- AGSGeoView.setViewpoint(_:duration:completion:)
- AGSMapViewCommon.setViewpoint(_:duration:curve:completion:)
- AGSMapViewCommon.setViewpointCenter(_:completion:)
- AGSMapViewCommon.setViewpointCenter(_:scale:completion:)
- AGSMapViewCommon.setViewpointGeometry(_:completion:)
- AGSMapViewCommon.setViewpointGeometry(_:padding:completion:)
- AGSMapViewCommon.setViewpointRotation(_:completion:)
- AGSMapViewCommon.setViewpointScale(_:completion:)
Tags
animate, extent, pan, rotate, scale, view, zoom
Sample Code
SetViewpointViewController.swift
// Copyright 2016 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
class SetViewpointViewController: UIViewController {
@IBOutlet private weak var mapView: AGSMapView!
@IBOutlet private weak var segmentedControl: UISegmentedControl!
private var map: AGSMap!
private var griffithParkGeometry: AGSPolygon!
private var londonCoordinate: AGSPoint!
override func viewDidLoad() {
super.viewDidLoad()
// initialize the map with imagery basemap
self.map = AGSMap(basemapStyle: .arcGISImagery)
// assign the map to the mapview
self.mapView.map = self.map
// create a graphicsOverlay to show the graphics
let graphicsOverlay = AGSGraphicsOverlay()
self.londonCoordinate = AGSPoint(x: 0.1275, y: 51.5072, spatialReference: .wgs84())
if let griffithParkGeometry = geometryFromTextFile(filename: "GriffithParkJson") {
self.griffithParkGeometry = griffithParkGeometry as? AGSPolygon
let griffithParkSymbol = AGSSimpleFillSymbol(style: AGSSimpleFillSymbolStyle.solid, color: UIColor(red: 0, green: 0.5, blue: 0, alpha: 0.7), outline: nil)
let griffithParkGraphic = AGSGraphic(geometry: griffithParkGeometry, symbol: griffithParkSymbol, attributes: nil)
graphicsOverlay.graphics.add(griffithParkGraphic)
}
self.mapView.graphicsOverlays.add(graphicsOverlay)
(self.navigationItem.rightBarButtonItem as! SourceCodeBarButtonItem).filenames = ["SetViewpointViewController"]
}
private func geometryFromTextFile(filename: String) -> AGSGeometry? {
if let fileURL = Bundle.main.url(forResource: filename, withExtension: "txt"),
let data = try? Data(contentsOf: fileURL),
let jsonObject = try? JSONSerialization.jsonObject(with: data),
let geometry = try? AGSGeometry.fromJSON(jsonObject) {
return geometry as? AGSGeometry
}
return nil
}
// MARK: - Actions
@IBAction private func valueChanged(_ control: UISegmentedControl) {
switch control.selectedSegmentIndex {
case 0:
self.mapView.setViewpointGeometry(self.griffithParkGeometry, padding: 50, completion: nil)
case 1:
self.mapView.setViewpointCenter(self.londonCoordinate, scale: 40000, completion: nil)
case 2:
let currentScale = self.mapView.mapScale
let targetScale = currentScale / 2.5 // zoom in
let currentCenter = self.mapView.visibleArea!.extent.center
self.mapView.setViewpoint(AGSViewpoint(center: currentCenter, scale: targetScale), duration: 5, curve: AGSAnimationCurve.easeInOutSine) { (finishedWithoutInterruption) in
if finishedWithoutInterruption {
self.mapView.setViewpoint(AGSViewpoint(center: currentCenter, scale: currentScale), duration: 5, curve: .easeInOutSine)
}
}
default:
print("Never should get here")
}
}
}