Le blog francophone consacré
aux technologies Esri

Quelques expressions Arcade pour booster vos formulaires dans ArcGIS Field Maps


Apparues dans ArcGIS Field Maps lors de la mise à jour de mars dernier, les expressions calculées des formulaires de saisie permettent d'améliorer à la fois la productivité et la qualité des données collectées sur le terrain. Que cela soit pour calculer automatiquement un champ en fonction de la valeur d'autres champs, pour stocker l'emplacement du point saisie en tant qu'attribut ou encore l'extraction automatique d'attributs à partir d'enregistrements associés ou issus d'autres couches de la carte. Dans cet article de blog, je vous propose de voir des cas d'usages très courants avec les exemples de code correspondant pour vous permettre d'être opérationnel avec des expressions calculées dans vos propres formulaires.

Si vous n'êtes pas familier avec le langage d'expressions Arcade, vous pouvez lire la documentation ou essayer de l'utiliser dans l'outil de test en ligne. Pour obtenir des instructions détaillées sur la façon d'ajouter des expressions Arcade et automatiser ainsi le calcul de champs dans un formulaire, vous consulterez la rubrique Ajouter des expressions calculées de l'aide en ligne. 
 
Ajout d'une expression de calcul Arcade sur un champ dans un formulaire
de saisie avec l'interface web d'ArcGIS Field Maps

Interface de saisie des expressions Arcade pour les calculs de formulaire
dans l'interface web d'ArcGIS Field Maps


Voyons donc quelques exemples de ce qui est possible !


1. Récupérer un attribut du polygone dans lequel se trouve l'entité saisie

Parfois, il peut être utile de récupérer un attribut (le nom par exemple) de la zone géographique dans laquelle une entité a été collectée. Auparavant cela pouvait être fait manuellement en sélectionnant ce nom dans une liste de valeurs préalablement configurée ou via un post-traitement sur les données. Désormais, cela peut être automatisé sur le terrain en utilisant un champ calculé dans le formulaire. Ce dernier peut effectuer une intersection spatiale entre l'entité saisie (ou modifiée) et une couche de polygones représentant ces zones géographiques.

Exemple : Vous saisissez des emplacements de parking et vous souhaitez renseigner automatique le quartier dans lequel ils se trouvent.


// Récupérer le jeu d'entités à partir de la couche "Quartiers"
// qui se trouve dans la carte
var Quartiers = FeatureSetByName($map, 'Quartiers', ['Nom'])

// Intersecter l'emplacement courant du parking ($feature) avec
// les quartiers et récupérer le premier (si jamais il y en avait plusieurs)
var quartier = First(Intersects($feature, Quartiers))

// Si l'emplacement du parking intersecte bien un quartier alors on
// retourne le nom du quartier, sinon retourne la valeur null
if (!IsEmpty(quartier)) {
    return quartier['Nom']
} else {
    return null
}



2. Récupérer un attribut à partir d'un enregistrement associé

Lors de l'inspection d'équipements, on utilise souvent une table pour saisir les inspections et cette dernière est généralement associée à une couche d'entités "parent" qui contient les équipements eux-mêmes. Il est alors souvent nécessaire de récupérer des attributs de l'entité "parent" (référence, propriétaire, adresse, type d'équipement, date d'installation, ...). Ces attributs peuvent être extraits de la couche "parent" en interrogeant les enregistrements associés et en accédant aux attributs nécessaires.

Exemple : J'inspecte les extincteurs de mes bâtiments et j'ai besoin d'enregistrer l'ID de l'équipement à chaque inspection.

// Récupérer le jeu d'entités des extincteurs à partir de la relation "Rel_Ext_Insp" 
// avec le champ "id_ext" 
var extincteurs = FeatureSetByRelationshipName($feature, 'Rel_Ext_Insp', ['id_ext'], true)
// Récupération du premier extincteur retourné (au cas où il y en aurait plusieurs)
var extincteur = First(extincteurs)

// Si un extincteur est trouvé, récupération du id_ext
// Sinon, on retourne la valeur null 
if (!IsEmpty(extincteur)) {
    return extincteur['id_ext']
} else {
    return null
}


3. Récupérer automatiquement le nom, l'adresse e-mail ou le nom d'utilisateur de l'opérateur

Lors de la modification ou de la collecte de nouvelles données, l'option "suivi de l'éditeur" sur la couche fonctionne très bien pour stocker le nom d'utilisateur de la personne qui a créé ou modifié l'entité. Cependant, cela ne stocke pas le nom complet ni l'adresse e-mail de l'utilisateur. Ces attributs supplémentaires peuvent faciliter la compréhension des données lorsqu'elles sont affichées dans des rapports, des cartes et des tableaux de bord. Cela peut être accompli en obtenant les informations de l'utilisateur actuellement connecté via Arcade.

Exemple 1 : Je réalise un bilan de santé des arbres remarquables et je dois fournir mon nom.

// La fonction GetUser d'Arcade permet de retourner le nom complet de l'utilisateur
// actuellement connecté (à la couche courante)
return GetUser($layer).fullName

Exemple 2 : Je réalise un bilan de santé des arbres remarquables et je dois fournir mon adresse email.

// La fonction GetUser() d'Arcade permet de retourner l'email de l'utilisateur
// actuellement connecté (à la couche courante)
return GetUser($layer).email

Remarque : dans la version 22.2 de Field Maps, ces exemples ne fonctionnent pas en mode déconnecté.


4. Calculer la date et l'heure actuelles

Lors de l'exécution de la collecte ou de la mise à jour de données, il est souvent utile de définir la date d'inspection sur la date et l'heure actuelles. Bien que l'opérateur mobile puisse le faire dans l'application mobile en quelques clics, ou à l'aide de l'option "suivi de l'utilisateur", il peut être plus efficace de remplir automatiquement ces informations à l'aide d'une expression Arcade et de maitriser le format de la date par exemple.

Exemple : Je suis en train de remplir un rapport d'inspection des dommages et je dois fixer la date de l'inspection.

// La fonction Now() revoit la date et heure courante
return Now()


5. Stocker l'emplacement en tant qu'attribut

Pour l'intégration avec d'autres systèmes, il peut être utile de stocker les valeurs x, y, z ou m de l'entité (ponctuelle) dans les attributs de la couche. Cela peut être fait en accédant à la géométrie de l'entité via Arcade.

Exemple : J'ai besoin de stocker les valeurs x et y des panneaux de signalisation que je collecte en tant qu'attributs afin de pouvoir les importer dans un système métier externe sansavoir à réaliser de post-traitement.


// Récupération de la géométrie
var geom = Geometry($feature)
if (IsEmpty(geom)) {
    return null
} else {
    // Retourne la coordonnée X de la géométrie
    return geom.X
}

Parfois, les emplacements x et y (projetés) ne sont pas ce dont vous avez besoin. Vous aurez parfois besoin de la latitude et de la longitude. Si votre carte et vos données utilisent la projection Web Mercator Projection, vous pouvez écrire du code pour calculer la latitude et la longitude à partir des valeurs de compteur x, y.

Exemple : J'ai besoin de stocker les valeurs de latitude et de longitude pour me conformer à certaines spécifications de collecte de données standard.


// Création d'une fonction qui convertit les x,y (Web Mercator) en lat, long
function MetersToLatLon(geometry) {
    if (IsEmpty(geometry)) {
        return [null, null]
    }
    var originShift = 2.0 * PI * 6378137.0 / 2.0    
    var lon = (geometry.x / originShift) * 180.0
    var lat = (geometry.y / originShift) * 180.0 
    lat = 180.0 / PI * (2.0 * Atan(Exp(lat * PI / 180.0)) - PI / 2.0)    
    return [Round(lat,6), Round(lon,6)]
}

// Appelle de la fonction pour retourner la latitude [1] ou la longitude [0]
return MetersToLatLon(Geometry($feature))[0]


6. Calculer une valeur à partir des d'autres champs

Il est parfois utile de calculer une valeur basée sur un ou plusieurs valeurs de champs que l'utilisateur mobile a préalablement rempli.

Exemple : J'ai besoin de calculer le score moyen des dégats constatés sur des bâtiments suite à une inondation pour pouvoir utiliser cet indicateur quand mes collègues feront un rapport d'évaluation des dommages. Ainsi à l'aide du score relative à la toiture, aux fondations et aux structures internes, j'ai besoin de moyenner automatiquement ces 3 scores en une seule valeur.

var val1 = $feature["score_toiture"]
var val2 = $feature["score_fondation"]
var val3 = $feature["score_interieur"]
return (val1 + val2 + val3) / 3

 
Nous avons montré ici que quelques exemples, mais vous pouvez faire bien plus de choses encre avec Arcade et les calculs de formulaire. J'en profite donc pour vous rappeler cet article arcOrama dans lequel je vous proposais de nombreux exemples d'expression Arcade qui pourront vous aider à aller plus loin dans ce contexte de calculs de formulaires.

Partager cet article:

Rejoindre la discussion

    Les commentaires à propos de cet article: