Le blog francophone consacré
aux technologies Esri

Conseils & Astuces ArcGIS Online - N°167

N° 167 - Utiliser Arcade et une API tiers pour synthétiser vos données dans des diagrammes à barres empilées dans vos fenêtres contextuelles

Un point très intéressant avec les expressions Arcade dans le contexte des fenêtres contextuelles est de pouvoir cliquer sur une entité et accéder aux entités d'une autre couche en utilisant, par exemple, une relation d'intersection. Il est ainsi possible d'afficher dans la fenêtre contextuelle des statistiques (comptage, moyenne, min/max, ...) sur ces entités intersectées. Prenons l'exemple d'une couche des quartiers de Paris et d'une couche de points correspondants aux signalements réalisés par des citoyens avec l'application "Dans ma rue". 


Dans cet exemple, nous allons permettre à l'utilisateur de cliquer sur un quartier et d'afficher dans la fenêtre contextuelle, les statistiques sur les signalements par mois et par type. L'idée ici est de représenter ces informations dans un diagramme à barres empilées. Etant donné que les diagrammes polaires ne sont pas des éléments disponibles en standard dans les fenêtres contextuelles ArcGIS, nous utiliserons donc une API tiers pour les générer. Voici donc comment nous allons procéder :

  1. Connectez-vous tout d'abord sur votre portail ArcGIS puis ouvrez la carte web contenant les deux couches d'entités (limites des quartiers et signalements). Par défaut, la fenêtre contextuelle des quartiers 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 définit les attributs du quartier que l'on souhaite récupérer
    Expects($feature, "*")
    
    // On récupère la couche des signalements depuis la carte
    var signalements = FeatureSetByName($map, "Signalements Dans Ma Rue 2021")
    
    // On sélectionne les signalements qui intersectent le quartier
    var Intersect_Signalements = Intersects (signalements,$feature)
    
    // On définit un tableau pour les couleurs des différents types de signalement
    var array_colors=['rgb(255, 224, 64)','rgb(182, 129, 75)','rgb(156, 79, 156)','rgb(107, 101, 213)','rgb(32, 158, 205)',
                      'rgb(244, 130, 216)','rgb(234, 73, 82)','rgb(168, 201, 54)','rgb(250, 145, 33)','rgb(67, 177, 153)']
    
    // On définit un tableau pour les libellés des différents mois
    var array_labels = ['Janvier','Fevrier','Mars','Avril','Mai','Juin',
                        'Juillet','Aout','Septembre','Octobre','Novembre','Décembre']
    
    // Récapitulation des signalements par type et par mois
    var comptage_par_type_et_mois = GroupBy(Intersect_Signalements,
                                            [ 'TYPE_DECLARATION', 'MOIS_DECLARATION'],
                                            {name:'count', expression: '1',statistic:'COUNT'})
    
    // On crée un FeatureSet avec les différents types de signalement
    var types_Signalements=Distinct(comptage_par_type_et_mois, 'TYPE_DECLARATION')
    
    // On trie le FeatureSet par ordre alphabétique pour une bonne correspondance avec les couleurs
    types_Signalements = OrderBy(types_Signalements, 'TYPE_DECLARATION ASC')
    
    // Initialisation d'un tableau pour stocker les datasets à représenter dans le diagramme
    var dataset_chart = []
    var i = 0
    // On boucle sur les différents types de signalement 
    for (var f in types_Signalements){
      var type = f.TYPE_DECLARATION
      var comptage_par_mois = Filter(comptage_par_type_et_mois,'TYPE_DECLARATION = @type')
      comptage_par_mois = OrderBy(comptage_par_mois, 'MOIS_DECLARATION ASC')
      // On initialise un tableau pour stocker les comptages par mois
      var array_data=[]
      // On boucle sur chaque mois
      for (var f in comptage_par_mois){
        Push(array_data, f.COUNT)
      }
      // On construit un dictionnaire qui décrit chaque dataset pour le diagramme
      var dict = {
            // La couleur de remplissage des barres est celle des contours des barres 
            // mais avec une opacité de 80%
            backgroundColor: Replace(Replace(array_colors[i],"rgb","rgba"),")",",0.8)"),
            borderColor: array_colors[i],
            data: array_data,
            label: type,
            borderWidth: 1,
          }
        Push(dataset_chart,dict)
      i++
    }
    
    // On construit les paramètres permettant de générer le diagramme avec l'API QuickChart
    // Pour cela on se base sur le modèle de diagramme en barres empilées : https://tinyurl.com/yyjwk3sv 
    var params_chart = {
      type: 'bar',
      data: {
        labels: array_labels,
        datasets: dataset_chart,
      },
      options: {
        legend: {
          display: true,
          position: 'bottom',
          align: 'start',
          fontsize: '7',
        },
        title: {
          display: true,
          text: '',
        },
        scales: {
          xAxes: [
            {
              stacked: true,
            },
          ],
          yAxes: [
            {
              stacked: true,
            },
          ],
        },
      },
    }
    
    // On applique un encodage d'url correct pour les paramètres du diagramme
    var param_url = URLEncode(Text(params_chart)) 
    
    // On construit l'url complète permettant de générer l'image du diagramme
    var chart_url="https://quickchart.io/chart" + "?width=600&height=600&c=" + param_url
    
    // On construit la chaîne HTML à renvoyer
    var HTML = `<div>${Count(Intersect_Signalements)} signalements effectués dans ce quartier pour 2021. 
              Voici leur répartition saisonalisée :<br/><br/><img src='${chart_url}' /></div>`
    
    // On renvoie la chaine HTML du contenu de la fenêtre contextuelle 
    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 sur les signalements par type et par mois pour le quartier cliqué, le tout sous la forme d'un diagramme à barres empilées avec la légende associée.


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: