Layers

Maps and scenes use a collection of layers to display geographic data from a variety of sources and formats. These can include several basemap layers and data layers from online or local sources.

Each layer in a map references geographic data, either from an online service or from a local dataset. There are a variety of layers that can be added to a map, each designed to display a particular type of data. Some layers display images, such as satellite photos or aerial photography, others are composed of a collection of features to represent real-world entities using point, line, or polygon geometries. In addition to geometry, features have attributes that provide details about the entity it represents.

Basemap layers

A basemap layer is a layer that provides the overall visual context for a map or scene. It typically contains geographic features such as continents, lakes, administrative boundaries, streets, cities, and place names. These features are represented with different styles provided by the basemap layer service such as streets, topographic, and imagery. The style you choose depends on the type of application and the visualization you would like to create.

A basemap layer provides the visual foundation for a mapping application. It typically contains data with global coverage and is the first layer added to a map or scene. The main data source for a basemap layer is the basemap layer service. When a view displays a map, a basemap layer is the first layer to draw, followed by data layers, and then graphics.

The Basemap layer service provides a number of vector tile and image tile basemap layers that you can use to build different types of mapping applications. Each of the basemap layer styles is defined in an enumeration. For example, you can use the Navigation style to create an application that supports driving directions, or you can use Imagery to create an application that displays a real-world view of the earth.

Add a vector tile basemap
                                                                                                                                  
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Fix blank line

Map_data_layers_example::Map_data_layers_example(QObject* parent /* = nullptr */):
  QObject(parent),
  m_map(new Map(BasemapStyle::ArcGISTopographic, this))
{
  const QString api_key = QStringLiteral("YOUR_API_KEY");
  ArcGISRuntimeEnvironment::setApiKey(api_key);

  FeatureLayer* trailheadsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* trailsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* openSpacesLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space_Styled/FeatureServer/0"), this),
      this
  );

  m_map->operationalLayers()->append(trailheadsLayer);
  m_map->operationalLayers()->append(trailsLayer);
  m_map->operationalLayers()->append(openSpacesLayer);
}

Scene_data_layers_example::Scene_data_layers_example(QObject* parent /* = nullptr */):
  QObject(parent),
  m_scene(new Scene(Basemap::topographic(this), this))
{
  const QString api_key = QStringLiteral("YOUR_API_KEY");
  ArcGISRuntimeEnvironment::setApiKey(api_key);

  FeatureLayer* trailheadsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* trailsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* openSpacesLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space_Styled/FeatureServer/0"), this),
      this
  );

  m_scene->operationalLayers()->append(trailheadsLayer);
  m_scene->operationalLayers()->append(trailsLayer);
  m_scene->operationalLayers()->append(openSpacesLayer);
}


// ----- Basemap -----//

ArcGISRuntimeEnvironment::setApiKey("YOUR_API_KEY");
Basemap* basemap = new Basemap(BasemapStyle::ArcGISNavigation, this);
// Basemap* basemap = new Basemap(BasemapStyle::ArcGISTopographic, this);
// Basemap* basemap = new Basemap(BasemapStyle::ArcGISLightGray, this);



ArcGISRuntimeEnvironment::setApiKey("YOUR_API_KEY");
Basemap* basemap = new Basemap(BasemapStyle::ArcGISImageryStandard, this);


// -- ENC --


// get EncDisplaySettings instance
EncDisplaySettings* displaySettings = EncEnvironmentSettings::displaySettings();

// set paths
EncEnvironmentSettings::setSencDataPath(sencDataPath);
EncEnvironmentSettings::setResourcePath(resourcePath);


// create EncExchangeSet using paths
EncExchangeSet* encExchangeSet = new EncExchangeSet(paths, parent);

// get the list of EncDataset
QList EncDatasets = encExchangeSet->datasets();

// display the names of EncDataset
for (EncDataset* EncDataset: EncDatasets)
{
  qDebug() << EncDataset->name();
}


// get ENC text group visibility settings object
EncTextGroupVisibilitySettings* encTextGroupVisibilitySettings = EncEnvironmentSettings::displaySettings()->textGroupVisibilitySettings();

// set properties
encTextGroupVisibilitySettings->setImportantText(false);
encTextGroupVisibilitySettings->setNatureOfSeabed(false);


connect(m_mapView, &MapQuickView::mousePressedAndHeld, [this](QMouseEvent& mouseEvent)
{
  double tolerance = 5.0;
  bool returnPopupsOnly = false;
  int maximumResults = 5;
  m_mapView->identifyLayers(mouseEvent.x(), mouseEvent.y(), tolerance, returnPopupsOnly, maximumResults);
});


connect(m_mapView, &MapQuickView::identifyLayersCompleted, [this](QUuid taskId, QList identifyResults)
{
  Q_UNUSED(taskId);
  for (int i = 0; i < identifyResults.size(); i++)
  {
    EncLayer* encLayer = dynamic_cast(identifyResults.at(i)->layerContent());
    if (encLayer)
    {
      qDebug() << "EncFeatures identified in EncLayer #" << i << ":";
      QListobjects = identifyResults.at(i)->geoElements();
      for (int j = 0; j < objects.size(); j++)
      {
        EncFeature* encFeature = dynamic_cast(objects.at(j));
        if (encFeature)
        {
          qDebug() << "Found EncFeature: " << encFeature->description();
          QVariantMap map = encFeature->attributes()->attributesMap();
          qDebug() << " - Attributes: " << map;
        }
      }
    }
  }
});
Add an image tile basemap
                                                                                                                                  
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Fix blank line

Map_data_layers_example::Map_data_layers_example(QObject* parent /* = nullptr */):
  QObject(parent),
  m_map(new Map(BasemapStyle::ArcGISTopographic, this))
{
  const QString api_key = QStringLiteral("YOUR_API_KEY");
  ArcGISRuntimeEnvironment::setApiKey(api_key);

  FeatureLayer* trailheadsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* trailsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* openSpacesLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space_Styled/FeatureServer/0"), this),
      this
  );

  m_map->operationalLayers()->append(trailheadsLayer);
  m_map->operationalLayers()->append(trailsLayer);
  m_map->operationalLayers()->append(openSpacesLayer);
}

Scene_data_layers_example::Scene_data_layers_example(QObject* parent /* = nullptr */):
  QObject(parent),
  m_scene(new Scene(Basemap::topographic(this), this))
{
  const QString api_key = QStringLiteral("YOUR_API_KEY");
  ArcGISRuntimeEnvironment::setApiKey(api_key);

  FeatureLayer* trailheadsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* trailsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* openSpacesLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space_Styled/FeatureServer/0"), this),
      this
  );

  m_scene->operationalLayers()->append(trailheadsLayer);
  m_scene->operationalLayers()->append(trailsLayer);
  m_scene->operationalLayers()->append(openSpacesLayer);
}


// ----- Basemap -----//

ArcGISRuntimeEnvironment::setApiKey("YOUR_API_KEY");
Basemap* basemap = new Basemap(BasemapStyle::ArcGISNavigation, this);
// Basemap* basemap = new Basemap(BasemapStyle::ArcGISTopographic, this);
// Basemap* basemap = new Basemap(BasemapStyle::ArcGISLightGray, this);



ArcGISRuntimeEnvironment::setApiKey("YOUR_API_KEY");
Basemap* basemap = new Basemap(BasemapStyle::ArcGISImageryStandard, this);


// -- ENC --


// get EncDisplaySettings instance
EncDisplaySettings* displaySettings = EncEnvironmentSettings::displaySettings();

// set paths
EncEnvironmentSettings::setSencDataPath(sencDataPath);
EncEnvironmentSettings::setResourcePath(resourcePath);


// create EncExchangeSet using paths
EncExchangeSet* encExchangeSet = new EncExchangeSet(paths, parent);

// get the list of EncDataset
QList EncDatasets = encExchangeSet->datasets();

// display the names of EncDataset
for (EncDataset* EncDataset: EncDatasets)
{
  qDebug() << EncDataset->name();
}


// get ENC text group visibility settings object
EncTextGroupVisibilitySettings* encTextGroupVisibilitySettings = EncEnvironmentSettings::displaySettings()->textGroupVisibilitySettings();

// set properties
encTextGroupVisibilitySettings->setImportantText(false);
encTextGroupVisibilitySettings->setNatureOfSeabed(false);


connect(m_mapView, &MapQuickView::mousePressedAndHeld, [this](QMouseEvent& mouseEvent)
{
  double tolerance = 5.0;
  bool returnPopupsOnly = false;
  int maximumResults = 5;
  m_mapView->identifyLayers(mouseEvent.x(), mouseEvent.y(), tolerance, returnPopupsOnly, maximumResults);
});


connect(m_mapView, &MapQuickView::identifyLayersCompleted, [this](QUuid taskId, QList identifyResults)
{
  Q_UNUSED(taskId);
  for (int i = 0; i < identifyResults.size(); i++)
  {
    EncLayer* encLayer = dynamic_cast(identifyResults.at(i)->layerContent());
    if (encLayer)
    {
      qDebug() << "EncFeatures identified in EncLayer #" << i << ":";
      QListobjects = identifyResults.at(i)->geoElements();
      for (int j = 0; j < objects.size(); j++)
      {
        EncFeature* encFeature = dynamic_cast(objects.at(j));
        if (encFeature)
        {
          qDebug() << "Found EncFeature: " << encFeature->description();
          QVariantMap map = encFeature->attributes()->attributesMap();
          qDebug() << " - Attributes: " << map;
        }
      }
    }
  }
});

Data layers

A data layer, also known as an operational layer, is a layer that can access geographic data from a data source. You use a data layer to display geographic data on top of a basemap layer in a map or scene. The data source for the layer can be a data service or a file such as a shapefile or GeoPackage.

A data layer provides access to geographic data that is displayed in a map or scene. Each layer references a file or service data source. The data source contains either as vector data (points, lines, polygons and attributes) or raster data (images). Different types of layers can access and display different types of data.

The data for a data layer is typically stored in the ArcGIS Platform as a data service. You can use feature services, vector tile services, and image tile services to host your data. Learn more in Data hosting.

A data layer can also be created from a dataset stored on the device. For example, data stored in a shapefile, mobile map package, or geodatabase. Learn more about using offline data in Offline maps, scenes, and data.

To add a data layer to a map or scene, you typically add imagery or tile layers first, and then polygons, lines, and points layers last. A map or scene controls the order of the layers, and the map or scene view combines the layers to create the final display.

Add data layers to a map
                                                                                                                                  
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Fix blank line

Map_data_layers_example::Map_data_layers_example(QObject* parent /* = nullptr */):
  QObject(parent),
  m_map(new Map(BasemapStyle::ArcGISTopographic, this))
{
  const QString api_key = QStringLiteral("YOUR_API_KEY");
  ArcGISRuntimeEnvironment::setApiKey(api_key);

  FeatureLayer* trailheadsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* trailsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* openSpacesLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space_Styled/FeatureServer/0"), this),
      this
  );

  m_map->operationalLayers()->append(trailheadsLayer);
  m_map->operationalLayers()->append(trailsLayer);
  m_map->operationalLayers()->append(openSpacesLayer);
}

Scene_data_layers_example::Scene_data_layers_example(QObject* parent /* = nullptr */):
  QObject(parent),
  m_scene(new Scene(Basemap::topographic(this), this))
{
  const QString api_key = QStringLiteral("YOUR_API_KEY");
  ArcGISRuntimeEnvironment::setApiKey(api_key);

  FeatureLayer* trailheadsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* trailsLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails_Styled/FeatureServer/0"), this),
      this
  );
  FeatureLayer* openSpacesLayer = new FeatureLayer(
      new ServiceFeatureTable(QUrl("https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space_Styled/FeatureServer/0"), this),
      this
  );

  m_scene->operationalLayers()->append(trailheadsLayer);
  m_scene->operationalLayers()->append(trailsLayer);
  m_scene->operationalLayers()->append(openSpacesLayer);
}


// ----- Basemap -----//

ArcGISRuntimeEnvironment::setApiKey("YOUR_API_KEY");
Basemap* basemap = new Basemap(BasemapStyle::ArcGISNavigation, this);
// Basemap* basemap = new Basemap(BasemapStyle::ArcGISTopographic, this);
// Basemap* basemap = new Basemap(BasemapStyle::ArcGISLightGray, this);



ArcGISRuntimeEnvironment::setApiKey("YOUR_API_KEY");
Basemap* basemap = new Basemap(BasemapStyle::ArcGISImageryStandard, this);


// -- ENC --


// get EncDisplaySettings instance
EncDisplaySettings* displaySettings = EncEnvironmentSettings::displaySettings();

// set paths
EncEnvironmentSettings::setSencDataPath(sencDataPath);
EncEnvironmentSettings::setResourcePath(resourcePath);


// create EncExchangeSet using paths
EncExchangeSet* encExchangeSet = new EncExchangeSet(paths, parent);

// get the list of EncDataset
QList EncDatasets = encExchangeSet->datasets();

// display the names of EncDataset
for (EncDataset* EncDataset: EncDatasets)
{
  qDebug() << EncDataset->name();
}


// get ENC text group visibility settings object
EncTextGroupVisibilitySettings* encTextGroupVisibilitySettings = EncEnvironmentSettings::displaySettings()->textGroupVisibilitySettings();

// set properties
encTextGroupVisibilitySettings->setImportantText(false);
encTextGroupVisibilitySettings->setNatureOfSeabed(false);


connect(m_mapView, &MapQuickView::mousePressedAndHeld, [this](QMouseEvent& mouseEvent)
{
  double tolerance = 5.0;
  bool returnPopupsOnly = false;
  int maximumResults = 5;
  m_mapView->identifyLayers(mouseEvent.x(), mouseEvent.y(), tolerance, returnPopupsOnly, maximumResults);
});


connect(m_mapView, &MapQuickView::identifyLayersCompleted, [this](QUuid taskId, QList identifyResults)
{
  Q_UNUSED(taskId);
  for (int i = 0; i < identifyResults.size(); i++)
  {
    EncLayer* encLayer = dynamic_cast(identifyResults.at(i)->layerContent());
    if (encLayer)
    {
      qDebug() << "EncFeatures identified in EncLayer #" << i << ":";
      QListobjects = identifyResults.at(i)->geoElements();
      for (int j = 0; j < objects.size(); j++)
      {
        EncFeature* encFeature = dynamic_cast(objects.at(j));
        if (encFeature)
        {
          qDebug() << "Found EncFeature: " << encFeature->description();
          QVariantMap map = encFeature->attributes()->attributesMap();
          qDebug() << " - Attributes: " << map;
        }
      }
    }
  }
});

Layer types

You can use different types of data layers to access and display different types of data in your applications. Data layers can access ArcGIS data sources and other types of data sources such as OGC data and files.

Different data layers provide different types of functionality. The functionality available is largely dependent on the capabilities of the data source. For example, a feature layer can access a feature service and perform queries, edits, and data export, whereas a vector tile layer can only access tiles from a vector tile service.

The Layer class is the base class for all types of layers used in ArcGIS Runtime. The type of layer you create depends on the type of data you want to display. To display feature data (point, line, or polygon geometry), for example, you can create a FeatureLayer that points to an online service (such as a feature service) or a supported local dataset. The tables below summarizes common types of layers available for your ArcGIS Runtime app.

ArcGIS data layers

The following layers work with ArcGIS data sources.

LayerData typeDisplayQueryEditOfflineData sources
AnnotationLayerFeature2DTrueTrueTrueFeature service
ArcGISMapImageLayerImage2D/3DFalseFalseTrueMap service (Offline requires local server)
ArcGISSceneLayerI3S3DFalseFalseTrueScene service
ArcGISTiledLayerImage Tile2D/3DFalseFalseTrueTile service, tile package (.tpk/.tpkx)
ArcGISVectorTiledLayerVector Tile2DFalseFalseTrueVector tile service, vector tile package (.vtpk)
FeatureCollectionLayerFeature2D/3DTrueTrueTruePortal item, web map, feature set / query result
FeatureLayerFeature2D/3DTrueTrueTrue  Online sources:
    OgcFeatureCollectionTable
    ServiceFeatureTable
    WfsFeatureTable
  Offline sources:
    GeodatabaseFeatureTable
    GeoPackageFeatureTable
    ShapefileFeatureTable
IntegratedMeshLayerI3S3DFalseFalseTrueScene service, mobile scene package
PointCloudLayerI3S3DFalseFalseTrueScene service, mobile scene package
RasterLayerRaster2D/3DFalseFalseTrue  Raster files - path to a file on the device,
    see Raster Class.
  Remote ArcGIS Image services,
    see ImageServiceRaster.
  Raster files within GeoPackages,
    see GeoPackageRaster.
  Mosaic datasets,
    see MosaicDatasetRaster.

OGC data layers

The following layers work with OGC data sources.

LayerData typeDisplayQueryEditOfflineData sources
FeatureLayerFeature2D/3DTrueTrueTrueWFS, GeoPackage
RasterLayerRaster2D/3DTrueFalseTrueGeoPackage
KmlLayerFeature/Image2D/3DTrueTrueTrueKML file (.kml, .kmz)
WmsLayerImage2D/3DFalseFalseFalseWMS service
WmtsLayerImage Tile2D/3DFalseFalseFalseWMTS service

Other data layers

The following layers work with non-ArcGIS data sources.

LayerData typeDisplayQueryEditOfflineData sources
OpenStreetMapLayerVector Tile2D/3DFalseFalseTrueOSM Vector tile service
ArcGISVectorTiledLayerVector Tile2DFalseFalseFalseVector tile service (Mapbox specification)
WebTiledLayerImage Tile2D/3DFalseFalseFalse{level},{row},{col} Image tile service
RasterLayerRaster2D/3DFalseFalseFalseRaster files e.g. GeoTiff, Mr. Sid
EncLayerBinary (SENC)2DFalseFalseTrueENC exchange set
BingMapsLayerImage Tile2D/3DFalseFalseFalseBing maps service

Use API keys

An API key can be used to authorize access to ArcGIS Online services and resources from your app, as well as to monitor access to those services. You can use a single API key for all requests made by your app, or assign individual keys for classes that expose an API key property. Refer to API keys in the security and authentication topic for details.

Tutorials

Samples

Services

Next steps

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