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é.
// 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 :
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 :
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 :
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 :
Bonne route sur ArcGIS Online !
Pour retrouver l'ensemble des Conseils & Astuces ArcGIS Online,
cliquez sur ce lien.
0 comments :
Enregistrer un commentaire