Le blog francophone consacré
aux technologies Esri

Conseils & Astuces ArcGIS Online - N°202

N°202 - Expressions de données ArcGIS Dashboards - Agréger dynamiquement des données

Dans ce précédent article, je vous présentais la notion très puissante d'expression de données dans ArcGIS Dashboards ainsi que l'interface permettant de les créer. Dans cet article, je vous propose plusieurs exemples d'expressions de données permettant d'agréger dynamiquement les données avant de les utiliser dans votre tableau de bord.


Exemple 1:

Je dispose d'une couche des hébergements AirBnB à Partis contenant notamment le type de propriété (Appartement, Maison, Loft, Bateau, ...), le type de logement (Logement entier, Chambre privée, Chambre partagée,...) ainsi que le prix de la nuitée. Je souhaite tout simplement agréger mes données selon le type de propriété et le type de logement, puis faire la moyenne du prix de la nuitée par catégorie. En standard dans ArcGIS Dashboard je peux agrégé par catégorie sur un seul champ ce qui ne conviendra pas. En revanche, une expression de données Arcade va me permettre de construire dynamiquement le jeu de données souhaité. 

Cliquez sur l'image pour l'agrandir


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

// Récupération du portail ArcGIS, ici ArcGIS Online
var myportal = Portal('https://www.arcgis.com');

// Récupération de la couche d'entités d'origine
var fs = FeatureSetByPortalItem(
    myportal,
    '440753e53d144f9089b4c2debc566395',
    0,
    ['*'],
    false
);

// Filtrage pour ne garder que les types qui sont non nuls
var fs_filtered = Filter(fs, "(Type_de_propriete IS NOT NULL) AND (Type_de_logement IS NOT NULL)");

// Agrégation du jeu de données selon les types de propriété et de logement
var featuresStats = GroupBy(fs_filtered,
  [  // Champs d'agrégation
    { name: 'Type_de_propriete', expression: 'Type_de_propriete'},
    { name: 'Type_de_logement', expression: 'Type_de_logement'}
  ],
  [  // Statistique à renvoyer : la myenne du prix des nuitées
    { name: 'Nuitée_Moyenne', expression: 'Prix_nuitee', statistic: 'AVG' }
  ]
);

// Création du tableau pour les nouvelles entités
var new_features = []

for (var g in featuresStats) {
    var feat = {
        attributes: {
            "Type_de_propriete": g["Type_de_propriete"],
            "Type_de_logement": g["Type_de_logement"],
            "Nuitée_Moyenne": g["Nuitée_Moyenne"]
        }
    };
    Push(new_features,feat);
}

// Création du nouveau FeatureSet
var new_featureset = {
    fields: [
        // Schéma de la table
        { name: "Type_de_propriete", type: "esriFieldTypeString" },
        { name: "Type_de_logement", type: "esriFieldTypeString" },
        { name: "Nuitée_Moyenne", 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 :


Vous pouvez par exemple le représenter dans votre tableau de bord à l'aide d'une liste :



Imaginons que vous souhaitiez une autre représentation comme un diagramme en séries par exemple. Il vous faudra alors disposer des combinaisons "Type de propriété" et "Type de logement" dans un seul et même champ. L'expression de données sera adaptée de la manière suivante :

// Récupération du portail ArcGIS, ici ArcGIS Online
var myportal = Portal('https://www.arcgis.com');

// Récupération de la couche d'entités d'origine
var fs = FeatureSetByPortalItem(
    myportal,
    '440753e53d144f9089b4c2debc566395',
    0,
    ['*'],
    false
);

// Filtrage pour ne garder que les types qui sont non nuls
var fs_filtered = Filter(fs, "(Type_de_propriete IS NOT NULL) AND (Type_de_logement IS NOT NULL)");

// Agrégation du jeu de données selon les types de propriété et de logement
var featuresStats = GroupBy(fs_filtered,
  [  // Champs d'agrégation
    { name: 'Type_de_propriete', expression: 'Type_de_propriete'},
    { name: 'Type_de_logement', expression: 'Type_de_logement'}
  ],
  [  // Statistique à renvoyer : la myenne du prix des nuitées
    { name: 'Nuitée_Moyenne', expression: 'Prix_nuitee', statistic: 'AVG' }
  ]
);

// Création du tableau pour les nouvelles entités
var new_features = []

for (var g in featuresStats) {
    var feat = {
        attributes: {
            "Type": g["Type_de_propriete"] + " - " + g["Type_de_logement"],
            "Nuitée_Moyenne": g["Nuitée_Moyenne"]
        }
    };
    Push(new_features,feat);
}

// Création du nouveau FeatureSet
var new_featureset = {
    fields: [
        // Schéma de la table
        { name: "Type", type: "esriFieldTypeString" },
        { name: "Nuitée_Moyenne", 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 :


Vous pouvez maintenant le représenter dans votre tableau de bord à l'aide d'un diagramme en série :



Exemple 2:

Je dispose maintenant d'une couche contenant des informations sur les accidents sur la métropole de Rennes durant l'année 2022. Nous savons qu'il est possible de représenter des données en utilisant un champ de type Date et de les agréger par jour, par mois ou par année à l'aide des options adéquates de l'interface d'ArcGIS Dashboard.  Imaginez maintenant que vous souhaitiez faire cette agrégation en fonction du jour de la semaine. dans ce cas, une expression de données Arcade sera la solution.

Cliquez sur l'image pour l'agrandir


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,
    'ab9e8b72221b439daaf20334549363c8',
    0,
    ['*'],
    false
);

// Agrégation du jeu de données selon les jours de la semaine sur le
// champ Date_Accident
var featuresStats = GroupBy(fs,
  [  // On définit l'expression SQL permettant d'extraire le jour de la semaine
    { name: 'JourSemaine', expression: "EXTRACT(DOW FROM Date_Accident)"}
  ],
  [  // statistique à renvoyer : un comptage des lignes
    { name: 'Total', expression: '1', statistic: 'COUNT' }
  ]
);

// Création du tableau pour les nouvelles entités
var new_features = []

// Décodage de jour de la semaine 
for (var g in featuresStats) {
    var code_jour = g["JourSemaine"];
    var nom_jour = Decode(code_jour,
        0, "Dimanche",
        1, "Lundi",
        2, "Mardi",
        3, "Mercredi",
        4, "Jeudi",
        5, "Vendredi",
        6, "Samedi",
        "Inconnu"
    );

    var feat = {
        attributes: {
            "jour": nom_jour,
            "total": g["Total"]
        }
    };
    Push(new_features,feat);
}

// Création du nouveau FeatureSet
var new_featureset = {
    fields: [
        // Schéma de la table
        { name: "jour", type: "esriFieldTypeString" },
        { name: "total", type: "esriFieldTypeInteger" },
    ],
    // 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 en série :



Exemple 3:

Dans ce dernier exemple, je dispose des observations de la couche iNaturalist du Living Atlas et de la couche des départements français. Je souhaite disposer d'un jeu de données qui dynamiquement compte le nombre d'observations par département. C'est ici, la relation spatiale entre les points des observations et les polygones des départements qui sera exploité par mon expression de données Arcade. 


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

var myportal = Portal('https://www.arcgis.com');

// Récupération de la couche des départements
var fs_departements = FeatureSetByPortalItem(
    myportal,
    '694e1ed261b54a539b84cba47640b710',
    5,
    ['*'],
    true
);

// Récupération de la couche des observations iNaturalist
var fs_observations = FeatureSetByPortalItem(
    myportal,
    '99e3e9ccfaec422db6d4266569aa19d7',
    0,
    ['*'],
    false
);

// Création du tableau pour les nouvelles entités
var new_features = []

// On boucle sur chaque département
for (var dept in fs_departements) {
    // Récupérer les points qui intersectent ce polygone
    var pts = Intersects(dept, fs_observations);

    // On compte le nombre de points
    var nb_points = Count(pts);

    // On crée une nouvelle entités
    var feat = {
        attributes: {
            "Département": dept["NOM_DEP"],
            "Nb_Observations": nb_points
        }
    };
    Push(new_features,feat);
}

// Création du nouveau FeatureSet
var new_featureset = {
    fields: [
        // Schéma de la table
        { name: "Département", type: "esriFieldTypeString" },
        { name: "Nb_Observations", type: "esriFieldTypeInteger" },
    ],
    // 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, par exemple, être utilisé dans un tableau de bord pour créer ce diagramme à secteurs :



A travers ces 3 exemples, vous avez pu découvrir comment utiliser des expressions de données avec Arcade pour agréger dynamiquement sur un ou plusieurs champ(s) ou selon des critères spatiaux. 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: