Hi, I am creating an app with QT Creator and am wondering how i would go about creating a legend. I could not find a legend component.
I have tried creating a custom component (listview with a model), and i scan the layerItems and retrieve the image url.
However, the url i get (sample below) does not seem to be a http endpoint. it looks like it is going in to a custom image provider, however, i am unable to see the image in my listview.
qml: image://arcgisruntimeimageprovider/cdacd5e0-39ac-4167-9adb-29a6d7a3388f/legendItem
I was wondering if someone could point me in the general direction of creating a legend component.
I am fairly new to qml/qt so i apologize for any noob questions i may have.
Thanks
Hmm, the image provider image should work with the image. Maybe you can try the legend sample that the AppStudio team has created:
main.qml:
Map {
id: map
anchors.fill: parent
extent: marylandExtent
ArcGISTiledMapServiceLayer {
url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"
ArcGISDynamicMapServiceLayer {
id: dynamicService
//url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer"
//url: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapSe..."
//url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/AIMS/WaterAccess20140919/MapServer"
url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/Environment/Natural_Filters/MapServer"
onStatusChanged: {
if( status === Enums.MapStatusReady){
mylegendView.updateModel();
Envelope {
id: marylandExtent
xMax: -8519000
yMax: 4814600
xMin: -8501800
yMin: 4821600
Rectangle {
id: legendRectangle
color: "lightgrey"
radius: 5
border.color: "black"
opacity: 0.77
width: parent.width * 0.3
anchors {
right: parent.right
top: parent.top
bottom: parent.bottom
margins: 20 * scaleFactor
LegendView {
id: mylegendView
map: map
anchors.fill: legendRectangle
anchors.margins: 10 * scaleFactor
criteria: ViewSection.FullString
delegate: legendSectionDelegate
labelPositioning: ViewSection.InlineLabels
delegate: legendItemDelegate
//--------------------------------------------------------------------------
Component {
id: legendSectionDelegate
Item {
width: parent.width
height: textControl.height
Text {
id: textControl
anchors.verticalCenter: parent.verticalCenter
text: section
width: parent.width
font {
pointSize: 10
bold: true
color: "#4c4c4c"
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
//--------------------------------------------------------------------------
Component {
id: legendItemDelegate
Item {
width: parent.width
height: Math.max(legendImage.height, legendText.height)
Image {
id: legendImage
anchors {
left: parent.left
leftMargin: 5
verticalCenter: parent.verticalCenter
source: image
height: 30 * System.displayScaleFactor
width: height
fillMode: Image.PreserveAspectFit
Text {
id: legendText
anchors {
verticalCenter: parent.verticalCenter
left: legendImage.right
leftMargin: 4
right: parent.right
text: label
color: "#4c4c4c"
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
font {
pointSize: 10
//--------------------------------------------------------------------------
ListModel {
id: legendModel
function updateModel() {
legendModel.clear();
//console.log("Legend Layers", map.layerCount);
for (var layerIndex = 0; layerIndex < map.layerCount; layerIndex++) {
var layer = map.layerByIndex(layerIndex);
if (!layer.visible) {
continue;
switch (layer.type) {
case Enums.LayerTypeArcGISTiledMapService :
continue;
default:
break;
var legendInfos = layer.legend;
//console.log("Legend Infos", legendInfos.length);
for (var infoIndex = 0; infoIndex < legendInfos.length; infoIndex++) {
var legendInfo = legendInfos[infoIndex];
var legendItems = legendInfo.legendItems;
//console.log("Legend Items", legendInfo.layerName, legendItems.length);
for (var itemIndex = 0; itemIndex < legendItems.length; itemIndex++) {
var legendItem = legendItems[itemIndex];
legendModel.append(
"layerName": legendInfo.layerName,
"image": legendItem.image.toString(),
"label": legendItem.label
//--------------------------------------------------------------------------
Hmm, the image provider image should work with the image. Maybe you can try the legend sample that the AppStudio team has created:
main.qml:
Map {
id: map
anchors.fill: parent
extent: marylandExtent
ArcGISTiledMapServiceLayer {
url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"
ArcGISDynamicMapServiceLayer {
id: dynamicService
//url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer"
//url: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapSe..."
//url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/AIMS/WaterAccess20140919/MapServer"
url: "https://gisapps.dnr.state.md.us/arcgis2/rest/services/Environment/Natural_Filters/MapServer"
onStatusChanged: {
if( status === Enums.MapStatusReady){
mylegendView.updateModel();
Envelope {
id: marylandExtent
xMax: -8519000
yMax: 4814600
xMin: -8501800
yMin: 4821600
Rectangle {
id: legendRectangle
color: "lightgrey"
radius: 5
border.color: "black"
opacity: 0.77
width: parent.width * 0.3
anchors {
right: parent.right
top: parent.top
bottom: parent.bottom
margins: 20 * scaleFactor
LegendView {
id: mylegendView
map: map
anchors.fill: legendRectangle
anchors.margins: 10 * scaleFactor
criteria: ViewSection.FullString
delegate: legendSectionDelegate
labelPositioning: ViewSection.InlineLabels
delegate: legendItemDelegate
//--------------------------------------------------------------------------
Component {
id: legendSectionDelegate
Item {
width: parent.width
height: textControl.height
Text {
id: textControl
anchors.verticalCenter: parent.verticalCenter
text: section
width: parent.width
font {
pointSize: 10
bold: true
color: "#4c4c4c"
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
//--------------------------------------------------------------------------
Component {
id: legendItemDelegate
Item {
width: parent.width
height: Math.max(legendImage.height, legendText.height)
Image {
id: legendImage
anchors {
left: parent.left
leftMargin: 5
verticalCenter: parent.verticalCenter
source: image
height: 30 * System.displayScaleFactor
width: height
fillMode: Image.PreserveAspectFit
Text {
id: legendText
anchors {
verticalCenter: parent.verticalCenter
left: legendImage.right
leftMargin: 4
right: parent.right
text: label
color: "#4c4c4c"
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
font {
pointSize: 10
//--------------------------------------------------------------------------
ListModel {
id: legendModel
function updateModel() {
legendModel.clear();
//console.log("Legend Layers", map.layerCount);
for (var layerIndex = 0; layerIndex < map.layerCount; layerIndex++) {
var layer = map.layerByIndex(layerIndex);
if (!layer.visible) {
continue;
switch (layer.type) {
case Enums.LayerTypeArcGISTiledMapService :
continue;
default:
break;
var legendInfos = layer.legend;
//console.log("Legend Infos", legendInfos.length);
for (var infoIndex = 0; infoIndex < legendInfos.length; infoIndex++) {
var legendInfo = legendInfos[infoIndex];
var legendItems = legendInfo.legendItems;
//console.log("Legend Items", legendInfo.layerName, legendItems.length);
for (var itemIndex = 0; itemIndex < legendItems.length; itemIndex++) {
var legendItem = legendItems[itemIndex];
legendModel.append(
"layerName": legendInfo.layerName,
"image": legendItem.image.toString(),
"label": legendItem.label
//--------------------------------------------------------------------------