Code JSON du projet

Les projets sont généralement configurés dans le concepteur ArcGIS QuickCapture à l’aide d’une interface graphique, mais vous pouvez également modifier le code JSON du projet.

Lorsque vous mettez à jour le code JSON du projet, vous pouvez modifier les propriétés suivantes :

  • userInput - Chaîne fournie par l’utilisateur qui peut servir à renseigner les attributs d’un enregistrement.
  • preferences - Applicable à tous les enregistrements capturés dans un projet.
  • basemap - Carte affichée lors de l’examen des données.
  • dataSources - Répertorie les couches d’entités utilisées par les boutons dans le projet.
  • templateGroups - Représente un groupe de boutons.
  • templates : représente un bouton.
    • captureInfo - Mode de capture des données lorsqu’un bouton est sélectionné. Configurez l’affichage de la carte après la capture (pour la mise à jour de la localisation) et personnalisez le texte d’affichage et l’astuce qui apparaît sur la page de la carte.
    • displayInfo - Apparence d’un bouton.
    • fieldInfo - Valeurs attributaires à capturer pour l’enregistrement.
    • cameraInfo - Mode de capture des photos pour l’enregistrement.
  • tracking : représente la couche de partage de la localisation utilisée par le projet.

Certaines de ces propriétés sont des matrices de propriétés supplémentaires. Les sous-sections suivantes expliquent en détail les matrices de propriétés.

Préférences

Les propriétés suivantes s’appliquent au projet ou à tous les enregistrements capturés dans un projet :

PropriétéDescriptionType de champ
backgroundColor

Couleur d’arrière-plan du projet en tant que valeur hexadécimale HTML.

Chaîne

splitScreen

Afficher les boutons et la carte côte à côte.

Booléen

horizontalAccuracyWarning

Valeur décimale, en mètres, qui définit un seuil recommandé au-dessus duquel la précision horizontale n’est plus considérée comme suffisante. Cette valeur permet de changer la couleur de la précision horizontale affichée sur la page du projet. Cette propriété accepte une valeur maximale de 999 mètres.

Décimal

horizontalAccuracyError

Valeur décimale, en mètres, qui définit un seuil requis au-dessus duquel la précision horizontale n’est plus considérée comme suffisante. Cette valeur est utile pour empêcher l’utilisateur de capturer des enregistrements ou sommets si le seuil n’est pas satisfait. Cette propriété accepte une valeur maximale de 999 mètres.

Décimal

allowEditLocation

Autoriser la mise à jour de la localisation d’un point, dans un délai donné après la capture.

Booléen

distanceThreshold

Distance de déplacement minimale en mètres à partir du dernier sommet ou point capturé avant qu’un nouveau sommet ou point puisse être capturé. La distance par défaut est de 10 mètres.

Décimal

undoThreshold

Le délai en secondes après la capture pendant lequel les enregistrements peuvent être supprimés ou la localisation des enregistrements actualisée.

Décimal

adminEmail

Indique le destinataire des fichiers de récupération des données générés par l’application mobile.

Chaîne

coordinateNotationFormat

Configurez le format de notation de coordonnées du projet affiché dans l’application mobile. Les valeurs prises en charge sont UTM, USNG, MGRS, DD, DDM et DMS. DD est la notation par défaut.

Double

Même si les seuils peuvent être définis à la fois pour horizontalAccuracyWarning et horizontalAccuracyError, la valeur horizontalAccuracyWarning doit toujours être inférieure à l’erreur. Par exemple, si vous définissez une précision horizontale recommandée de 10 mètres et une précision horizontale requise de 30 mètres, et que votre appareil renvoie une précision de 20 mètres, un avertissement s’affiche. Si votre appareil renvoie une précision de 40 mètres, vous ne pouvez pas capturer un enregistrement.

L’exemple suivant montre les préférences définies avec un arrière-plan gris, une précision horizontale recommandée de 10 mètres, aucun seuil de distance et l’adresse e-mail d’administrateur quickcapture@esri.com :

{
   "basemap":{

   },
   "dataSources":[

   ],
   "itemId":"",
   "preferences":{
      "splitScreen":false,
      "backgroundColor":"#f3f3f4",
      "horizontalAccuracyError":null,
      "horizontalAccuracyWarning":10,
      "distanceThreshold":null,
      "undoThreshold":10,
      "adminEmail":"quickcapture@esri.com"
   },
   "templateGroups":[

   ],
   "userInputs":[

   ],
   "version":""
}
Remarque :

Les valeurs décimales doivent utiliser un point comme séparateur décimal. Vous ne devez pas utiliser les séparateurs des milliers. Les virgules ne sont pas acceptées dans l’éditeur JSON.

Fond de carte

Par défaut, la carte d’un nouveau projet correspond au fond de carte par défaut de l’organisation. Lorsque l’utilisateur est connecté à l’application avec un compte d’organisation, il voit le fond de carte par défaut actuel de l’organisation dans ce projet. Si l’utilisateur se déconnecte de l’application, la carte topographique mondiale Esri s’affiche.

Les propriétés suivantes sont utilisées pour identifier une carte à utiliser dans un projet :

PropriétéDescriptionType de champ
type

Carte Web, MMPK, VTPK ou TPK. Lorsque la valeur est nulle, la carte topographique mondiale Esri est utilisée.

Chaîne

itemId

ID d’élément de la carte.

Chaîne

useDefaultBasemap

True (Vrai) (par défaut) ou False (Faux).

Booléen

Les auteurs de projet peuvent remplacer le comportement par défaut en sélectionnant la carte en ligne ou hors connexion de leur choix. Si useDefaultBasemap est défini sur Faux et que la valeur itemId est nulle, le projet utilise la carte topographique mondiale Esri.

L’exemple suivant montre une carte Web requise qui n’est accessible qu’à l’utilisateur qui l’a téléchargée.

{
   "basemap":{
      "type":"WebMap",
      "itemId":fae788aa91e54244b161b59725dcbb2a,
      "useDefaultBasemap":false,
      "required":true,
      "zoomLevel":null
   }
}

Pour montrer aux utilisateurs les données déjà envoyées sur une carte de votre projet, vous pouvez configurer une carte Web contenant les données de projet et la désigner comme fond de carte.

  • La carte Web doit contenir au moins les mêmes couches que le projet. Vous pouvez également inclure d’autres couches.
  • La symbologie définie dans la carte Web permettra de symboliser les entités envoyées.
  • Les données capturées sur l’appareil qui n’ont pas été envoyées sont symbolisées à l’aide de la symbologie QuickCapture par défaut. Par exemple, les points seront symbolisés avec un symbole ponctuel bleu.

Remarque :

Seules les cartes avec la référence spatiale Web Mercator sont prises en charge.

Sources de données

Les propriétés suivantes sont utilisées pour identifier une couche d’entités dans un projet :

PropriétéDescriptionType de champ
dataSourceId

Numéro unique attribué par QuickCapture à ce projet afin d’identifier cette couche dans la matrice. Il ne s’agit pas de l’index de la couche dans le service d’entités. Un projet peut comporter des couches de différents services d’entités.

Entier

featureServiceItemId

ID d’élément du service d’entités contenant cette couche.

Chaîne

URL

URL du point de terminaison REST de la couche d’entités (…/FeatureServer/0). Cette URL doit inclure l’URL complète jusqu’à l’index de la couche.

Chaîne

Une ou plusieurs sources de données peuvent être répertoriées dans la propriété dataSource. Dans l’exemple suivant, deux couches provenant de deux services d’entités différents sont répertoriées :

{
   "basemap":{

   },
   "dataSources":[
      {
         "featureServiceItemId":"1f683747c06c4a7e9843a477b2ab41e0",
         "dataSourceId":0,
         "url":"https://services1.arcgis.com/e7dVfn25KpfE6dDd/arcgis/rest/services/LayerOne/FeatureServer/0"
      },
      {
         "featureServiceItemId":"2b313747c06c4a7e9843a477b2ab41e0",
         "dataSourceId":1,
         "url":"https://services1.arcgis.com/b45KpfE6dEf121/arcgis/rest/services/LayerTwo/FeatureServer/1"
      }
   ],
   "itemId":"",
   "preferences":{

   },
   "templateGroups":[

   ],
   "userInputs":[

   ],
   "version":""
}

Groupes de modèles

Les propriétés suivantes sont utilisées pour définir le mode d’affichage d’un groupe de boutons dans un projet. Chaque groupe de boutons peut utiliser différentes propriétés.

PropriétéDescriptionType de champ
name

Nom du groupe.

Chaîne

label

Étiquette affichée dans le projet pour le groupe.

Chaîne

columns

Nombre de colonnes dans le groupe.

Entier

columnSpacing

Espacement entre les colonnes.

Décimal

rowSpacing

Espacement entre les lignes.

Décimal

backgroundColor

Couleur d’arrière-plan du groupe en tant que valeur hexadécimale HTML.

Chaîne

outlineColor

Couleur de contour du groupe en tant que valeur hexadécimale HTML.

Chaîne

expanded

La valeur par défaut est True (Vrai).

Booléen

labelColor

Couleur de l’étiquette du groupe en tant que valeur hexadécimale HTML.

Chaîne

Modèle

Les propriétés suivantes sont utilisées pour identifier la couche d’entités associée à un bouton :

PropriétéDescriptionType de champ
id

UUID du bouton.

Texte

dataSourceId

Référence la couche cible dans laquelle les données sont stockées. L’ID se rapporte à une source de données dans la matrice des sources de données.

Entier

captureInfo

Les propriétés suivantes décrivent le mode de capture des données :

PropriétéDescriptionType de champ
exclusivityGroup

Valeur définissant un groupe d’exclusivité. Tous les modèles de même valeur sont regroupés, avec le paramètre d’exclusivité défini sur True (Vrai). Lorsque cette propriété est définie, un seul bouton avec cette valeur peut être actif à la fois.

Texte

type

esriGeometryPoint, esriGeometryPolyline ou esriGeometryPolygon.

Chaîne

continuous

Propriété toujours définie sur True (Vrai) pour les lignes et les polygones.

Booléen

editMap

Options de mise à jour de la carte. Choisissez l’affichage après la capture (la valeur par défaut est False), la personnalisation du titre de la carte (la valeur par défaut est nulle) ou la personnalisation de l’astuce cartographique (la valeur par défaut est nulle).

Chaîne

displayInfo

Les propriétés suivantes décrivent l’apparence future d’un bouton :

PropriétéDescriptionType de champ
label

Étiquette sur le bouton.

Chaîne

shape

Rectangle, arrondie ou circulaire.

Chaîne

size

Petit, moyen, grand, très grand, très très grand.

Chaîne

color

Couleur d’arrière-plan du bouton en tant que valeur hexadécimale HTML.

Chaîne

outlineColor

Couleur de contour du bouton en tant que valeur hexadécimale HTML.

Chaîne

outlineWidth

Largeur de contour du bouton.

Décimal

labelColor

Couleur de l’étiquette du bouton en tant que valeur hexadécimale HTML.

Chaîne

labelFontSize

Taille de police de l’étiquette du bouton.

Entier

labelFontWeight

Gras ou normal.

Chaîne

shadowColor

Si aucune valeur n’est fournie, l’application utilise la même valeur backgroundColor que le groupe. Cela signifie que l’ombre n’est pas visible.

Chaîne

image

L’image à afficher avec le bouton au format PNG, JPG ou SVG. Toutes les images sont stockées en tant que ressources de l’élément dans le dossier des images.

Chaîne

fieldInfo

Les propriétés suivantes décrivent les informations attributaires qui sont entrées dans le service d’entités lorsque l’utilisateur appuie sur un bouton. En règle générale, l’auteur d’un projet utilise du texte prédéfini ou des variables de champ pour renseigner les champs de l’enregistrement collecté.

PropriétéDescriptionType de champ
fieldName

Nom du champ.

Chaîne

value

Peut contenir les propriétés répertoriées dans cette rubrique.

Chaîne

cameraInfo

Les propriétés suivantes décrivent le mode de capture et d’enregistrement possible des photos dans un projet. Par défaut, si vous activez la capture de photos pour un bouton, la photo est toujours requise. Vous pouvez rendre la capture de photos facultative en définissant la propriété required sur Faux et spécifier la qualité des photos en modifiant la propriété imageSize.

PropriétéDescriptionType de champ
mode

Aucun (par défaut) : aucune photo n’est associée à l’entité.

Automatique : une photo est prise sans confirmation de la part de l’utilisateur dès que le bouton est sélectionné.

Manuel : un aperçu manuel s’affiche et l’utilisateur contrôle la capture d’une photo.

Chaîne

imageSize

Petite (320 pixels sur le bord le plus long), moyenne (640 pixels sur le bord le plus long), grande (par défaut, 1 280 pixels sur le bord le plus long) ou sans restriction (aucune limite de taille). Si l’application redimensionne l’image, les proportions de l’image capturée sont conservées.

Chaîne

required

True (Vrai) (par défaut) ou False (Faux).

Booléen

maxPhotos

Nombre maximal de photos capturées par un bouton.

Entier

minPhotos

Nombre minimal de photos capturées par un bouton.

Entier

Dans l’exemple suivant, une photo facultative est prise sans confirmation :

{
   "mode":"automatic",
   "imageSize":"unrestricted",
   "required":true
}

notificationsInfo

Les propriétés suivantes sont utilisées pour configurer les notifications dans un projet. Actuellement, la seule notification prise en charge est un webhook.

PropriétéDescriptionType de champ
id

ID unique du webhook (dans le projet).

Chaîne

name

Nom du webhook.

Chaîne

active

True (Vrai) ou False (Faux) (par défaut).

Booléen

created

Date et heure de création du webhook.

Date

modified

Date et heure de dernière modification du webhook.

Date

events

Type d’événement qui déclenche le webhook. Seul l’événement addData est pris en charge.

Chaîne

targetLayerUrl

Couche de service d’entités (y compris l’index de la couche) par rapport à laquelle le webhook a été configuré. Les événements addData sont déclenchés en cas de mise à jour de cette couche.

Chaîne

webhookUrl

URL du webhook à laquelle la charge utile sera envoyée.

Chaîne

includePortalInfo

True (Vrai) (par défaut) ou False (Faux).

Booléen

includeProjectInfo

True (Vrai) (par défaut) ou False (Faux).

Booléen

includeServiceRequest

True (Vrai) (par défaut) ou False (Faux).

Booléen

includeServiceResponse

True (Vrai) (par défaut) ou False (Faux).

Booléen

Dans l’exemple suivant, un seul webhook est présent, mais il est possible d’en configurer plusieurs dans un seul projet :

 "notificationsInfo": {
    "webhooks": [
      {
        "active": true,
        "created": 1502880915000,
        "events": [
          "addData"
        ],
        "id": "ByCjvHpPz",
        "includePortalInfo": true,
        "includeProjectInfo": true,
        "includeServiceRequest": true,
        "includeServiceResponse": true,
        "includeUserInfo": true,
        "modified": 1502881754000,
        "name": "Display name",
        "targetLayerUrl": "https://<serviceurl including layer index>",
        "webhookUrl": "https://<webhookserviceurl>"
      }
    ]
  }

Variables de champ

Lorsque vous utilisez ces variables dans l’éditeur JSON, vous devez entrer le nom de la variable au format ${variable_name}. Dans l’exemple suivant, la variable username est attribuée à un champ nommé NameOfUser :

{
   "fieldName":"NameOfUser",
   "value":"${username}"
}

Variable d’entrée utilisateur

La valeur de la variable userInput est renseignée par l’utilisateur de l’application et peut être appliquée à un ou plusieurs boutons d’un projet. Même si l’utilisateur de l’application saisit la valeur, l’auteur du projet doit définir les boutons et les champs auxquels la variable s’applique.

PropriétéDescriptionType de champ
Id

ID unique de l’entrée utilisateur.

Chaîne

label

L’étiquette s’affiche dans l’application mobile pour décrire la valeur d’entrée attendue de la part de l’utilisateur final. Par exemple, l’étiquette peut être RouteNo, CostCenter ou RouteNo-CostCenter.

Chaîne

fieldType

Type de champ dans lequel la valeur d’entrée utilisateur peut être écrite. Les options sont limitées à esriFieldTypeString, esriFieldTypeDoubleet esriFieldTypeInteger.

Chaîne

required

Indique si la valeur d’entrée utilisateur doit être fournie par l’utilisateur final de l’application mobile avant d’appuyer sur un bouton (mode project (projet)) ou après avoir appuyé sur un bouton (mode button (bouton)).

Booléen

domain

Contrôle l’entrée utilisateur et est limitée à une plage numérique (range), une liste de valeurs prédéfinies (codedValue) ou une saisie de texte, éventuellement avec un masque de saisie (userDefined).

Chaîne

mode

Indique si l’utilisateur est invité à saisir des données au lancement du projet (project) ou lorsqu’il appuie sur un bouton (button).

Chaîne

multiline

Autorise l’entrée de plusieurs lignes de texte. Applicable uniquement lorsque domain est défini sur userDefined.

Booléen

autoCompleteMaxEntries

Indique le nombre de valeurs saisies par l’utilisateur qui sont mises en cache pour une entrée utilisateur de projet.

Entier

showEvent

Indique si la boîte de dialogue d’entrée utilisateur par bouton s’affiche au début d’une capture d’enregistrement ou à la fin. Les options sont onStart et onEnd. La valeur par défaut est onEnd. Applicable uniquement lorsque domain est défini sur userDefined.

Chaîne

showScanner

Indique si le scanner de codes-barres apparaît dans l’entrée utilisateur. Par défaut, cette propriété est définie sur faux. Applicable uniquement lorsque domain est défini sur userDefined.

Booléen

dateTime

Indique l’entrée de date et d’heure. Applicable uniquement lorsque domain est défini sur userDefined. Peut être contraint par les valeurs suivantes : defaultValue, displayTime, maxValue et minValue.

Date

Pour savoir quand utiliser chaque mode, reportez-vous à la rubrique Variable d’entrée utilisateur de projet ou Variable d’entrée utilisateur par bouton.

Il est recommandé de gérer les domaines dans le service d’entités. Le concepteur Web lit les informations de domaine directement depuis le service d’entités pour créer l’entrée utilisateur. Les informations de domaine ne sont pas écrites automatiquement dans le code JSON du projet.

L’application mobile lit les informations de domaine directement depuis le service d’entités et les stocke localement sur l’appareil. Si vous ajoutez ou modifiez des valeurs de domaine dans le service d’entités, vous devez réenregistrer le projet afin d’inviter l’utilisateur à mettre à jour le projet et voir les changements.

Attention :

L’auteur d’un projet peut choisir de définir manuellement les informations de domaine directement avec le code JSON du projet. Ceci remplace tout ce qui est lu depuis le service d’entités. L’auteur est chargé de s’assurer que toutes les valeurs définies se trouvent dans les limites des valeurs définies dans le service d’entités. Vous pouvez par exemple opter pour cette solution pour définir un sous-ensemble de valeurs codées dans le projet à partir d’une liste beaucoup plus longue dans le service d’entités.

L’exemple suivant montre comment une entrée utilisateur de domaine range est définie pour restreindre la saisie de données à un nombre compris entre 1 et 100 :

{
   "userInputs":[
      {
         "autoCompleteMaxEntries":5,
         "id":"001",
         "label":"Enter route number",
         "fieldType":"esriFieldTypeInteger",
         "required":true,
         "mode":"project",
         "domain":{
            "type":"range",
            "name":"route no",
            "range":[
               1,
               100
            ]
         }
      }
   ]
}

L’exemple suivant montre comment une entrée utilisateur de domaine codedValue est définie pour limiter la saisie de données à la sélection d’une des trois valeurs :

{
   "userInputs":[
      {
         "autoCompleteMaxEntries":5,
         "id":"001",
         "label":"Enter class",
         "fieldType":"esriFieldTypeString",
         "required":true,
         "mode":"project",
         "domain":{
            "type":"codedValue",
            "name":"Class",
            "codedValues":[
               {
                  "name":"Principle",
                  "code":"Principle"
               },
               {
                  "name":"Classified (Non-principle)",
                  "code":"Classified"
               },
               {
                  "name":"Unclassified",
                  "code":"Unclassified"
               }
            ]
         }
      }
   ]
}

L’exemple suivant montre comment une entrée utilisateur de texte userDefined est définie pour autoriser la numérisation d’un QR Code au commencement de la capture d’une ligne :

{
   "userInputs":[
      {
         "id":"001",
         "label":"Scan QR code",
         "fieldType":"esriFieldTypeString",
         "required":true,
         "mode":"button",
         "domain":{
            "type":"userDefined",
            "name":"line identifier",
            "multiline":false,
            "showScanner":true,
            "showEvent":"onStart"
            "hint":"Scan QR code or type the identifier of the line to be captured"
         }
      }
   ]
}

L’exemple suivant montre comment une entrée utilisateur de domaine userDefined est définie pour autoriser la saisie de données d’une date comprise entre juin et décembre 2022 :

{
   "userInputs":[
      {
         "id":"001",
         "label":"Enter date",
         "fieldType":"esriFieldTypeDate",
         "required":true,
         "mode":"button",
         "domain":{
            "type":"userDefined",
            "name":"followup date",
            "multiline":false,
            "hint":"Enter date between June and December 2022",
            "dateTime": {
               "defaultValue": "${captureTime}",
               "displayTime": true,
               "maxValue": "2022-06-01T00:00:00.000Z",
               "minValue": "2022-12-31T24:59:00.000Z"
            }
         }
      }
   ]
}

L’exemple suivant montre comment une entrée utilisateur de domaine userDefined est définie pour restreindre la saisie de données à un ID d’itinéraire de quatre chiffres :

{
   "userInputs":[
      {
         "id":"001",
         "label":"Enter route number",
         "fieldType":"esriFieldTypeString",
         "required":true,
         "mode":"button",
         "domain":{
            "type":"userDefined",
            "name":"route no",
            "inputMask":"9999",
            "multiline":false,
            "hint":"Enter a four digit route id"
         }
      }
   ]
}

Une fois l’entrée userInput définie, l’auteur du projet peut l’attribuer pour l’utiliser dans un champ. Voici un exemple d’entrée userInput avec un ID de 001 utilisée pour renseigner un champ nommé routeNo :

{
   "fieldInfos":[
      {
         "fieldName":"routeNo",
         "value":"${userInput:001}"
      }
   ]
}

Masque de saisie

Un masque de saisie définit le format de la saisie de données en utilisant des caractères et symboles dans une variable d’entrée utilisateur. Lorsqu’un masque de saisie est appliqué à une variable d’entrée utilisateur, les valeurs saisies par l’utilisateur doivent respecter le modèle défini par le masque de saisie.

Pour appliquer un masque de saisie à votre variable d’entrée utilisateur, définissez le masque dans la propriété userInputs.domain.inputMask.

Reportez-vous à la rubrique Masques de saisie pour obtenir la liste de tous les masques et exemples qu’il est possible d’appliquer aux variables d’entrée utilisateur.

Partage de la localisation

Les propriétés suivantes permettent d’identifier les couches de partage de la localisation :

PropriétéDescriptionType de champ
enabled

Activer le suivi pour le projet. Par défaut, cette propriété est définie sur faux.

Booléen

required

Demander l’activation du suivi pour pouvoir utiliser le projet. Par défaut, cette propriété est définie sur faux.

Booléen

lastKnownLocationsUpdateInterval

Fréquence de mise à jour (en secondes) de la couche de la dernière position connue. La valeur par défaut est fixée à 60 secondes. La valeur minimale est fixée à 5 secondes.

Décimal

tracksUploadInterval

Fréquence (en secondes) de mise à jour de la couche des traces. La valeur par défaut est -1 (désactivée). Vous pouvez également la définir sur 600 secondes.

Décimal

tracksCategory

Définissez la valeur à écrire dans le champ de catégorie de la couche des traces. Il peut s’agir du nom de projet, d’une valeur fixe ou de la valeur d’une entrée utilisateur de projet. Le nom de projet est la valeur par défaut.

Texte

lastKnownLocationsCategory

Définissez la valeur à écrire dans le champ de catégorie de la couche des dernières localisations connues. Il peut s’agir du nom de projet, d’une valeur fixe ou de la valeur d’une entrée utilisateur de projet. Le nom de projet est la valeur par défaut.

Texte

L’exemple suivant montre que le partage de la localisation est activé, mais qu’il n’est pas obligatoire pour utiliser le projet. La dernière position connue sera mise à jour toutes les 60 secondes et les traces seront mises à jour toutes les 600 secondes. Le nom de projet sera écrit dans le champ de catégorie de la couche des dernières localisations connues et de la couche des traces.

{
   "tracking": {
      "enabled": true,
      "required": false,
      "lastKnownLocationsUpdateInterval": 60,
      "tracksUploadInterval": 600,
      "tracksCategory": "${projectName}",
      "lastKnownLocationsCategory": "${projectName}"
   }
}