Le blog francophone consacré
aux technologies Esri

Conseils & Astuces ArcGIS Online - N°201

N°201 - Expressions de données ArcGIS Dashboards - Calculer dynamiquement des champs

Dans ce précédent article, je vous présentais la puissante notion d'expression de données dans ArcGIS Dashboards ainsi que l'interface permettant de les créer. Dans cet article, je vous propose maintenant de découvrir des exemples concrets de cas d'usages de ces expressions. Je vous présente plusieurs exemples d'expressions de données permettant de calculer des nouveaux champs avant de les ajouter dans votre tableau de bord.


Exemple 1:

Je dispose d'une couche contenant des informations issues de capteurs de températures. Ces températures sont exprimées en degrés Celsius mais, pour des enjeux d'internationalisation de mon tableau de bord, je veux également disposer d'un champ contenant ces valeurs en degrés Fahrenheit. Je veux également ne retenir que les capteurs qui sont actifs.


L'expression de données suivante pourra alors être utilisée :

var myportal = Portal('https://www.arcgis.com');
// Récupération de la couche d'entités d'origine
var fs = FeatureSetByPortalItem(
    myportal,
    '0d3c42f93c974fbd93f9cc1560d08f81',
    0,
    ['*'],
    false
);

// Filtrage des équipements actifs uniquement
var featuresRecents = Filter(fs, "etat like 'actif'");

var new_features = [];

// Création des entités à mettre dans le nouveau FeatureSet
for (var f in featuresRecents) {
  var celsius = f["temperature_C"]
  // Conversion en degrés Fahrenheit
  var fahrenheit = (celsius * 9 / 5) + 32
  // On ajoute une nouvelle entités dans le tableau
  Push(new_features, {
      attributes: {
          "id_capteur": f["id_capteur"],
          "etat": f["etat"],
          "temperature_C": Round(f["temperature_C"],1),
          "temperature_F": Round(fahrenheit)
      }
  });
}

// Définition du nouveau FeatureSet
var def_new_featureset = {
    fields: [
        // Champs déjà présents dans la couche
        { name: "id_capteur", type: "esriFieldTypeString" },
        { name: "etat", type: "esriFieldTypeString" },
        { name: "temperature_C", type: "esriFieldTypeDouble" },
        // Nouveau champ
        { name: "temperature_F", type: "esriFieldTypeDouble" },
        
    ],
    // Ici nous créons une table (sans géométrie)
    geometryType: "",
    features : new_features
};

return FeatureSet(def_new_featureset);

Le jeu de données généré est alors le suivant :


Il peut alors être utilisé dans un tableau de bord pour créer cet indicateur :


Exemple 2:

Je dispose maintenant d'une table contenant des informations relatives à des pannes sur un réseau de fibre optique. On dispose d'une date de début de panne (DateDebut) et d'une date de réparation (DateReparation). L'objectif est de générer dynamiquement un jeu de données concernant uniquement les pannes du dernier mois et de calculer un champ supplémentaire correspondant au délais de répération (en nombre de jours).


L'expression de données suivante pourra alors être utilisée :
var myportal = Portal('https://www.arcgis.com');
// Récupération de la table d'origine
var fs = FeatureSetByPortalItem(
    myportal,
    '3cd2e38946904d50af4f1b2dd113f78c',
    0,
    ['*'],
    false
);
     
// Calcul de la date limite (6 mois en arrière)
var unMoisAvant = DateAdd(Now(), -1, "months");

// Filtrage des enregistrements récents
var featuresRecents = Filter(fs, "DateReparation >= @unMoisAvant");

var new_features = [];

// Création des entités à mettre dans le nouveau FeatureSet
for (var f in featuresRecents) {
    var delai_resolution = null;
    if (!IsEmpty(f["DateDebut"]) && !IsEmpty(f["DateReparation"])) {
        delai_resolution = DateDiff(f["DateReparation"], f["DateDebut"], "days");
    }

    Push(new_features, {
        attributes: {
            "TypePanne": f["TypePanne"],
            "DateDebut": f["DateDebut"],
            "DateReparation": f["DateReparation"],
            "IdEquipement": f["IdEquipement"],
            "DelaisResolution": Round(delai_resolution,2)
        }
    });
}

// Création du nouveau FeatureSet
var new_featureset = {
    fields: [
        // Champs déjà présents dans la couche
        { name: "TypePanne", type: "esriFieldTypeString" },
        { name: "DateDebut", type: "esriFieldTypeDate" },
        { name: "DateReparation", type: "esriFieldTypeDate" },
        { name: "IdEquipement", type: "esriFieldTypeString" },
        // Nouveau champs à ajouter et à calculer
        { name: "DelaisResolution", type: "esriFieldTypeDouble" }
    ],
    // Ici nous créons une table (sans géométrie)
    geometryType: "",
    features : new_features
};

return FeatureSet(new_featureset);

Le jeu de données généré est alors le suivant :


Il peut alors être utilisé dans un tableau de bord pour créer ce diagramme qui représente le délais moyen de réparation par type de panne pour le mois précédent :


Exemple 3 :

Je dispose maintenant d'une table contenant des informations (fictives) concernant des faits de délinquance. Au-delà du type de fait et de la description, ces derniers possèdent une date et une heure. L'objectif est d'ajouter à ce jeu de données indiquant si le fait s'est déroulé la nuit (0h-6h), le matin (6h-12h), l'après-midi (12h-18h) ou le soir (18h-0h).


L'expression de données suivante pourra alors être utilisée :
var myportal = Portal('https://www.arcgis.com');
// Récupération de la couche d'origine
var fs = FeatureSetByPortalItem(
    myportal,
    'e2b3e63cbfb34a2fbed4dae62d080ef3',
    0,
    ['*'],
    false
);

var new_features = [];

// Création des entités à mettre dans le nouveau FeatureSet
for (var f in fs) {
  // Récupération de l'heure du fait
  var heure = Hour(f["Date_Heure"])
  // Période de la journée
  var periode
  periode = IIf(heure < 6, 'nuit', IIf(heure < 12, 'matin', IIf(heure < 18, 'après-midi','soir')));

  Push(new_features, {
      attributes: {
          "Type_fait": f["Type_fait"],
          "Adresse": f["Adresse"],
          "Description": f["Description"],
          "Nb_Auteurs": f["Nb_Auteurs"],
          "Nb_Victimes": f["Nb_Victimes"],
          "Periode": periode,
      },
  });
}

// Définition du nouveau FeatureSet
var def_new_featureset = {
    fields: [
        // Champs déjà présents dans la couche
        { name: "Type_fait", type: "esriFieldTypeString" },
        { name: "Adresse", type: "esriFieldTypeString" },
        { name: "Description", type: "esriFieldTypeString" },
        { name: "Nb_Auteurs", type: "esriFieldTypeInteger" },
        { name: "Nb_Victimes", type: "esriFieldTypeInteger" },
        // Nouveau champ
        { name: "Periode", type: "esriFieldTypeString" }
    ],
    // Ici nous créons une table (sans géométrie)
    geometryType: "",
    features : new_features
};

return FeatureSet(def_new_featureset);

Le jeu de données généré est alors le suivant :


Il peut alors être utilisé dans un tableau de bord pour créer ces diagrammes qui représente la répartition des faits selon la période de la journée :



Exemple 4 :

Nous disposons d'un jeu de données contenant les signalements issus de l'application "Dans Ma Rue" mise à disposition des citoyens par la ville de Paris. Celle-ci contient le type et sous-type du signalement aibnsi qu'une date. L'objectif est d'ajouter un champ contenant le jour de la semaine afin de présenter des statistiques sur cet axe.


L'expression de données suivante pourra alors être utilisée :
var myportal = Portal('https://www.arcgis.com');
// Récupération de la couche d'origine
var fs = FeatureSetByPortalItem(
    myportal,
    '567c9ad9fbf04d1aac18bec41574cd78',
    0,
    ['adresse','datedecl','type','soustype'],
    false
);

var new_features = [];

// Création des entités à mettre dans le nouveau FeatureSet
for (var f in fs) {
  // Récupération du jour de la semaine
  var num_jour = ISOWeekday(f["datedecl"])
  // Codage du nom du jour
  var nom_jour = Decode(num_jour, 1, 'Lundi', 2, 'Mardi', 
                        3, 'Mercredi',  4, "Jeudi", 5 , "Vendredi",
                        6, "Samedi", 7, "Dimanche","");

  Push(new_features, {
      attributes: {
          "adresse": f["adresse"],
          "datedecl": f["datedecl"],
          "type": f["type"],
          "soustype": f["soustype"],
          "num_jour": num_jour,
          "nom_jour": nom_jour
      },
  });
}

// Définition du nouveau FeatureSet
var def_new_featureset = {
    fields: [
        // Champs déjà présents dans la couche
        { name: "adresse", type: "esriFieldTypeString" },
        { name: "datedecl", type: "esriFieldTypeDate" },
        { name: "type", type: "esriFieldTypeString" },
        { name: "soustype", type: "esriFieldTypeString" },
        // Nouveaux champs
        { name: "num_jour", type: "esriFieldTypeInteger" },
        { name: "nom_jour", type: "esriFieldTypeString" }
    ],
    // Ici nous créons une table (sans géométrie)
    geometryType: "",
    features : new_features
};

// On retourne le FeatureSet en le triant sur le numéro du jour afin
// d'avoir ensuite un tri correct du lundi au dimanche dans le diagramme
return OrderBy(FeatureSet(def_new_featureset), 'num_jour ASC');

Le jeu de données généré est alors le suivant :


Il peut alors être utilisé dans un tableau de bord pour créer ce diagramme qui représente la répartition des signalement selon le type et le jour dans la semaine :



A travers ces 4 exemples, vous avez pu découvrir comment utiliser des expressions de données avec Arcade pour calculer dynamiquement un ou plusieurs champ(s) supplémentaire(s). Il ne vous reste plus qu'à l'appliquer à vos propres 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:

1 comments :

Cyril a dit…

Très interressant et concrtement utile. Merci Gaëtan.