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 a new ArcGISMapViewwith anArcGISMapViewController, and assign anArcGISMapto theArcGISMapViewController.arcGISMapproperty.
- Change the map's Viewpointusing one of the available methods:
- Use ArcGISMapViewController.setViewpointGeometry()to set the viewpoint to a givenGeometry.
- Use ArcGISMapViewController.setViewpointCenter()to center the viewpoint on aArcGISPointand set a distance from the ground using a scale.
- Use ArcGISMapViewController.setViewpointAnimated()to pan to a viewpoint over the specified length of time.
Relevant API
- ArcGISMap
- ArcGISMapView
- ArcGISPoint
- Geometry
- Viewpoint
Additional information
Below are some other ways to set a viewpoint:
- ArcGISMapViewController.setViewpoint
- ArcGISMapViewController.setViewpointRotation
- ArcGISMapViewController.setViewpointScale
- ArcGISMapViewController.setViewpointWithDurationAndCurve
Tags
animate, extent, pan, rotate, scale, view, zoom
Sample Code
change_viewpoint.dart
// Copyright 2024 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 'package:arcgis_maps/arcgis_maps.dart';
import 'package:arcgis_maps_sdk_flutter_samples/common/common.dart';
import 'package:flutter/material.dart';
class ChangeViewpoint extends StatefulWidget {
  const ChangeViewpoint({super.key});
  @override
  State<ChangeViewpoint> createState() => _ChangeViewpointState();
}
class _ChangeViewpointState extends State<ChangeViewpoint>
    with SampleStateSupport {
  // Create a controller for the map view.
  final _mapViewController = ArcGISMapView.createController();
  // Define the Redlands polygon.
  late PolygonBuilder _redlandsEnvelope;
  // Define the Edinburgh polygon.
  late PolygonBuilder _edinburghEnvelope;
  // String array to store titles for the viewpoints specified above.
  final _viewpointTitles = ['Geometry', 'Center & Scale', 'Animate'];
  // Create variable for holding state relating to the viewpoint.
  String? _selectedViewpoint;
  // Define an envelope that can navigate to the full extent.
  Envelope? _fullExtent;
  // A flag for when the map view is ready and controls can be used.
  var _ready = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        top: false,
        left: false,
        right: false,
        child: Stack(
          children: [
            Column(
              children: [
                Expanded(
                  // Add a map view to the widget tree and set a controller.
                  child: ArcGISMapView(
                    controllerProvider: () => _mapViewController,
                    onMapViewReady: onMapViewReady,
                  ),
                ),
                // Build the bottom menu.
                buildBottomMenu(),
              ],
            ),
            // Display a progress indicator and prevent interaction until state is ready.
            LoadingIndicator(visible: !_ready),
          ],
        ),
      ),
    );
  }
  Future<void> onMapViewReady() async {
    // Create new Map with basemap and initial location.
    final map = ArcGISMap.withBasemapStyle(BasemapStyle.arcGISTopographic);
    // Assign the map to the ArcGISMapView.
    _mapViewController.arcGISMap = map;
    // Load the map so that we get the full extent.
    await map.load();
    _fullExtent = map.basemap!.baseLayers.first.fullExtent;
    // Coordinates for Redlands.
    _redlandsEnvelope = PolygonBuilder(
      spatialReference: SpatialReference.webMercator,
    );
    _redlandsEnvelope.addPointXY(x: -13049785.1566222, y: 4032064.6003424);
    _redlandsEnvelope.addPointXY(x: -13049785.1566222, y: 4040202.42595729);
    _redlandsEnvelope.addPointXY(x: -13037033.5780234, y: 4032064.6003424);
    _redlandsEnvelope.addPointXY(x: -13037033.5780234, y: 4040202.42595729);
    // Coordinates for Edinburgh.
    _edinburghEnvelope = PolygonBuilder(
      spatialReference: SpatialReference.webMercator,
    );
    _edinburghEnvelope.addPointXY(x: -354262.156621384, y: 7548092.94093301);
    _edinburghEnvelope.addPointXY(x: -354262.156621384, y: 7548901.50684376);
    _edinburghEnvelope.addPointXY(x: -353039.164455303, y: 7548092.94093301);
    _edinburghEnvelope.addPointXY(x: -353039.164455303, y: 7548901.50684376);
    // Set the ready state variable to true to enable the sample UI.
    setState(() => _ready = true);
  }
  Widget buildBottomMenu() {
    return Center(
      // A drop down menu for selecting viewpoint.
      child: DropdownMenu(
        hintText: 'Choose a style',
        trailingIcon: const Icon(Icons.arrow_drop_down),
        textStyle: Theme.of(context).textTheme.labelMedium,
        initialSelection: _selectedViewpoint,
        dropdownMenuEntries: _viewpointTitles.map((items) {
          return DropdownMenuEntry(value: items, label: items);
        }).toList(),
        onSelected: (viewpoint) {
          if (viewpoint != null) {
            changeViewpoint(viewpoint);
          }
        },
      ),
    );
  }
  Future<void> changeViewpoint(String viewpoint) async {
    // Set the selected viewpoint.
    setState(() => _selectedViewpoint = viewpoint);
    switch (_selectedViewpoint) {
      case 'Geometry':
        // Set Viewpoint using Redlands envelope defined above and a padding of 20.
        await _mapViewController.setViewpointGeometry(
          _redlandsEnvelope.toGeometry(),
          paddingInDiPs: 20,
        );
      case 'Center & Scale':
        // Set Viewpoint so that it is centered on the London coordinates defined above.
        await _mapViewController.setViewpointCenter(
          ArcGISPoint(
            x: -13881.7678417696,
            y: 6710726.57374296,
            spatialReference: SpatialReference.webMercator,
          ),
          scale: 8762.7156655228955,
        );
      case 'Animate':
        if (_fullExtent != null) {
          // Navigate to full extent of the first baselayer before animating to specified geometry.
          _mapViewController.setViewpoint(
            Viewpoint.fromTargetExtent(_fullExtent!.extent),
          );
          // Set Viewpoint of ArcGISMapView to the Viewpoint created above and animate to it using a timespan of 5 seconds.
          await _mapViewController.setViewpointAnimated(
            Viewpoint.fromTargetExtent(_edinburghEnvelope.toGeometry()),
            duration: 5,
          );
        }
      default:
        throw StateError('Unknown viewpoint type');
    }
  }
}