Set a max extent on the map.

Use case
Limit the view of a map to a particular area by setting a max extent to constrain the user’s ability to pan or zoom away.
How to use the sample
The application loads with a map whose maximum extent has been set to the borders of Colorado. Note that you won’t be able to pan far from the Colorado border or zoom out beyond the minimum scale set by the max extent. Use the toggle switch to disable the max extent to freely pan/zoom around the map.
How it works
- Create a
Mapobject. - Create an
Envelopeof the Colorado extent. - Set the map to a
MapViewobject. - Set the maximum extent of the map to be the Colorado envelope with
Map::setMaxExtent(). - Set
MaxExtentto an empty envelope to disable the maximum extent of the map.
Relevant API
- Envelope
- Map
Tags
envelope, extent, limit panning, map, mapview, max extent, zoom
Sample Code
// [WriteFile Name=SetMaxExtent, Category=Maps]// [Legal]// Copyright 2022 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.// [Legal]
#ifdef PCH_BUILD#include "pch.hpp"#endif // PCH_BUILD
// sample headers#include "SetMaxExtent.h"
// ArcGIS Maps SDK headers#include "Envelope.h"#include "Graphic.h"#include "GraphicListModel.h"#include "GraphicsOverlay.h"#include "GraphicsOverlayListModel.h"#include "Map.h"#include "MapQuickView.h"#include "MapTypes.h"#include "SimpleLineSymbol.h"#include "SpatialReference.h"#include "SymbolTypes.h"
// Qt headers#include <QFuture>
using namespace Esri::ArcGISRuntime;
SetMaxExtent::SetMaxExtent(QObject* parent /* = nullptr */): QObject(parent), m_map(new Map(BasemapStyle::ArcGISStreets, this)){}
SetMaxExtent::~SetMaxExtent() = default;
void SetMaxExtent::init(){ // Register the map view for QML qmlRegisterType<MapQuickView>("Esri.Samples", 1, 0, "MapView"); qmlRegisterType<SetMaxExtent>("Esri.Samples", 1, 0, "SetMaxExtentSample");}
MapQuickView* SetMaxExtent::mapView() const{ return m_mapView;}
// Set the view (created in QML)void SetMaxExtent::setMapView(MapQuickView* mapView){ if (!mapView || mapView == m_mapView) return;
m_coloradoOverlay = new GraphicsOverlay(this); // Create an envelope to be used as the Colorado geometry m_coloradoEnvelope = Envelope(-12138232, 4441198, -11362327, 5012861, SpatialReference(3857));
m_mapView = mapView; m_mapView->setMap(m_map); m_mapView->graphicsOverlays()->append(m_coloradoOverlay); m_map->setMaxExtent(m_coloradoEnvelope); createExtentBorder();
emit mapViewChanged();}
void SetMaxExtent::createExtentBorder(){ m_coloradoOutline = new SimpleLineSymbol(SimpleLineSymbolStyle::Dash, QColor("red"), 3.0f, this); m_coloradoGraphic = new Graphic(m_coloradoEnvelope, m_coloradoOutline, this); m_coloradoOverlay->graphics()->append(m_coloradoGraphic);}
void SetMaxExtent::toggleMaxExtent(){ m_maxExtentEnabled ? m_maxExtentEnabled = false : m_maxExtentEnabled = true;
if (!m_maxExtentEnabled) { m_map->setMaxExtent(Envelope{}); } else { m_map->setMaxExtent(m_coloradoEnvelope); m_mapView->setViewpointGeometryAsync(m_coloradoEnvelope, 50); }}// [WriteFile Name=SetMaxExtent, Category=Maps]// [Legal]// Copyright 2022 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.// [Legal]
#ifndef SETMAXEXTENT_H#define SETMAXEXTENT_H
// ArcGIS Maps SDK headers#include "Envelope.h"
// Qt headers#include <QObject>
namespace Esri::ArcGISRuntime{class Envelope;class Graphic;class GraphicsOverlay;class Map;class MapQuickView;class SimpleLineSymbol;}
Q_MOC_INCLUDE("MapQuickView.h")
class SetMaxExtent : public QObject{ Q_OBJECT
Q_PROPERTY(Esri::ArcGISRuntime::MapQuickView* mapView READ mapView WRITE setMapView NOTIFY mapViewChanged)
public: explicit SetMaxExtent(QObject* parent = nullptr); ~SetMaxExtent();
static void init(); Q_INVOKABLE void toggleMaxExtent();
signals: void mapViewChanged();
private: Esri::ArcGISRuntime::MapQuickView* mapView() const; void setMapView(Esri::ArcGISRuntime::MapQuickView* mapView); void createExtentBorder();
Esri::ArcGISRuntime::Map* m_map = nullptr; Esri::ArcGISRuntime::MapQuickView* m_mapView = nullptr;
Esri::ArcGISRuntime::Graphic* m_coloradoGraphic = nullptr; Esri::ArcGISRuntime::GraphicsOverlay* m_coloradoOverlay = nullptr; Esri::ArcGISRuntime::Envelope m_coloradoEnvelope; Esri::ArcGISRuntime::SimpleLineSymbol* m_coloradoOutline = nullptr; bool m_maxExtentEnabled = true;};
#endif // SETMAXEXTENT_H// [WriteFile Name=SetMaxExtent, Category=Maps]// [Legal]// Copyright 2022 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.// [Legal]
import QtQuickimport QtQuick.Controlsimport QtQuick.Layoutsimport Esri.Samples
Item {
// add a mapView component MapView { id: view anchors.fill: parent
Component.onCompleted: { // Set and keep the focus on MapView to enable keyboard navigation forceActiveFocus(); } }
Rectangle { anchors { margins: 5 left: parent.left bottom: parent.bottom } width: childrenRect.width height: childrenRect.height color: "#D3D3D3" opacity: .75 radius: 3
ColumnLayout { Text { color: "#000000" text: "Max extent enabled" Layout.fillWidth: true Layout.margins: 3 font { weight: Font.DemiBold pointSize: 10 } } Switch { id: maxExtentSwitch checked: true onClicked: model.toggleMaxExtent(); } } }
// Declare the C++ instance which creates the map etc. and supply the view SetMaxExtentSample { id: model mapView: view }}// [Legal]// Copyright 2022 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.// [Legal]
// sample headers#include "SetMaxExtent.h"
// ArcGIS Maps SDK headers#include "ArcGISRuntimeEnvironment.h"
// Qt headers#include <QCommandLineParser>#include <QDir>#include <QGuiApplication>#include <QQmlApplicationEngine>
// Platform specific headers#ifdef Q_OS_WIN#include <Windows.h>#endif
int main(int argc, char *argv[]){ Esri::ArcGISRuntime::ArcGISRuntimeEnvironment::setUseLegacyAuthentication(false); QGuiApplication app(argc, argv); app.setApplicationName(QString("SetMaxExtent"));
// Use of ArcGIS location services, such as basemap styles, geocoding, and routing services, // requires an access token. For more information see // https://links.esri.com/arcgis-runtime-security-auth.
// The following methods grant an access token:
// 1. User authentication: Grants a temporary access token associated with a user's ArcGIS account. // To generate a token, a user logs in to the app with an ArcGIS account that is part of an // organization in ArcGIS Online or ArcGIS Enterprise.
// 2. API key authentication: Get a long-lived access token that gives your application access to // ArcGIS location services. Go to the tutorial at https://links.esri.com/create-an-api-key. // Copy the API Key access token.
const QString accessToken = QString("");
if (accessToken.isEmpty()) { qWarning() << "Use of ArcGIS location services, such as the basemap styles service, requires" << "you to authenticate with an ArcGIS account or set the API Key property."; } else { Esri::ArcGISRuntime::ArcGISRuntimeEnvironment::setApiKey(accessToken); }
// Initialize the sample SetMaxExtent::init();
// Initialize application view QQmlApplicationEngine engine; // Add the import Path engine.addImportPath(QDir(QCoreApplication::applicationDirPath()).filePath("qml"));
#ifdef ARCGIS_RUNTIME_IMPORT_PATH_2 engine.addImportPath(ARCGIS_RUNTIME_IMPORT_PATH_2);#endif
// Set the source engine.load(QUrl("qrc:/Samples/Maps/SetMaxExtent/main.qml"));
return app.exec();}// Copyright 2022 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 QtQuick.Controlsimport Esri.Samples
ApplicationWindow { visible: true width: 800 height: 600
SetMaxExtent { anchors.fill: parent }}