Légendes

Retour

Cette section à pour but de montrer quelques exemples d'utilisation des légendes de carte:

  • La légende s'appuie toujours sur le rendu défini dans le style de carte
  • La légende permet pour l'instant de tester les valeurs d'une seule propriété de la feature
  • Cette démo montre l'exemple de:
    • Légende fixe
      • Toutes la valeurs de la légende sont affichées en utilisant les properties + additionalProperties
    • "Automatique"
      • La légende teste toutes les valeurs unitaires d'une propriété et génère la légende en l'utilisant en combinaison de additionalProperties
      • Applique le style à chacune de ces valeurs et utilse la valeur comme libellé
    • Découverte
      • La légende utilise un dictionnaire pour retrouver la valeur d'une propriété et afficher un label
      • Utilise la valeur et génère la légende en l'utilisant en combinaison de additionalProperties
      • Les valeurs en dehors du dictionnaire son regroupée sous une valeur "fallback"
  • Des options pour minZoom / maxZoom sur la légende
  • Des options pour appliquer un zoom lors de la génération du style de légende
  • Modifier les options de légende via API
    • Masquable oui/non
    • Hauteur max
    • Titre
  • Afficher ou masquer la légende par API
  • Afficher ou masquer via la toolbar Mapviewer
Démo
{
  "jsLib": [
    "https://karteis.sct.saas-gfi.eu/dist/mapviewer/latest/karteis-mapviewer-var.js"
  ]
}
<!-- Ne pas utiliser dans votre code -->
<!-- La déclaration du css n'est utile que pour l'affichage sur le site d'exemples -->
<link rel="stylesheet" href="/mapviewer/mapviewer.css">
<!-- Ne pas utiliser dans votre code -->

<!-- Dans nos exemple on utilise font-awesome pour afficher les icones de boutons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">

<!-- Le div qui sera utilisé pour injecter la carte -->
<div id="kmap" style="height:350px;" />
<button onclick="changeLegendOptions()" >Modifier les options de légende</button>
<button onclick="hideLegend()" >Masquer la légende</button>
<button onclick="showLegend()" >Afficher la légende</button>

// Initialisation de la carte avec ses plugins
const kmapvInstance = (new kmapv.Mapviewer({
    mapdiv: document.getElementById('kmap'), // Il est aussi possible d'utiliser directement l'id du div contenant la carte
    projection: 'EPSG:3857',
    defaultCenter: [673336.2187669694, 6303500.5366335241],
    defaultZoom: 18,
    minZoom: 5,
    maxZoom: 22,
}))
 .use(kmapv.CommonLayer({})) // charge le plugin générique des calques
 .use(kmapv.BackgroundLayer({})) // charge le plugin de prise en charge des fond de plans
 .use(kmapv.DataLayer({})) // chage le plugin de prise en charge des couche de données

// Ajout du fond de plan OSM
kmapvInstance.backgroundLayer.addOSM('background', { title: 'open street map', zIndex: 0 })


// styles des données
const stylesOuvs = {
    BRT: kmapv.Services.createStyle(
    {
        // style des points
        circle: {
            radius: 5,
            fill: {
                color: 'rgba(200, 50, 50, 0.6)',
            },
            stroke: {
                color: 'rgba(200, 50, 50, 0.9)',
                width: 1,
            }
        }
    }),
    default: kmapv.Services.createStyle(
    {
        // style des points
        circle: {
            radius: 5,
            fill: {
                color: 'rgba(170, 170, 170, 0.6)',
            },
            stroke: {
                color: 'rgba(136, 136, 136, 0.9)',
                width: 1,
            }
        }
    })
}

const stylesCans= {
    EU: kmapv.Services.createStyle({
        // style les lignes
        stroke: {
            color: 'rgba(255, 0, 0, 1)',
            width: 2,
        },
    }),
    UN: kmapv.Services.createStyle({
        // style les lignes
        stroke: {
            color: 'rgba(0, 255, 0, 1)',
            width: 2,
        },
    }),
    EP: kmapv.Services.createStyle({
        // style les lignes
        stroke: {
            color: 'rgba(70, 130, 180, 1)',
            width: 2,
        },
    }),
    default: kmapv.Services.createStyle({
        // style les lignes
        stroke: {
            color: '#333',
            width: 2,
        },
    })
}

const stylesSelected = kmapv.Services.createStyle(
{
    // remplissage des polygones
    fill: {
        color: 'rgba(0,0,255,0.1)',
    },
    // style les lignes
    stroke: {
        color: '#00F',
        width: 2,
    },
    // style des points
    circle: {
        radius: 10,
        fill: {
            color: 'rgba(0,0,255,0.3)',
        },
        stroke: {
            color: '#00F',
            width: 2,
        }
    }
})

const getStyleCans = ({ feature, selected }) => {
    const typRes = feature.get("TYPRES")
    return selected ? stylesSelected : stylesCans[typRes] || stylesCans.default
}

const getStyleOuvs = ({ feature, selected }) => {
    const typologie = feature.get("TYPOLOGIE")
    return selected ? stylesSelected : stylesOuvs[typologie] || stylesOuvs.default
}

// Ajout d'un calque de données
kmapvInstance.dataLayer.addDataLayer({
    title: "Canalisations",
    idGroup: 'data',
    zIndex: 1,
    layerId: 'cans',
    selectable: true,
    style: getStyleCans,
    legends: [
        {
            // la légende va découvrir les valeurs unitaire de la propriété TYPRES
            // et appliquer le style du calque "getStyleCans"
            // le libellé sera la valeur de la propriété
            order:0,
            label:'Type de réseau',
            property:'TYPRES',
        },
        {
            // la légende va ajouter un élement par "values"
            // et appliquer le style du calque  "getStyleCans"
            // on teste le style avec la proprieté 'TYPRES' = value
            // le libellé le texte 'label'
            // ne pas oublier de renseigner geometryType car on ne sait pas quelle type de données
            // la fonction de style utilise
            order:2,
            label:'Réseau EP/EU',
            sublabel:'Legende fixe',
            // propriétés qui peuvent être ajoutée à chaque génération d'imagette (par exemple si la fonction de style a besoin de ces propriétés)
            /*additionalProperties: {
                PROP1: 'test value 1',
                PROP2: 'test value 2',
            },*/
            // force la génération de légende avec ce niveau de zoom (par exemple si la fonction de style est fonction du zoom)
            // zoom : 18,
            // cette légende va s'afficher sur une visibilité restreinte :
            minZoom: 17,
            maxZoom: 22,
            values:[{
              label: 'Eau usée',
              geometryType: 'LineString',
              properties: {
                  TYPRES: 'EU'
              }
            },
            {
              label: 'Eau pluviale',
              geometryType: 'LineString',
              properties: {
                  TYPRES: 'EP'
              }
            }]
        }
    ]

})
// Ajout d'un calque de données
kmapvInstance.dataLayer.addDataLayer({
    title: "Ouvrages",
    idGroup: 'data',
    zIndex: 1,
    layerId: 'ouvs',
    selectable: true,
    minZoom: 17,
    maxZoom: 22,
    style: getStyleOuvs,
    legends: [
        {
            // la légende va découvrir les valeurs unitaire de la propriété TYPOLOGIE
            // et appliquer le style du calque  "getStyleOuvs"
            // les valeurs autres que celles indiquées dans "discoverValues" seront regroupée ensemble
            // le libellé sera la valeur en face de discoverValues (Branchement pour les données 'BRT')
            // et 'Autre' (discoverValuesFallback) pour toutes les autres valeurs
            order:1,
            label:'Typologie',
            property:'TYPOLOGIE',
            discoverValues: {
                BRT:'Branchement',
            },
            //discoverValuesFallback : false  on affiche pas les fallback
            discoverValuesFallback: {
                label: 'Autre',
            },
        },
    ]
})

// ajout des données au format geojson dans le calque
// !!!! Dans CODEPEN remplacer ../../../../datas/features-base.json par https://karteis.sct.saas-gfi.eu/documentation/datas/features-base.json
fetch('../../../../datas/feature-cans.json').then(function (response) {
    return response.json();
  }).then((data) => {
    kmapvInstance.dataLayer.addGeojsonFeatures({
        type: 'FeatureCollection',
        features: data.features,
    }, 'cans')
})

fetch('../../../../datas/feature-ouvs.json').then(function (response) {
    return response.json();
  }).then((data) => {
    kmapvInstance.dataLayer.addGeojsonFeatures({
        type: 'FeatureCollection',
        features:     data.features,
    }, 'ouvs')
})

// ajout a la toolbar:
kmapvInstance.horizontalToolbar.addLayerLegendTool()

// ajout du layermanager :
kmapvInstance.horizontalToolbar.addLayerManagerTool({
    reordering: false // on ne veut pas réorganiser les calques
})

function changeLegendOptions() {
    kmapvInstance.legendManager.setOptions({
        maxHeight:'200px',
        title:'nouveau titre',
        closeable:false,
    })
}

function hideLegend() {
    kmapvInstance.legendManager.hide()
}
function showLegend() {
    kmapvInstance.legendManager.show()
}



table {
  margin-top: 3px;
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
}

td, th {
  cursor: pointer;
  border: 1px solid #dddddd;
  text-align: left;
}

tr:nth-child(even) {
  background-color: #dddddd;
}

Dernière mise à jour:
Contributors: Jerome Mare