Le blog francophone consacré
aux technologies Esri

Conseils & Astuces ArcGIS Online - N°151

N° 151 - Exploiter des éléments de contenu Arcade "Liste de champs" dans vos fenêtres contextuelles 

Pour terminer ma série d'articles consacré aux éléments de contenu Arcade dans les fenêtres contextuelles (voir les "Conseils & Astuces ArcGIS Online" N°149 et N°150), je vous propose de voir comment définir des contenus de type "Liste de champs". Ces derniers seront utiles lorsque vous souhaiterez présenter des valeurs d'attributs (directes ou calculées) sous la forme d'un simple tableau.


Je vous propose deux cas d'usage où l'utilisation d'éléments de contenu Arcade de type "Liste de champs" est pertinente.


Exemple 1 - Masquer des attributs ou des attributs non renseignés

Dans mon premier exemple, nous disposons d'une couche des établissements cinématographiques en France. Comme dans presque toutes les couches d'un SIG, certaines entités possèdent des attributs non renseignés (valeurs vides ou nulles). 


L'objectif est ici de présenter uniquement les attributs ayant une valeur. On en profitera également pour exclure également certains attributs comme "objectid" et "code insee" qui ne sont pas intéressants, ainsi que "nom" et "commune" que nous préférons placer dans le titre de la fenêtre contextuelle. Pour cela, nous allons ajouter un élément de contenu Arcade et utiliser le modèle "Liste de champs" et rédiger l'expression Arcade suivante :

Expects($feature,"*");

// Initialisation du tableau qui contiendra les attributs pour la liste de champs
var array_fieldInfos=[];
// Initialisation du dictionnaire des paires clés/valeurs pour la liste de champs
var dict_attributs={};
// On souhaite exclure 4 attributs de la liste de champs. "nom" et "commune" sont déjà
// dans le titre de notre fenêtre contextuelle
var attributs_a_retirer=["objectid","code insee","nom","commune"];

// On souhaite avoir une fonction pour réaliser un tri par ordre alphabétique
// la liste des attributs sur le non des alias
function compareAlias(a,b){
if (a['alias']<b['alias'])
return -1;
if (a['alias']>b['alias'])
return 1;
return 0;
}

//On récupère les attributs de la couche
var liste_attributs = Schema($feature).fields

liste_attributs=Sort(liste_attributs, compareAlias)

// On boucle sur chaque attributs pour construire le tableau et le dictionnaire
// à retourner pour un élément de contenu de type "Liste de champs"
for (var a in liste_attributs){
var nom_attribut=liste_attributs[a].name
var alias_attribut=liste_attributs[a].alias
var valeur_attribut=$feature[nom_attribut]
// On exclut les attributs ayant une valeur null, vide et ceux faisant partie
// de la liste d'exclusion
if (!includes(attributs_a_retirer,lower(alias_attribut)) &&
!IsEmpty(valeur_attribut) &&
!ISNan(valeur_attribut) ){
console(alias_attribut)
Push(array_fieldInfos,{"fieldName" : alias_attribut})
dict_attributs[alias_attribut]=valeur_attribut
}
}

return {
type: 'fields',
//title: '',
//description : '',
fieldInfos: array_fieldInfos, // Tableau des attributs à utiliser dans la liste des champs
attributes : dict_attributs // Dictionnaire des paires clés/valeurs pour la liste de champs
}

Dans cet exemple, nous utiliserons la fonction Schema() pour obtenir toutes les informations dont nous avons besoin sur les attributs de la couche. On notera également le type "fields" utilisé pour l'objet JSON retourné par l'expression Arcade. Le résultat final ressemble donc à une liste de champs classique, mais lorsque vous cliquez d'une entité à l'autre, les champs sont masqués ou affichés en fonction de leur valeur.

À partir de là, vous pouvez adapter l'exemple pour mieux gérer l'ordre des champs souhaité ou appliquer des mises en forme supplémentaires.

 
Cet exemple est accessible en live ici.


Recalculer des valeurs d'attributs

Dans ce second exemple, nous utilisons une couche de magasins de jardinage pour lesquels nous disposons, entre autres, d'informations sur les chiffres d'affaires pour les années 2016 à 2022. Les valeurs de ces attributs sont des montants en €. 


L'objectif ici est de construire des fenêtres contextuelles présentant ces chiffres d'affaires sous la forme d'un tableau avec des évolutions annuelles en %, et non en valeur absolue. Pour cela, nous allons ajouter un élément de contenu Arcade et utiliser le modèle "Liste de champs" et rédiger l'expression Arcade suivante :

Expects($feature,"*");

// Initialisation du tableau qui contiendra les attributs pour la liste de champs
var array_fieldInfos=[];
// Initialisation du dictionnaire des paires clés/valeurs pour la liste de champs
var dict_attributs={};

//On récupère les attributs de la couche
var liste_attributs = Schema($feature).fields

// Pour démarrer, la valeur de référence est le CA de l'année 2016
var valeur_reference=$feature.CA2016;

// On boucle sur chaque attributs pour construire le tableau et le dictionnaire
// à retourner pour un élément de contenu de type "Liste de champs"
for (var a in liste_attributs){
var nom_attribut=liste_attributs[a].name
var valeur_attribut=$feature[nom_attribut]
// On ne traite que les attributs correspondants aux chiffres d'affaires
if (Left(nom_attribut,2)=="CA"){
// On calcule l'évolustion du CA par rapport à l'année précédente
var evolution_pourcent= (valeur_attribut-valeur_reference)/valeur_reference
// On ajoute l'attribut au tableau des attributs
Push(array_fieldInfos,{"fieldName" : nom_attribut})
// On ajoute la paire clé/valeur au dictionnaire tout en formattant
// la valeur de l'évolution en % avec les signes + et -
dict_attributs[nom_attribut]=IIf(evolution_pourcent < 0,
Text(evolution_pourcent,"#.## %"),
Text(evolution_pourcent,"+#.## %"));
// La valeur de référence devient le CA de l'année courante
valeur_reference=valeur_attribut
}
}

return {
type: 'fields',
//title: '',
//description : '',
fieldInfos: array_fieldInfos, // Tableau des attributs à utiliser dans la liste des champs
attributes : dict_attributs // Dictionnaire des paires clés/valeurs pour la liste de champs
}

Le résultat final ressemble donc à une liste de champs classique mais uniquement avec les attributs de chiffres d'affaires qui, de plus, sont recalculés en pourcentage d'évolution annuelle.

À partir de là, vous pouvez adapter l'exemple pour effectuer des calculs plus évolués ou appliquer des logiques plus avancées entre les différents attributs.


Cet exemple est accessible en live ici.


J'espère que cette série d'article sur les éléments de contenu Arcade vous aura donné des idées. J'ajouterai juste pour conclure que vous pouvez toujours combiner, dans une même fenêtre contextuelle, des éléments de contenu standards (Lide de champs, Diagramme, Image, Texte) avec un ou plusieurs éléments(s) de contenu Arcade pour obtenir le résultat escompté. N'hésitez pas à me faire part de vos retours autour de la personnalisation des fenêtres contextuelles et d'éventuels sujets que vous souhaitez voir sur ce sujet dans arcOrama. 

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: