Le blog francophone consacré
aux technologies Esri

Conseils & Astuces ArcGIS Online - N°165

N° 165 - Utiliser Arcade et une API tiers pour ajouter des diagrammes circulaires avancés dans vos fenêtres contextuelles

Bien qu'il soit possible d'ajouter des diagrammes circulaires (camemberts) en standard dans les fenêtres contextuelles des cartes ArcGIS, vous avez peut-être déjà souhaité aller plus en termes de personnalisation. Dans cet article, je vous propose de voir comment utiliser une expression Arcade et une API tiers pour générer des diagrammes circulaires offrant plus d'options de personnalisation que les diagrammes standards des fenêtres contextuelles d'ArcGIS.  


Dans cet exemple, nous disposons d'une couche d'entités des EPCI avec les informations de consommation d'énergie en 2020 selon différentes catégories d'activité (Agriculture, Industrie, Tertiaire, Résidentiel, ...). L'objectif est tout simplement de présenter la consommation totale en MWh de l'EPCI et la ventilation de cette consommation par type d'activité à l'aide d'un diagramme circulaire. Voici donc comment nous allons procéder :

  1. Connectez-vous tout d'abord sur votre portail ArcGIS puis ouvrez la carte web contenant la couche d'entités. Par défaut, la fenêtre contextuelle présente la liste des différents attributs. 


  2. Dans la zone de configuration des fenêtres contextuelles la couche, vous pouvez supprimer l'élément "Liste de champs" proposé par défaut puis ajouter un élément de contenu Arcade. Ce dernier nous permettra de réaliser les calculs statistiques nécessaires et configurer un rendu personnalisé (en HTML) de nos informations.

     
  3. Dans l'éditeur Arcade, vous effacerez les instructions déjà présentes par l'expression Arcade ci-dessous :
    //On indique les attributs nécessaires à notre expression Arcade
    Expects($feature,"*")
    
    // On définit un tableau avec les intitulés des catégories
    var array_labels=["Industrie", "Résidentiel", "Agriculture", "Tertiaire", "Autre"]
    // On définit un tableau avec les noms de attributs de chaque catégorie
    var array_fields=["consoi", "consor", "consoa", "consot", "consona"]
    // On définit les couleurs de représentation des catégories
    var array_colors=["#b9485d", "#9463dd", "#608f4e", "#f1bb3a", "#6699cd"]
    
    // On instancie un tableau pour stocker les valeurs de consommation
    // puis on boucle sur les différents attributs pour récupérer les valeurs
    var array_data=[]
    for (var i in array_fields){
      Push(array_data,Round($feature[array_fields[i]]))
    }
    
    // On définit les paramètres du diagramme circulaire qui sera généré par l'API QuickChart
    // On s'est basé sur le modèle de diagramme suivant : https://tinyurl.com/4ny7ce82
    var param_chart = {
      "type": "pie",
      "data": {
        "labels": array_labels,
        "datasets": [{
            "backgroundColor":array_colors ,
            "data": array_data
        }]
      },
      "options": {
        "plugins": {
          "datalabels": {
            "display": 'auto',
            "anchor": 'center',
            "align": 'top',
            "backgroundColor": '#FFF',
            "borderRadius": 3,
            "formatter": 'FORMATTER',
            "font": {
              "resizable": true,
              "minSize": 11,
              "maxSize": 15
            },
          }
        },
        "legend": {
          "display": true,
          "position": 'right',
          "align": 'start',
          "font": {
              "resizable": true,
              "minSize": 12,
              "maxSize": 16
            },
        },
      }
    }
    
    // On encode la partie paramètres pour en faire une URL correctement formatée
    var param_url = UrlEncode(Text(param_chart))
    
    // Cas particulier de la propriété "FORMATTER" qui doit être insérée manuellement dans 
    // la chaîne param_url car elle fait appel à une fonction qui entre en conflit avec les instructions Arcade
    param_url = Replace(param_url,"%22FORMATTER%22","%28value%29%20%3D%3E%20%7Breturn%20value%20%2B%20%27%20KWh%27%3B%7D")
    
    // On construit l'URL complète permettant de générer l'image du diagramme circulaire
    var url_chart = "https://quickchart.io/chart?width=400&c=" + param_url
    
    // On construit la chaîne HTML avec tout d'abord une phrase donnant la consommation totale de l'EPCI
    var HTML = `<p>La consommation totale pour l'année 2020 est de 
                <b>${Text($feature.consototale,'###,###,###')} MWh</b> 
                et se répartit de la manière suivante :</p>`
    
    // Puis on y ajoute l'image du diagramme circulaire
    HTML += `<img src=${url_chart} />`
    
    // Enfin, on renvoie la chaîne HTML complète
    return { 
      type : 'text', 
      text : HTML
    }
    On notera l'usage de l'API QuickChart qui permet de générer différents types de diagrammes à partir d'une url et une série de paramètres. Celle-ci est basée sur des librairies Open Source que vous pouvez installer sur votre propre serveur ou utiliser en ligne de manière gratuite (avec une limite sur le nombre de requêtes). Une version payante permet un accès illimité.

    On notera également l'usage du caractère backtick ( ` et non ') pour utiliser des littéraux et construire la chaîne HTML souhaitée. 
     
  4. Vous pouvez maintenant cliquer sur le bouton "Terminé" pour valider l'expression.

  5. La fenêtre contextuelle s'affiche désormais avec les informations de consommation par catégories d'activité dans un camembert, avec la légende et les étiquettes correspondantes.


En parcourant la documentation de l'API QuickChart vous découvrirez toutes les personnalisations possibles pour changer l'aspect de votre camembert. Je vous propose une variante qui utilise le type de diagramme "outlabeledPie" (et non plus "pie") dans laquelle nous n'afficherons pas la légende mais directement des étiquettes de rappel sur le camembert.

   

L'expression Arcade correspondant à cette variante est la suivante :
/On indique les attributs nécessaires à notre expression Arcade
Expects($feature,"*")

// On définit un tableau avec les intitulés des catégories
var array_labels=["Industrie", "Résidentiel", "Agriculture", "Tertiaire", "Autre"]
// On définit un tableau avec les noms de attributs de chaque catégorie
var array_fields=["consoi", "consor", "consoa", "consot", "consona"]
// On définit les couleurs de représentation des catégories
var array_colors=["#b9485d", "#9463dd", "#608f4e", "#f1bb3a", "#6699cd"]

// On instancie un tableau pour stocker les valeurs de consommation
// puis on boucle sur les différents attributs pour récupérer les valeurs
var array_data=[]
for (var i in array_fields){
  Push(array_data,Round($feature[array_fields[i]]))
}

// On définit les paramètres du diagramme circulaire qui sera généré par l'API QuickChart
// On s'est basé sur le modèle de diagramme suivant : https://tinyurl.com/ync8x35j
var param_chart = {
  "type": "outlabeledPie",
  "data": {
    "labels": array_labels,
    "datasets": [{
        "backgroundColor":array_colors ,
        "data": array_data
    }]
  },
  "options": {
    "plugins": {
      "legend": false,
      "outlabels": {
        "text": "%l %p",
        "color": "white",
        "stretch": 20,
        "font": {
          "resizable": true,
          "minSize": 12,
          "maxSize": 16
        }
      }
    }
  }
}

// On encode la partie paramètres pour en faire une URL correctement formatée
var param_url = UrlEncode(Text(param_chart))

// On construit l'URL complète permettant de générer l'image du diagramme circulaire
var url_chart = "https://quickchart.io/chart?width=400&c=" + param_url

// On construit la chaîne HTML avec tout d'abord une phrase donnant la consommation totale de l'EPCI
var HTML = `<p>La consommation totale pour l'année 2020 est de 
            <b>${Text($feature.consototale,'###,###,###')} MWh</b> 
            et se répartit de la manière suivante :</p>`

// Puis on y ajoute l'image du diagramme circulaire
HTML += `<img src=${url_chart} />`

// Enfin, on renvoie la chaîne HTML complète
return { 
  type : 'text', 
  text : HTML
}
J'espère que cet exemple vous inspirera et que vous pourrez l'adapter à vos cas d'usage.


Bonne route sur ArcGIS Online !
   
Pour retrouver l'ensemble des Conseils & Astuces ArcGIS Online, cliquez sur ce lien

Partager cet article:

Rejoindre la discussion

    Les commentaires à propos de cet article: