Change viewpoint

View on GitHub
Sample viewer app

Set the map view to a new viewpoint.

Image of change viewpoint 1 Image of change viewpoint 2

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

  1. Create an AGSMap object and set it to the AGSMapView object.
  2. 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 an AGSPoint and set a distance from the ground using a scale.
    • Use AGSMapView.setViewpointGeometry(_:padding:completion:) to set the viewpoint to a given AGSGeometry.

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
                                                                                    
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
// 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")
        }
    }
}

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