Build a legend

View inC++QMLView on GitHubSample viewer app

Build a legend for all the operational layers in the map.

screenshot

Use case

Legends are used to describe what each symbol on a map represents. A common format is to show an image of the symbol alongside of a text description of what that symbol represents. This sample demonstrates how a simple legend can be built up in code using the LayerContent interface.

How to use the sample

  1. Open the sample
  2. Flick through the legend control to see the various elements that represent features on the map.

How it works

  1. Layers implement the LayerContent interface, which contain a list of LegendInfo. LegendInfo contains a Symbol and a name string. Layer::setAutoFetchLegendInfos must be called on each Layer instance to fetch the info from the data.
  2. Connect to the fetchLegendInfosCompleted signal and once completed use the LegendInfoListModel to build the legend.
  3. The names and images are then displayed next to each other in a list view.

Relevant API

  • Layer::setAutoFetchLegendInfos
  • LayerContent
  • LegendInfo
  • LegendInfoListModel

Tags

legend, legend info, symbol swatch, toolkit

Sample Code

BuildLegend.cppBuildLegend.cppBuildLegend.hBuildLegend.qml
Use dark colors for code blocksCopy
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
// [WriteFile Name=BuildLegend, Category=DisplayInformation]
// [Legal]
// 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.
// [Legal]

#ifdef PCH_BUILD
#include "pch.hpp"
#endif // PCH_BUILD

#include "BuildLegend.h"

#include "Map.h"
#include "MapQuickView.h"
#include "Basemap.h"
#include "ArcGISMapImageLayer.h"
#include "FeatureLayer.h"
#include "ServiceFeatureTable.h"

#include <QUrl>

using namespace Esri::ArcGISRuntime;

BuildLegend::BuildLegend(QQuickItem* parent) :
  QQuickItem(parent)
{
}

BuildLegend::~BuildLegend() = default;

void BuildLegend::init()
{
  qmlRegisterType<MapQuickView>("Esri.Samples", 1, 0, "MapView");
  qmlRegisterType<BuildLegend>("Esri.Samples", 1, 0, "BuildLegendSample");
  qmlRegisterUncreatableType<QAbstractListModel>("Esri.Samples", 1, 0, "AbstractListModel", "AbstractListModel is uncreateable");
}

void BuildLegend::componentComplete()
{
  QQuickItem::componentComplete();

  // find QML MapView component
  m_mapView = findChild<MapQuickView*>("mapView");

  // create a new basemap instance
  Basemap* basemap = new Basemap(BasemapStyle::ArcGISTopographic, this);
  // create a new map instance
  m_map = new Map(basemap, this);
  // set map to auto fetch LegendInfo
  m_map->setAutoFetchLegendInfos(true);
  // set initial viewpoint
  m_map->setInitialViewpoint(Viewpoint(Point(-11e6, 6e6, SpatialReference(3857)), 9e7));
  // set map on the map view
  m_mapView->setMap(m_map);

  addLayers();

  connect(m_map->legendInfos(), &LegendInfoListModel::fetchLegendInfosCompleted, this, [this]()
  {
    // set the legend info list model
    m_legendInfoListModel = m_map->legendInfos();
    emit legendInfoListModelChanged();
  });
}

void BuildLegend::addLayers()
{
  ArcGISMapImageLayer* mapImageLayer = new ArcGISMapImageLayer(QUrl("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer"), this);
  m_map->operationalLayers()->append(mapImageLayer);

  ServiceFeatureTable* featureTable = new ServiceFeatureTable(QUrl("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Recreation/FeatureServer/0"), this);
  FeatureLayer* featureLayer = new FeatureLayer(featureTable, this);
  m_map->operationalLayers()->append(featureLayer);
}

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