Créer un outil de script Python à l'aide de arcpy.nax

Disponible avec une licence Network Analyst.

Vous pouvez utiliser le module Python arcpy.nax pour automatiser les processus d'analyse de réseau. Une fois que vous avez écrit un script Python à l'aide du module arcpy.nax, vous pouvez le transformer en outil de script pour pouvoir l'exécuter comme tout autre outil de géotraitement. Dans ce didacticiel, vous allez apprendre à coder un simple processus d'analyse de réseau et à configurer un outil de script pour l'exécuter.

Remarque :

Dans ce didacticiel, vous allez apprendre à créer un outil de script dans une boîte à outils .atbx, mais vous pourrez également créer un outil de géotraitement personnalisé avec Python et le module arcpy.nax à l'aide d'une boîte à outils Python (.pyt). Découvrez les différences entre un outil de script et une boîte à outils Python (.pyt). Nombre de leçons de ce didacticiel s'appliquent aux deux types d'outils.

L'outil de script que vous allez créer dans ce didacticiel exécutera une analyse des zones de desserte et écrira les polygones résultants des zones de desserte dans une classe d'entités.

Remarque :

Ce didacticiel utilise l'analyse des zones de desserte comme exemple, mais vous pouvez créer un outil de script pour exécuter tout type d'analyse de réseau.

L'outil inclura les paramètres suivants, qui peuvent être définis par ses utilisateurs :

  • Input Facilities (Ressources en entrée) : points autour desquels les polygones de la zone de desserte seront calculés
  • Output Polygons (Polygones en sortie) : classe d’entités en sortie créée par l'outil
  • Network (Réseau) : jeu de données réseau ou service d'analyse de réseau permettant de calculer les zones de desserte
  • Travel Mode (Mode de déplacement) : mode de déplacement utilisé pour l'analyse
  • Cutoffs (Limites) : temps ou distance de trajet limite de la zone de desserte
  • Cutoff Units (Unités de limite) : unités de temps ou de distance dans lesquelles la valeur du paramètre Cutoffs (Limites) doit être interprétée.
  • Time Of Day (Heure du jour) : date et heure du jour à utiliser pour l'analyse
Affiche la boîte de dialogue de l'outil de script que vous créerez dans ce didacticiel alimenté avec des entrées valides.

Collecter les données de test

Ce didacticiel a pour objectif de créer un outils de script pouvant être utilisé avec toutes données en entrée. Aucune donnée spécifique n'est requise, mais vous devez disposer des éléments suivants pour tester l'outil de script :

  • Un jeu de données réseau ou un accès à un service d'analyse de réseau
  • Une classe d'entités ponctuelles avec des points de test dans la même zone géographique que le réseau

Si vous ne disposez pas de vos propres données, vous pouvez télécharger et utiliser les données fournies par le didacticiel.

Remarque :
Assurez-vous que vous êtes connecté à votre compte ArcGIS Online. Vous pouvez suivre ce didacticiel en utilisant comme source de données réseau le jeu de données réseau désigné du didacticiel, ArcGIS Online ou un service de calcul d’itinéraire ArcGIS Enterprise publié à l’aide d’un jeu de données réseau qui couvre la zone géographique des données en entrée de l’analyse. Si vous utilisez ArcGIS Online, des crédits sont utilisés.

En savoir plus sur l'analyse de réseau à l'aide d'un service.

Conseil :

Ces données comprennent un outil de script achevé, créé en suivant les étapes de ce didacticiel. Il se trouve dans le dossier Tutorial\ScriptTool des données de didacticiel extraites.

  1. Accédez à la page de téléchargement des données.
  2. Cliquez sur le bouton Download (Télécharger) et enregistrez le fichier localement.
  3. Décompressez le fichier téléchargé.

Créer l'outil

Tout d'abord, vous allez créer l'outil dans une nouvelle boîte à outils et en définir les paramètres en entrée et en sortie.

Créez la boîte à outils

Créez une boîte à outils pour enregistrer votre outil de script.

  1. Ouvrez ArcGIS Pro et créez un projet avec une carte.
  2. Dans la fenêtre Catalog (Catalogue), qui se trouve par défaut sur le côté droit de l’application, cliquez avec le bouton droit sur Folders (Dossiers) et choisissez Add Folder Connection (Ajouter la connexion au dossier) Ajouter la connexion au dossier.

    La boîte de dialogue Ajouter la connexion au dossier apparaît.

  3. Connectez-vous à un dossier de votre choix.

    Vous allez créer la boîte à outils et enregistrer le fichier Python .py de l'outil de script dans ce dossier.

  4. Cliquez avec le bouton droit sur la connexion au dossier et sélectionnez New (Nouveau) > Toolbox (.atbx) (Boîte à outils (.atbx)).

    Un fichier de boîte à outils avec l'extension .atbx est créé. Le nom de la boîte à outils est placé en mode de mise à jour.

  5. Remplacez le nom de la boîte à outils par TutorialScriptTool.atbx.
  6. Cliquez avec le bouton droit de la souris sur la boîte à outils et sélectionnez Properties (Propriétés).

    La boîte de dialogue Toolbox Properties (Propriétés de la boîte à outils) apparaît.

  7. Dans la zone Label (Étiquette), remplacez l'étiquette de la boîte à outils par Outil de script du didacticiel.
  8. Dans la zone Alias (Alias), remplacez l'alias de la boîte à outils par TutorialScriptTool.

    L'alias de la boîte à outils est utilisé lors de l'appel d'un outil à partir d'un traitement Python.

    Boîte de dialogue
  9. Cliquez sur OK (OK) pour fermer la boîte de dialogue Toolbox Properties (Propriétés de la boîte à outils).

Créer l'outil de script dans la boîte à outils

Créez ensuite l'outil de script dans la boîte à outils et mettez à jour ses propriétés de base.

  1. Cliquez avec le bouton droit sur la boîte à outils que vous avez créée dans la section précédente et sélectionnez New (Nouveau) > Script (Script).

    La boîte de dialogue Propriétés de l'outil s'affiche.

  2. Dans la liste des onglets latéraux, cliquez sur l'onglet General (Général) s'il n'est pas déjà sélectionné.
  3. Dans la zone de texte Name (Nom), saisissez ServiceAreaTutorialScriptTool.

    Ce nom est utilisé lors de l'appel de l'outil à partir d'un traitement Python. Utilisez uniquement des caractères alphanumériques pour le nom. Ce dernier ne doit pas comporter d’espace ou de caractère spécial.

  4. Dans la zone de texte Label (Étiquette), saisissez Outil de script du didacticiel sur les zones de desserte.

    L’étiquette correspond au nom d’affichage de l’outil de script, comme illustré dans la fenêtre Geoprocessing (Géotraitement), et peut contenir des espaces.

    Boîte de dialogue
  5. Dans la zone de texte Description (Description), saisissez une description pour l'outil de script, si vous le souhaitez.

Définir les paramètres de l'outil

L'étape suivante consiste à définir les paramètres de l’outil. Les paramètres apparaissent dans la boîte de dialogue de l'outil et permettent à l'utilisateur de sélectionner les données en entrée, les localisations en sortie et d'autres options. Lorsque l'outil est exécuté, les valeurs des paramètres sont envoyées à son script Python. Le script récupère les valeurs des paramètres et les utilise dans l'analyse.

Vous allez créer sept paramètres, comme décrit au début de ce didacticiel.

En savoir plus sur la définition des paramètres des outils de script

  1. Dans la liste des onglets latéraux, cliquez sur l'onglet Parameters (Paramètres).
  2. Pour créer le paramètre Input Facilities (Ressources en entrée), effectuez les sous-étapes suivantes :

    Le paramètre Input Facilities (Ressources en entrée) permet à l'utilisateur de sélectionner une classe d’entités ou une couche de points autour de laquelle les polygones de la zone de desserte seront calculés.

    1. Cliquez sur la première cellule vide figurant sous la colonne Label (Étiquette), saisissez Ressources en entrée, puis appuyez sur Entrée.

      Le paramètre Input Facilities (Ressources en entrée) est créé. La cellule de la colonne Name (Nom) est automatiquement mise à jour avec Input_Facilities.

    2. Cliquez sur le bouton Options (Options) Options dans la cellule Data Type (Type de données) pour ouvrir la boîte de dialogue Parameter Data Type (Type de données des paramètres).
    3. Dans la boîte de dialogue Parameter Data Type (Type de données des paramètres), dans le menu déroulant, sélectionnez Feature Layer et cliquez sur OK (OK) pour fermer la boîte de dialogue.
      Boîte de dialogue Parameter Data Type (Type de données des paramètres) avec le type Feature Layer (Couche d’entités) sélectionné.

      Un paramètre de type Feature Layer (Couche d’entités) permet à l'utilisateur de l'outil de sélectionner une couche de la carte ou d'utiliser un chemin de catalogue vers une classe d’entités comme entrée de ce paramètre.

    4. Cliquez sur la cellule dans la colonne Filter (Filtre). Faites défiler l'affichage vers la droite pour rechercher cette colonne si nécessaire.
    5. Utilisez le menu déroulant pour sélectionner l'option Feature Type (Type d'entité).
      Sélectionnez le filtre Feature Type (Type d'entité) pour le paramètre Input Facilities (Ressources en entrée).

      La boîte de dialogue Feature Type Filter (Filtre par type d'entité) apparaît.

    6. Dans la boîte de dialogue Feature Type Filter (Filtre par type d'entité), sélectionnez l'option Point (Point) et cliquez sur OK (OK) pour fermer la boîte de dialogue.
      Boîte de dialogue Feature Type Filter (Filtre par type d'entité) avec option Point (Point) sélectionnée

      Les ressources des zones de desserte doivent correspondre à des points. Une fois que vous avez défini ce filtre par type d'entité, le paramètre Input Facilities (Ressources en entrée) n'autorise que les couches et les classes d'entités ponctuelles comme entrées. Si l'utilisateur sélectionne une classe d’entités linéaire ou surfacique, par exemple, le paramètre d'outil affiche automatiquement une erreur.

  3. Pour créer le paramètre Output Polygons (Polygones en sortie), effectuez les sous-étapes suivantes :

    Le paramètre Output Polygons (Polygones en sortie) permet à l'utilisateur de sélectionner l'emplacement dans lequel l'outil enregistrera la classe d'entités surfacique des zones de desserte créée lors de son exécution.

    1. Cliquez sur la première cellule vide figurant sous la colonne Label (Étiquette), saisissez Polygones en sortie, puis appuyez sur Entrée.

      Le paramètre Output Polygons (Polygones en sortie) est créé. La cellule de la colonne Name (Nom) est automatiquement mise à jour avec Output_Polygons.

    2. Comme pour la définition du type de données du paramètre Input Facilities (Ressources en entrée), cliquez sur la cellule Data Type (Type de données) pour ouvrir la boîte de dialogue Parameter Data Type (Type de données des paramètres). Cette fois, définissez le type de données sur Feature Class (Classe d’entités).

      Un paramètre en sortie de type Feature Class (Classe d’entités) permet à l'utilisateur de l'outil de choisir le chemin de catalogue vers une nouvelle classe d’entités ou un nouveau shapefile.

    3. Cliquez sur la cellule de la colonne Direction (Direction), puis, dans le menu déroulant, sélectionnez l'option Output (Sortie).

      Ce paramètre étant configuré comme paramètre de sortie, l'utilisateur peut choisir un nom et un chemin de fichier en sortie pour une classe d’entités qui n'existe pas encore.

  4. Pour créer le paramètre Network (Réseau), effectuez les sous-étapes suivantes :

    Le paramètre Network (Réseau) permet à l'utilisateur de choisir le jeu de données réseau ou service d'analyse de réseau permettant de calculer les zones de desserte.

    1. Cliquez sur la première cellule vide figurant sous la colonne Label (Étiquette), saisissez Réseau, puis appuyez sur Entrée.

      Le paramètre Network (Réseau) est créé. La cellule de la colonne Name (Nom) est automatiquement mise à jour avec Network (Réseau).

    2. Dans la colonne Data Type (Type de données), définissez le type de données sur Network Data Source (Source de données réseau).

      Le type de paramètre Network Data Source (Source de données réseau) permet à l'utilisateur de sélectionner une couche de jeu de données réseau, un chemin de catalogue de jeu de données réseau ou l'URL d'un service d'analyse de réseau. Pour un paramètre de type Network Dataset Layer (Couche de jeu de données réseau), l'utilisateur ne peut sélectionner qu'une couche de jeu de données réseau ou un chemin de catalogue de jeu de données réseau ; il ne peut pas utiliser d'URL de service. Le type de paramètre Network Dataset (Jeu de données réseau) n'autorise qu'un chemin de catalogue de jeu de données réseau et est utilisé plus souvent comme type de paramètre en sortie que comme entrées.

  5. Pour créer le paramètre Travel Mode (Mode de déplacement), effectuez les sous-étapes suivantes :

    Le paramètre Travel Mode (Mode de déplacement) permet à l'utilisateur de choisir le mode de déplacement utilisé pour l'analyse. Vous allez configurer ce paramètre avec une dépendance de sorte que la liste des choix soit mise à jour automatiquement pour refléter les modes de déplacement disponibles avec la valeur de paramètre Network (Réseau) sélectionnée.

    1. Cliquez sur la première cellule vide figurant sous la colonne Label (Étiquette), saisissez Mode de déplacement, puis appuyez sur Entrée.

      Le paramètre Travel Mode (Mode de déplacement) est créé. La cellule de la colonne Name (Nom) est automatiquement mise à jour avec Travel_Mode.

    2. Dans la colonne Data Type (Type de données), définissez le type de données sur Network Travel Mode (Mode de déplacement réseau).
    3. Cliquez sur la cellule de la colonne Dependency (Dépendance). Faites défiler l'affichage vers la droite pour rechercher cette colonne si nécessaire.
    4. Dans le menu déroulant de la cellule de la colonne Dependency (Dépendance), sélectionnez l'option Network (Réseau).
      Sélectionnez le paramètre Network (Réseau) dans le menu déroulant de la colonne Dependency (Dépendance) du paramètre Travel Mode (Mode de déplacement).

      Le paramètre Travel Mode (Mode de déplacement) est maintenant lié au paramètre Network (Réseau). La boîte de dialogue de l'outil met automatiquement à jour la liste de choix du paramètre Travel Mode (Mode de déplacement) en fonction de la valeur définie dans le paramètre Network (Réseau).

  6. Pour créer le paramètre Cutoffs (Limites), effectuez les sous-étapes suivantes :

    Le paramètre Cutoffs (Limites) permet à l'utilisateur de sélectionner une ou plusieurs valeurs numériques désignant les temps ou distance de trajet limite de la zone de desserte. Les polygones de la zone de desserte indiquent la zone accessible depuis les ressources en entrée, en respectant ces limites. Si plusieurs valeurs sont saisies, un polygone de zone de desserte est créé par ressource pour chaque valeur de limite. Par exemple, la sortie peut inclure des polygones représentant à la fois des temps de trajet de 10 et 15 minutes autour de chaque ressource.

    1. Cliquez sur la première cellule vide figurant sous la colonne Label (Étiquette), saisissez Limites, puis appuyez sur Entrée.

      Le paramètre Cutoffs (Limites) est créé. La cellule de la colonne Name (Nom) est automatiquement mise à jour avec Cutoffs (Limites).

    2. Cliquez sur le bouton Options (Options) Options dans la cellule Data Type (Type de données) pour ouvrir la boîte de dialogue Parameter Data Type (Type de données des paramètres).
    3. Dans la boîte de dialogue Parameter Data Type (Type de données des paramètres), dans le menu déroulant, sélectionnez Double (Double précision).
    4. Dans la boîte de dialogue Parameter Data Type (Type de données des paramètres), sélectionnez l'option Multiple values (Valeurs multiples).
      Boîte de dialogue Parameter Data Type (Type de données des paramètres) avec le type Double (Double précision) et l'option Multiple values (Valeurs multiples) sélectionnés.

      L'option Multiple values (Valeurs multiples) permet à l'utilisateur de saisir plusieurs valeurs pour le paramètre.

    5. Cliquez sur OK (OK) pour fermer la boîte de dialogue Parameter Data Type (Type de données des paramètres).

    Les limites des zones de desserte doivent être supérieures à zéro. Cela n’a pas de sens de créer un polygone représentant un temps de trajet nul ou négatif. Il est possible de configurer un paramètre numérique avec un filtre de plage en sélectionnant l'option Range (Plage) dans la colonne Filter (Filtre). Un message d'erreur est automatiquement affiché si l'utilisateur sélectionne un nombre en dehors de cette plage. Toutefois, les filtres de plage ne prennent en charge que les plages numériques inclusives, mais vous souhaitez exclure la limite inférieure de zéro tout en autorisant les valeurs décimales, telles que 0,5. Par conséquent, au lieu d'utiliser le filtre de plage fourni, vous allez utiliser la validation de l'outil pour créer votre propre filtre de plage à l'aide du code Python. Cette opération est décrite ultérieurement dans ce didacticiel.

  7. Pour créer le paramètre Cutoff Units (Unités de limite), effectuez les sous-étapes suivantes :

    Le paramètre Cutoff Units (Unités de limite) permet à l'utilisateur de spécifier l'unité de mesure dans laquelle la valeur du paramètre Cutoffs (Limites) doit être interprétée.

    1. Cliquez sur la première cellule vide figurant sous la colonne Label (Étiquette), saisissez Unités de limite, puis appuyez sur Entrée.

      Le paramètre Cutoff Units (Unités de limite) est créé. La cellule de la colonne Name (Nom) est automatiquement mise à jour avec Cutoff_Unit.

    2. Dans la colonne Data Type (Type de données), vérifiez que le type de données est défini sur String (Chaîne) et mettez-le à jour si nécessaire.

    Pour configurer une liste de choix pour un paramètre, vous pouvez sélectionner l'option Value List (Liste de valeurs) dans la colonne Filter (Filtre) et saisir la liste de valeurs à présenter à l'utilisateur. Toutefois, pour le paramètre Cutoff Units (Unités de limite), vous souhaitez que la liste de choix soit dynamique selon que l'utilisateur ait sélectionné des unités de temps ou de distance pour la valeur du paramètre Travel Mode (Mode de déplacement). Dans la section suivante, vous allez utiliser la validation de l'outil pour créer une liste de choix dynamique avec un code Python.

  8. Pour créer le paramètre Time Of Day (Heure du jour), effectuez les sous-étapes suivantes :

    Le paramètre Time Of Day (Heure du jour) permet à l'utilisateur de définir la date et l'heure du jour de l'analyse. Il s'agit des date et heure auxquelles les véhicules ou les piétons quittent les ressources. L'heure du jour n'étant pas toujours pertinente, vous allez configurer ce paramètre de sorte qu'il soit facultatif. L'utilisateur peut le définir s'il le souhaite ou le laisser vide.

    1. Cliquez sur la première cellule vide figurant sous la colonne Label (Étiquette), saisissez Heure du jour, puis appuyez sur Entrée.

      Le paramètre Time Of Day (Heure du jour) est créé. La cellule de la colonne Name (Nom) est automatiquement mise à jour avec Time_Of_Day.

    2. Dans la colonne Data Type (Type de données), définissez le type de données sur Date (Date).
    3. Cliquez sur la cellule de la colonne Type (Type), puis, dans le menu déroulant, sélectionnez l'option Optional (Facultatif).

      Ce paramètre étant configuré comme facultatif, l'utilisateur peut le laisser vide sans recevoir d'erreur.

  9. Vérifiez la configuration des paramètres. Elle doit être similaire à celle de l'image suivante :
    Configuration complète des paramètres de l'outil de script
  10. Cliquez sur OK (OK) dans la boîte de dialogue Tool Properties (Propriétés de l'outil) pour valider vos modifications et fermer la boîte de dialogue.

Vérifier les paramètres de l'outil

Maintenant que vous avez configuré les paramètres de l'outil, vous devez vérifier qu'ils fonctionnent correctement. Il reste quelques opérations à effectuer pour configurer la validation personnalisée de certains paramètres et vous ne pouvez toujours pas exécuter l'outil car vous n'en avez pas encore écrit le code d'exécution, mais prenez quelques instants pour vérifier la configuration de vos paramètres jusqu'à présent.

  1. Dans la fenêtre Catalog (Catalogue), recherchez le nouvel outil de script Service Area Tutorial Script Tool (Outil de script du didacticiel sur les zones de desserte) dans la boîte à outils.
    Boîte à outils et outil de script dans la fenêtre Catalog (Catalogue)
  2. Double-cliquez sur l’outil pour l’ouvrir.

    L'outil Service Area Tutorial Script Tool (Outil de script du didacticiel sur les zones de desserte) s'ouvre dans la fenêtre Geoprocessing (Géotraitement). Les sept paramètres que vous avez créés dans la section précédente sont visibles.

    Boîte de dialogue de l’outil de script dans la fenêtre Geoprocessing (Géotraitement) affichant tous les paramètres.
  3. Examinez chaque paramètre et vérifiez qu'il se comporte comme prévu.
    1. Examinez le paramètre Input Facilities (Ressources en entrée).

      Vous ne devez être en mesure de ne sélectionner que des classes d'entités et des couches ponctuelles avec ce paramètre. Les classes d’entités surfaciques et linéaires n'apparaissent pas dans la liste de choix et, si vous en saisissez une, un message d'erreur indique que l'entrée possède un type de géométrie non valide.

      Conseil :
      Aucune liste de choix n'apparaît si votre carte ne contient pas de couche d'entités. Ajoutez des couches à votre carte si vous souhaitez voir le comportement du paramètre.

    2. Examinez le paramètre Output Polygons (Polygones en sortie).

      Vous devez pouvoir choisir la localisation en sortie. Si vous choisissez une classe d’entités existante, le paramètre doit afficher un avertissement indiquant que la sortie existe déjà.

    3. Examinez les paramètres Network (Réseau) et Travel Mode (Mode de déplacement).

      Le paramètre Travel Mode (Mode de déplacement) doit initialement être vide et ne pas avoir de liste de choix. Le paramètre Network (Réseau) doit vous permettre de sélectionner une couche de jeu de données réseau, un chemin de catalogue de jeu de données réseau ou une URL vers un service d'analyse de réseau.

    4. Sélectionnez une valeur pour le paramètre Network (Réseau).

      La liste de choix du paramètre Travel Mode (Mode de déplacement) est mise à jour automatiquement pour inclure la liste des modes de déplacement disponibles associés à la valeur Network (Réseau).

    5. Examinez le paramètre Cutoffs (Limites).

      Vous pouvez saisir plusieurs valeurs numériques.

      Actuellement, vous pouvez saisir des nombres négatifs ou nuls sans que le paramètre n'affiche d'erreur. Par la suite, vous utiliserez la validation de l'outil pour mettre à jour ce comportement.

    6. Examinez le paramètre Cutoff Units (Unités de limite).

      Actuellement, ce paramètre n'affiche pas de liste d'options. Par la suite, vous utiliserez la validation de l'outil pour fournir une liste de choix en fonction de la valeur Travel Mode (Mode de déplacement).

    7. Examinez le paramètre Time Of Day (Heure du jour).

      Contrairement aux autres paramètres, ce paramètre n'affiche pas d'astérisque rouge lorsqu'il est vide, car il est facultatif. Vous pouvez utiliser le sélecteur de date et d'heure ou saisir une date et une heure.

Écrire le script Python

Dans cette section, vous allez écrire le script Python que l'outil de script exécutera. L'outil de script effectue les opérations suivantes :

  • Il récupère les paramètres en entrée.
  • Consultez la licence de l'Extension ArcGIS Network Analyst, si nécessaire.
  • Il initialise l'analyse des zones de desserte.
  • Il définit les paramètres de l'analyse des zones de desserte.
  • Il charge les ressources en entrée.
  • Il calcule l'analyse des zones de desserte et gère les erreurs de calcul.
  • Il écrit les polygones des zones de desserte en sortie dans une classe d’entités.

  1. Il crée un fichier intitulé ServiceAreaTutorialScriptTool.py dans le dossier dans lequel vous avez créé la boîte à outils précédemment et l'ouvre pour le modifier dans l'environnement de développement intégré (IDE) ou l'éditeur de texte de votre choix.

    Vous pouvez utiliser tout éditeur de texte ou environnement IDE Python pour cet exercice.

  2. Lisez les sous-sections ci-après pour comprendre les composants du code que vous utiliserez pour l'outil de script.
  3. Le code complet est inclus à la fin de cette section. Copiez-le et collez-le dans le fichier ServiceAreaTutorialScriptTool.py, puis enregistrez ce fichier.

    Attention :
    Vérifiez que l'indentation du code est correcte une fois que vous l'avez collé dans le fichier ServiceAreaTutorialScriptTool.py.

Récupérer les paramètres en entrée

Le code de l'outil de script doit récupérer les entrées de l'utilisateur dans les paramètres de l'outil à l'aide de la fonction ArcPy GetParameter ou GetParameterAsText. La fonction GetParameter renvoie la valeur du paramètre dans son type de données défini et la fonction GetParameterAsText renvoie toujours la valeur du paramètre sous forme de chaîne.

Dans cet extrait de code, le script récupère les paramètres de l'outil et les affecte à des variables. La fonction GetParameter est utilisée si vous souhaitez conserver le type de données du paramètre en entrée. La fonction GetParameterAsText est utilisée lors de la récupération des ressources en entrée et de la source de données réseau, bien que ces entrées puissent être des couches car les noms de chaîne des couches sont utilisables comme entrées valides des outils de géotraitement et fonctions ArcPy. Les valeurs d'index utilisées ici avec GetParameter et GetParameterAsText correspondent à l'ordre des paramètres que vous avez définis précédemment.

input_facilities = arcpy.GetParameterAsText(0)
output_polygons = arcpy.GetParameterAsText(1)
network = arcpy.GetParameterAsText(2)
travel_mode = arcpy.GetParameter(3)
cutoffs = arcpy.GetParameter(4)
cutoff_units = arcpy.GetParameterAsText(5)
time_of_day = arcpy.GetParameter(6)

Consulter la licence de l'Extension ArcGIS Network Analyst

La licence de l'Extension ArcGIS Network Analyst est requise si l'utilisateur de l'outil sélectionne un jeu de données réseau pour le paramètre Network (Réseau). Si l'utilisateur choisit par contre d'utiliser un service d'analyse de réseau en désignant une URL de portail, la licence de l'Extension ArcGIS Network Analyst n'est pas requise.

Dans cet extrait de code, le script tente de consulter la licence de l'extension si le réseau en entrée ne commence pas par http, ce qui correspond sans doute à un service d'analyse de réseau. Si l'extension n'est pas disponible, une erreur est générée. La gestion des erreurs sera abordée plus loin dans ce didacticiel.

# Check out the Network Analyst extension license if the input network
# is a local network dataset and not a service.
if not network.startswith("http"):
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        # Throw an error if the license cannot be checked out.
        arcpy.AddError("The Network Analyst license is unavailable.")
        raise CustomError

Initialiser l'analyse des zones de desserte

La première étape d'un processus d'analyse de réseau à l'aide de arcpy.nax consiste à instancier l'objet d'analyse du solveur à l'aide de la source de données réseau désignée.

En savoir plus sur les étapes d'un processus d'analyse de réseau avec arcpy.nax

Dans cet extrait de code, l'objet d'analyse des zones de desserte est initialisé.

# Instantiate the ServiceArea solver object
sa = arcpy.nax.ServiceArea(network)

Définir les paramètres de l'analyse des zones de desserte

Pour cette analyse, vous allez précoder certains paramètres de l'analyse des zones de desserte qui ne doivent pas être modifiés par l'utilisateur. Vous définirez les autres paramètres en fonction des choix de l'utilisateur parmi les paramètres d'outil.

En savoir plus sur les paramètres de l'analyse des zones de desserte

Dans cet extrait de code, certains paramètres d'analyse sont précodés. Le mode de déplacement, l'heure du jour et les limites d'impédance par défaut sont définis à l'aide des valeurs récupérées des paramètres de l'outil.

# Hard-code some non-default Service Area settings that we don't want
# the user to change
sa.geometryAtCutoff = arcpy.nax.ServiceAreaPolygonCutoffGeometry.Disks
sa.polygonBufferDistance = 150
sa.polygonBufferDistanceUnits = arcpy.nax.DistanceUnits.Feet

# Set analysis properties chosen by the user and passed in via tool
# parameters
sa.travelMode = travel_mode
sa.timeOfDay = time_of_day
sa.defaultImpedanceCutoffs = cutoffs

Vous devez également définir les unités des limites, mais cela requiert un traitement supplémentaire. Le paramètre d'outil est configuré comme une chaîne et vous devez convertir le nom d'unité de type chaîne en valeur d'énumération TimeUnits ou DistanceUnits appropriée.

Dans cet extrait de code, les unités de temps ou de distance sont définies en fonction de la valeur transmise par le paramètre d'outil à l'aide de deux fonctions pour convertir une valeur de type chaîne en valeur d'énumération appropriée. Dans cet exemple d'outil, nous ne prenons en charge qu'une liste limitée d'unités de temps et de distance possibles. Le paramètre de l'outil sera abordé plus loin dans ce didacticiel.

# Do special handling of cutoff units to convert them to the correct
# arcpy.nax enum
if cutoff_units in ["Hours", "Minutes"]:
    sa.timeUnits = convert_time_units_to_nax(cutoff_units)
elif cutoff_units in ["Kilometers", "Meters", "Miles", "Yards", "Feet"]:
    sa.distanceUnits = convert_distance_units_to_nax(cutoff_units)

Dans cet extrait de code, deux fonctions sont définies pour convertir des noms d'unité de type chaîne en valeur d'énumération correcte. Les valeurs possibles des énumérations TimeUnits et DistanceUnits ne sont pas toutes incluses car, dans cet exemple, vous limitez les choix d'unité présentés aux utilisateurs. Les fonctions génèrent une erreur si une unité non valide est transmise.

def convert_time_units_to_nax(time_units_str):
    """Convert string-based time units to the correct arcpy.nax enum."""
    if time_units_str == "Hours":
        return arcpy.nax.TimeUnits.Hours
    if time_units_str == "Minutes":
        return arcpy.nax.TimeUnits.Minutes
    arcpy.AddError(f"Invalid time units: {time_units_str}")
    raise CustomError


def convert_distance_units_to_nax(dist_units_str):
    """Convert string-based distance units to the correct arcpy.nax enum."""
    if dist_units_str == "Kilometers":
        return arcpy.nax.DistanceUnits.Kilometers
    if dist_units_str == "Meters":
        return arcpy.nax.DistanceUnits.Meters
    if dist_units_str == "Miles":
        return arcpy.nax.DistanceUnits.Miles
    if dist_units_str == "Yards":
        return arcpy.nax.DistanceUnits.Yards
    if dist_units_str == "Feet":
        return arcpy.nax.DistanceUnits.Feet
    arcpy.AddError(f"Invalid distance units: {dist_units_str}")
    raise CustomError

Charger les ressources en entrée

Utilisez ensuite la méthode load pour ajouter les ressources de l'utilisateur dans l'analyse des zones de desserte.

En savoir plus sur les méthodes de définition des entrées des analyses

Dans cet extrait de code, les ressources en entrée sont ajoutées à l'analyse des zones de desserte à l'aide de la méthode load. La valeur d'énumération ServiceAreaInputDataType.Facilities est utilisée comme paramètre de la méthode load pour indiquer que les entrées doivent être ajoutées comme ressources.

# Load the input facilities
sa.load(arcpy.nax.ServiceAreaInputDataType.Facilities, input_facilities)

Calculer l'analyse des zones de desserte et gérer les erreurs de calcul

Maintenant que les paramètres des zones de desserte ont été configurés et que les données en entrée ont été chargées, vous êtes prêt à calculer l'analyse et en récupérer le résultat. Le calcul de l'analyse à l'aide de la méthode de calcul génère une instance d'objet ServiceAreaResult, qui inclut des propriétés et méthodes permettant d'utiliser les sorties de l'analyse.

Dans cet extrait de code, l'analyse des zones de desserte est calculée à l'aide de la méthode solve. La variable result peut être utilisée avec les sorties de l'analyse.

# Solve the analysis
result = sa.solve()

Il arrive qu'une analyse échoue ou qu'elle aboutisse mais renvoie des messages d'avertissement à l'utilisateur sur des éventuels problèmes. Dans votre outil, vous souhaitez renvoyer les erreurs et avertissements du solveur à l'utilisateur. Si le calcul échoue, vous souhaitez arrêter l'exécution de l'outil.

Dans cet extrait de code, la méthode solverMessages de l'objet ServiceAreaResult est utilisée pour récupérer les messages d'avertissement à l'aide de la valeur d'énumération MessageSeverity.Warning. Chaque message d'avertissement reçu est ajouté aux messages d'avertissement de l'outil à l'aide de la fonction AddWarning.

# Print warning messages if there are any
for warning in result.solverMessages(arcpy.nax.MessageSeverity.Warning):
    arcpy.AddWarning(warning[1])

Dans cet extrait de code, vous vérifiez si l'analyse des zones de desserte a abouti, à l'aide de la propriété solveSucceeded de l'objet ServiceAreaResult. Si elle a échoué, la méthode solverMessages est utilisée pour récupérer les messages d'erreur et la fonction AddError les ajoute aux erreurs de l'outil. En outre, une erreur est générée pour arrêter l'exécution de l'outil. La gestion des erreurs est abordée plus loin.

# Handle failed solves
if not result.solveSucceeded:
    arcpy.AddError("The Service Area solve failed.")
    # Print error messages and stop the tool from running further
    for error in result.solverMessages(arcpy.nax.MessageSeverity.Error):
        arcpy.AddError(error[1])
    # Stop tool run by raising an error
    raise CustomError

Écrire les polygones des zones de desserte en sortie dans une classe d’entités

Enfin, vous écrivez la sortie de l'analyse des zones de desserte dans la classe d'entités désignée de l'utilisateur, à l'aide de la méthode export. Vous comptez également le nombre de polygones dans la sortie à l'aide de l'outil count method et écrivez ces informations comme message.

En savoir plus sur les autres moyens d'accéder aux sortie d'une analyse et de les utiliser

Dans cet extrait de code, le nombre de polygones dans la sortie est écrit comme message à l'aide de la fonction AddMessage et les polygones des zones de desserte sont exportés comme classe d’entités. La valeur d'énumération ServiceAreaOutputDataType.Polygons est utilisée avec les polygones en sortie, au lieu de l'un des autres types de sortie d'analyse.

# Add a message with the total number of polygons that were generated
# in the analysis
num_polygons = result.count(
    arcpy.nax.ServiceAreaOutputDataType.Polygons)
arcpy.AddMessage(f"Number of polygons generated: {num_polygons}.")

# Export the Service Area polygons to the output feature class
result.export(
    arcpy.nax.ServiceAreaOutputDataType.Polygons, output_polygons)

Gérer les erreurs

Lorsqu'une erreur connue est rencontrée, vous souhaitez que l'exécution de l'outil s'arrête et qu'un message d'erreur utile soit généré. Pour cela, vous générez une exception personnalisée et encapsulez le code d'exécution de l'outil dans un bloc try/except.

Dans cet extrait de code, une exception personnalisée est définie. Elle ne fait rien de spécial, mais permet d'arrêter l'exécution de l'outil lorsqu'un problème connu est rencontré.

class CustomError(Exception):
    pass

Le code d'exécution de l'outil est encapsulé dans un bloc try/except. Si une CustomError est interceptée, le code ne fait rien car le message d'erreur a déjà été ajouté aux erreurs de l'outil. En cas d'erreur inconnue, le code récupère le retraçage et l'ajoute comme erreur de l'outil pour faciliter le débogage.

try:

    [...]

except CustomError:
    # We caught a known error and already added the message. Do nothing.
    pass

except Exception:
    # An unknown error occurred. Add the traceback as an error message.
    arcpy.AddError(
        "An unknown error occurred when generating Service Areas.")
    import traceback
    arcpy.AddError(traceback.format_exc())

Réunir tous les éléments

L'extrait de code ci-après inclut le script Python complet qui contient tous les composants abordés ci-avant. Vous pouvez copier et coller ce code dans le fichier ServiceAreaTutorialScriptTool.py.

import arcpy


class CustomError(Exception):
    pass


def convert_time_units_to_nax(time_units_str):
    """Convert string-based time units to the correct arcpy.nax enum."""
    if time_units_str == "Hours":
        return arcpy.nax.TimeUnits.Hours
    if time_units_str == "Minutes":
        return arcpy.nax.TimeUnits.Minutes
    arcpy.AddError(f"Invalid time units: {time_units_str}")
    raise CustomError


def convert_distance_units_to_nax(dist_units_str):
    """Convert string-based distance units to the correct arcpy.nax enum."""
    if dist_units_str == "Kilometers":
        return arcpy.nax.DistanceUnits.Kilometers
    if dist_units_str == "Meters":
        return arcpy.nax.DistanceUnits.Meters
    if dist_units_str == "Miles":
        return arcpy.nax.DistanceUnits.Miles
    if dist_units_str == "Yards":
        return arcpy.nax.DistanceUnits.Yards
    if dist_units_str == "Feet":
        return arcpy.nax.DistanceUnits.Feet
    arcpy.AddError(f"Invalid distance units: {dist_units_str}")
    raise CustomError


def generate_service_areas():
    """Generate Service Area polygons."""
    try:
        input_facilities = arcpy.GetParameterAsText(0)
        output_polygons = arcpy.GetParameterAsText(1)
        network = arcpy.GetParameterAsText(2)
        travel_mode = arcpy.GetParameter(3)
        cutoffs = arcpy.GetParameter(4)
        cutoff_units = arcpy.GetParameterAsText(5)
        time_of_day = arcpy.GetParameter(6)

        # Check out the Network Analyst extension license if the input network
        # is a local network dataset and not a service.
        if not network.startswith("http"):
            if arcpy.CheckExtension("network") == "Available":
                arcpy.CheckOutExtension("network")
            else:
                # Throw an error if the license cannot be checked out.
                arcpy.AddError("The Network Analyst license is unavailable.")
                raise CustomError

        # Instantiate the ServiceArea solver object
        sa = arcpy.nax.ServiceArea(network)

        # Hard-code some non-default Service Area settings that we don't want
        # the user to change
        sa.geometryAtCutoff = arcpy.nax.ServiceAreaPolygonCutoffGeometry.Disks
        sa.polygonBufferDistance = 150
        sa.polygonBufferDistanceUnits = arcpy.nax.DistanceUnits.Feet

        # Set analysis properties chosen by the user and passed in via tool
        # parameters
        sa.travelMode = travel_mode
        sa.timeOfDay = time_of_day
        sa.defaultImpedanceCutoffs = cutoffs
        # Do special handling of cutoff units to convert them to the correct
        # arcpy.nax enum
        if cutoff_units in ["Hours", "Minutes"]:
            sa.timeUnits = convert_time_units_to_nax(cutoff_units)
        elif cutoff_units in ["Kilometers", "Meters", "Miles", "Yards", "Feet"]:
            sa.distanceUnits = convert_distance_units_to_nax(cutoff_units)

        # Load the input facilities
        sa.load(arcpy.nax.ServiceAreaInputDataType.Facilities, input_facilities)

        # Solve the analysis
        result = sa.solve()

        # Print warning messages if there are any
        for warning in result.solverMessages(arcpy.nax.MessageSeverity.Warning):
            arcpy.AddWarning(warning[1])

        # Handle failed solves
        if not result.solveSucceeded:
            arcpy.AddError("The Service Area solve failed.")
            # Print error messages and stop the tool from running further
            for error in result.solverMessages(arcpy.nax.MessageSeverity.Error):
                arcpy.AddError(error[1])
            # Stop tool run by raising an error
            raise CustomError

        # Add a message with the total number of polygons that were generated
        # in the analysis
        num_polygons = result.count(
            arcpy.nax.ServiceAreaOutputDataType.Polygons)
        arcpy.AddMessage(f"Number of polygons generated: {num_polygons}.")

        # Export the Service Area polygons to the output feature class
        result.export(
            arcpy.nax.ServiceAreaOutputDataType.Polygons, output_polygons)

    except CustomError:
        # We caught a known error and already added the message. Do nothing.
        pass

    except Exception:
        # An unknown error occurred. Add the traceback as an error message.
        arcpy.AddError(
            "An unknown error occurred when generating Service Areas.")
        import traceback
        arcpy.AddError(traceback.format_exc())


if __name__ == "__main__":
    generate_service_areas()

Configurer l'outil de script pour exécuter le fichier de script Python

Précédemment, vous avez créé l'outil de script et défini ses paramètres. Vous avez ensuite écrit un script Python pour effectuer l'analyse. Vous devez à présent configurer l'outil pour exécuter le script Python. Lorsque vous exécutez l'outil, ce dernier exécute le code du script Python et le script Python récupère les entrées qui lui ont été transmises par les paramètres de l'outil avant de procéder à l'analyse.

  1. Ouvrez la boîte de dialogue des propriétés de l’outil de script en cliquant avec le bouton droit sur l'outil de script et en sélectionnant Properties (Propriétés).

    La boîte de dialogue Propriétés de l'outil s'affiche.

  2. Dans la liste des onglets latéraux, cliquez sur l'onglet Execution (Exécution).
  3. Cliquez sur le bouton Folder (Dossier) Dossier, puis accédez à l'emplacement de votre fichier de script ServiceAreaTutorialScriptTool.py.

    Conseil :
    Si le fichier ServiceAreaTutorialScriptTool.py n'apparaît pas dans la boîte de dialogue de navigation, cliquez sur le bouton Refresh (Actualiser) en regard de la barre d'adresse dans la partie supérieure.Bouton permettant d'actualiser la boîte de dialogue

    Le code affiché dans l'onglet Execution (Exécution) est mis à jour pour afficher le contenu du fichier de script Python. L'outil est maintenant configuré pour exécuter le script Python.

Personnaliser la validation de l'outil

La validation fait référence au traitement qui vérifie et met à jour les valeurs des paramètres d'un outil avant l'exécution de cet outil. Elle permet de s'assurer que les valeurs saisies pour les paramètres sont de type correct ou appartiennent à des plages de valeurs valides. Elle peut également mettre à jour les listes de choix de paramètres, voire masquer ou afficher les paramètres en fonction de la valeur d'autres paramètres.

Certains traitements de validation sont intégrés dans certains types et configurations de paramètres. Par exemple, vous avez précédemment configuré le paramètre Input Facilities (Ressources en entrée) avec un filtre Feature Type (Type d'entité) pour n'accepter que les classe d’entités ponctuelles. Lorsque l'utilisateur sélectionne une entrée pour ce paramètre, la validation vérifie que le type de l'entrée est correct et affiche un message d'erreur si ce n'est pas le cas.

Toutefois, l'auteur d'un outil de script doit parfois implémenter une validation plus sophistiquée ou personnalisée. Cette opération peut être réalisée à l'aide de la classe ToolValidator. Cette classe Python spéciale peut être mise à jour avec un code personnalisé pour mettre à jour les paramètres et effectuer des vérifications qui génèrent des messages d'erreur et d'avertissement si nécessaire.

Dans ce didacticiel, vous allez programmer la classe ToolValidator dans votre outil de script de sorte à générer une erreur si une valeur du paramètre Cutoffs (Limites) est inférieure ou égale à zéro et mettre à jour la liste de choix du paramètre Cutoff Units (Unités de limite) avec une liste d'unités de temps ou de distance selon la valeur du paramètre Travel Mode (Mode de déplacement).

Le code ToolValidator est distinct du script Python exécuté par l'outil, que vous avez écrit précédemment. Il est accessible et modifiable séparément.

Remarque :

Vous pouvez également créer un outil de géotraitement personnalisé dans une boîte à outils Python (.pyt). Dans ce cas, le code de validation et le code d'exécution de l'outil sont tous deux inclus dans le même script Python.

En savoir plus sur les opérations réalisables avec la validation de l'outil de script

Rechercher la classe ToolValidator et l'ouvrir pour la mettre à jour

Lorsque vous créez un outil de script, la classe ToolValidator est automatiquement créée. Vous pouvez y accéder via la boîte de dialogue des propriétés de l'outil de script et l'ouvrir pour la modifier.

  1. Si nécessaire, ouvrez la boîte de dialogue des propriétés de l’outil de script en cliquant avec le bouton droit sur l'outil de script et en sélectionnant Properties (Propriétés).

    La boîte de dialogue Propriétés de l'outil s'affiche.

  2. Dans la liste des onglets latéraux, cliquez sur l'onglet Validation (Validation).

    La classe ToolValidator de l'outil de script est visible. Vous pouvez modifier le code directement dans la boîte de dialogue ou cliquer sur le bouton Open in Script Editor (Ouvrir dans un éditeur de script) pour ouvrir le ToolValidator dans un fichier distinct, dans un environnement IDE ou un éditeur de texte.

    Conseil :

    Vous contrôlez l'environnement IDE ou l'éditeur de texte qui ouvre ce fichier à l'aide du paramètre Script Editor (Éditeur de script) des Options de géotraitement.

Générer une erreur si la valeur du paramètre Cutoffs (Limites) est inférieure ou égale à zéro

La méthode updateMessages de la classe ToolValidator peut être utilisée pour vérifier les valeurs des paramètres et ajouter des messages d'erreur ou d'avertissement. Dans cette section, vous allez modifier la méthode updateMessages de sorte à générer une erreur si une valeur du paramètre Cutoffs (Limites) est inférieure ou égale à zéro.

  1. Recherchez la méthode updateMessages dans la classe ToolValidator.

    Par défaut, la méthode updateMessages ne contient qu'une instruction return. Elle n'effectue pas de validation personnalisée.

  2. Modifiez la méthode updateMessages pour utiliser le code suivant :

    Attention :
    Vérifiez l'indentation du code de validation une fois que vous l'avez collé dans la classe ToolValidator.

    def updateMessages(self):
        # Customize messages for the parameters.
        # This gets called after standard validation.
    
        # Raise an error if any of the cutoffs are <= 0
        cutoffs_param = self.params[4]
        if cutoffs_param.valueAsText:
            for cutoff in cutoffs_param.values:
                if cutoff <= 0:
                    cutoffs_param.setErrorMessage("Cutoffs must be positive.")
                    break
    
        return

    Dans cet extrait de code, un message d'erreur est ajouté au paramètre Cutoffs (Limites) si l'une de ses valeurs est inférieure ou égale à zéro.

    Le paramètre Cutoffs (Limites) est récupéré à l'aide de la variable self.params, qui correspond à une liste de paramètres d'outil intégrée dans la classe ToolValidator. Le paramètre Cutoffs (Limites) étant le cinquième paramètre, il est accessible à l'aide de l'index 4 de la liste. La valeur récupérée correspond à un objet Parameter.

    Si le paramètre est vide, il n'est pas nécessaire de vérifier les valeurs. La propriété valueAsText de l'objet Parameter permet de déterminer rapidement si le paramètre est vide.

    Comme il s'agit d'un paramètre à valeurs multiples, la liste des valeurs est récupérée à l'aide de la propriété values. Le code itère les valeurs actuelles du paramètre.

    Si la valeur limite est inférieure ou égale à zéro, la méthode setErrorMessage de l'objet Parameter est utilisée pour définir un message d'erreur. Ce message apparaît dans le paramètre, dans l'interface utilisateur de l'outil.

    En cas de valeur non valide, l'instruction break arrête l'itération. Il n'est pas nécessaire de vérifier les valeurs restantes une fois qu'une valeur non valide a été détectée.

    Remarque :
    La validation interne de base associée à chaque paramètre reste applicable, même si vous ajoutez un code de validation personnalisé. Par exemple, comme vous avez défini le paramètre Cutoffs (Limites) de sorte que son type soit "double précision", la validation interne vérifie automatiquement que l'entrée est une valeur numérique valide et génère une erreur si nécessaire. Toute validation personnalisée que vous ajoutez pour votre paramètre vient en complément de la validation interne automatiquement fournie pour ce type de paramètre.

Alimenter le paramètre Cutoff Units (Unités de limite) avec une liste d'unités de temps ou de distance

Un mode de déplacement inclut plusieurs paramètres qui contrôlent le mode de modélisation du déplacement à travers un réseau. Il détermine la variable qui est optimisée lors de la recherche du chemin le plus court dans le réseau. Il s'agit en général d'une mesure de temps ou de distance, mais les jeux de données réseau peuvent également être configurés de sorte à optimiser un autre type de variable, tel que le coût énergétique ou monétaire du déplacement.

Le paramètre Cutoffs (Limites) permet à l'utilisateur de spécifier des valeurs numériques pour la limite de coût de déplacement de la zone de desserte. Le paramètre Cutoff Units (Unités de limite) permet à l'utilisateur de spécifier l'unité de mesure dans laquelle ces valeurs doivent être interprétées.

Pour votre outil, vous souhaitez proposer à l'utilisateur une liste d'unités valides, mais, si le mode de déplacement sélectionné optimise le temps, vous souhaitez n'afficher que les unités de temps et s'il optimise la distance, que les unités de distance. Dans les rares cas où le mode de déplacement optimise un autre type de coût, vous ne souhaitez pas afficher les unités de temps ou de distance.

La méthode updateParameters de la classe ToolValidator peut être utilisée pour mettre à jour les listes de choix des paramètres. Dans cette section, vous allez modifier la méthode updateParameters de sorte à définir la liste de choix Cutoff Units (Unités de limite) avec une liste d'unités appropriée, en fonction de la valeur du paramètre Travel Mode (Mode de déplacement).

  1. Recherchez la méthode updateParameters dans la classe ToolValidator.

    Par défaut, la méthode updateParameters ne contient qu'une instruction return. Elle ne met pas à jour les paramètres.

  2. Modifiez la méthode updateParameters pour utiliser le code suivant :

    Attention :
    Vérifiez l'indentation du code de validation une fois que vous l'avez collé dans la classe ToolValidator.

    def updateParameters(self):
        # Modify parameter values and properties.
        # This gets called each time a parameter is modified, before
        # standard validation.
    
        # Set filter list of units in cutoff units parameter based on what type
        # of travel mode is selected
        travel_mode_param = self.params[3]
        cutoff_units_param = self.params[5]
        if travel_mode_param.valueAsText:
            try:
                tm_object = travel_mode_param.value
                if tm_object.impedance == tm_object.timeAttributeName:
                    # The impedance has units of time, so present time units as
                    # options
                    cutoff_units_param.filter.list = ["Hours", "Minutes"]
                elif tm_object.impedance == tm_object.distanceAttributeName:
                    # The impedance has units of distance, so present distance
                    # units as options
                    cutoff_units_param.filter.list = [
                        "Kilometers", "Meters", "Miles", "Yards", "Feet"]
                else:
                    # The impedance has units that are neither time nor
                    # distance, so present only one option, "Other". The
                    # Service Area cutoffs will be interpreted in the impedance
                    # units.
                    cutoff_units_param.filter.list = ["Other"]
            except Exception:
                pass
    
        return

    Dans cet extrait de code, la liste des valeurs possibles du paramètre Cutoff Units (Unités de limite) est mise à jour en fonction de la valeur actuelle du paramètre Travel Mode (Mode de déplacement).

    Les paramètres sont récupérés à l'aide de la variable self.params. Le paramètre Travel Mode (Mode de déplacement) est à l'index 3 (quatrième paramètre) et le paramètre Cutoff Units (Unités de limite), à l'index 5 (sixième paramètre).

    Si le paramètre Travel Mode (Mode de déplacement) est vide, il n'est pas nécessaire de mettre à jour le paramètre Cutoff Units (Unités de limite). La propriété valueAsText de l'objet Parameter permet de déterminer rapidement si le paramètre est vide.

    La valeur du paramètre Travel Mode (Mode de déplacement) est récupérée comme objet TravelMode à l'aide de la propriété value de l'objet Parameter.

    Le moyen le plus simple de déterminer si le mode de déplacement optimise le temps, la distance ou une autre unité de mesure consiste à comparer les propriétés timeAttributeName et distanceAttributeName à la propriété impedance de l'objet TravelMode. La propriété impedance renvoie le nom de l'attribut de réseau optimisé. Les modes de déplacement incluent également un attribut de temps (timeAttributeName) et un attribut de distance (distanceAttributeName) par défaut. Si la propriété impedance correspond à la propriété timeAttributeName, le mode de déplacement optimise le temps et le paramètre Cutoff Units (Unités de limite) est mis à jour de sorte à afficher une liste d'unités de temps. Si la propriété impedance correspond à la propriété distanceAttributeName, le mode de déplacement optimise la distance et le paramètre Cutoff Units (Unités de limite) est mis à jour de sorte à afficher une liste d'unités de distance. Si la propriété impedance ne correspond à aucune de ces propriétés, le mode de déplacement optimise une autre variable et les limites de la zone de desserte sont interprétées dans ces unités. Le paramètre Cutoff Units (Unités de limite) est mis à jour de sorte à n'afficher qu'un seul choix : Other (Autre).

    Dans tous les cas, la liste de choix est spécifiée en définissant la propriété filter.list de l'objet Parameter du paramètre Cutoff Units (Unités de limite).

    Le bloc de code est encapsulé dans un bloc try/except. Si des erreurs sont rencontrées lors de la lecture du mode de déplacement, le code ne fait rien et ne met pas à jour la liste de choix.

Vérifier la validation de l'outil

Dans cette section, vous allez enregistrer et tester le code de validation.

  1. Si vous avez ouvert la classe ToolValidator dans un environnement IDE ou un éditeur de texte, enregistrez et fermez le fichier.
  2. Cliquez sur OK (OK) dans la boîte de dialogue Tool Properties (Propriétés de l'outil) pour valider les modifications.
  3. Dans la fenêtre Catalog (Catalogue), double-cliquez sur l'outil pour l'ouvrir.

    L'outil Service Area Tutorial Script Tool (Outil de script du didacticiel sur les zones de desserte) s'ouvre dans la fenêtre Geoprocessing (Géotraitement).

  4. Saisissez un nombre inférieur ou égal à zéro dans le paramètre Cutoffs (Limites).

    Un symbole d'erreur apparaît sur le paramètre Cutoffs (Limites). Si vous le survolez ou cliquez dessus, votre message d'erreur apparaît dans l'info-bulle.

  5. Vérifiez que la liste de choix du paramètre Cutoff Units (Unités de limite) est mise à jour de sorte à afficher la liste d'unités correcte lorsque vous sélectionnez une valeur dans le paramètre Travel Mode (Mode de déplacement).
    1. Sélectionnez une valeur pour le paramètre Network (Réseau).

      Conseil :
      Si vous utilisez les données fournies par le didacticiel, utilisez le jeu de données réseau, SanFrancisco.gdb/Transportation/Streets_ND, pour le paramètre Network (Réseau). Vous pouvez utiliser le chemin de catalogue vers le jeu de données réseau ou ajouter ce dernier à la carte, puis utiliser sa représentation de couche en tant qu'entrée de l'outil.

      Si le paramètre Network (Réseau) est vide, le paramètre Travel Mode (Mode de déplacement) n'inclut pas de liste de choix. Si une valeur est saisie pour le paramètre Network (Réseau), la liste de choix du paramètre Travel Mode (Mode de déplacement) est mise à jour automatiquement pour inclure la liste des modes de déplacement disponibles associés à la valeur Network (Réseau).

    2. Sélectionnez une valeur pour le paramètre Travel Mode (Mode de déplacement).

      Si le paramètre Travel Mode (Mode de déplacement) est vide, le paramètre Cutoff Units (Unités de limite) n'inclut pas de liste de choix. Si une valeur est saisie pour le paramètre Travel Mode (Mode de déplacement), la liste de choix du paramètre Cutoff Units (Unités de limite) est mise à jour automatiquement de sorte à afficher une liste d'unités de temps ou de distance (ou l'option unique pour Other (Autre)).

Exécuter l’outil

Vous avez créé et configuré l'outil de script, écrit le code de l'outil et personnalisé la validation de l'outil. Il peut maintenant être exécuté et utilisé comme tout autre outil de géotraitement. En plus d'exécuter l'outil à partir de la fenêtre Geoprocessing (Géotraitement), vous pouvez l'ajouter à un modèle, l'appeler à partir d'un script Python et le partager comme outil Web.

  1. Le cas échéant, ouvrez l'outil en double-cliquant dessus dans la fenêtre Catalog (Catalogue).
  2. Sélectionnez des options valides pour chacun des paramètres de l'outil.

    Assurez-vous que les points que vous utilisez pour le paramètre Input Facilities (Ressources en entrée) se trouvent dans la même zone géographique que le réseau utilisé pour le paramètre Network (Réseau).

    Conseil :
    Si vous utilisez les données fournies par le didacticiel, utilisez les jeux de données de la géodatabase SanFrancisco.gdb pour tester l'outil. La classe d'entités des casernes, SanFrancisco.gdb/Analysis/FireStations, peut être utilisée pour le paramètre Input Facilities (Ressources en entrée) et le jeu de données réseau, SanFrancisco.gdb/Transportation/Streets_ND, peut l'être pour le paramètre Network (Réseau). Vous pouvez utiliser les chemins de catalogue vers les données ou ajouter ces dernières à la carte, puis utiliser les couches en tant qu'entrées de l'outil. Une limite appropriée pour la modélisation du temps de réponse des casernes est comprise entre deux et quatre minutes.

  3. Cliquez sur le bouton Run (Exécuter) dans la partie inférieure de l'outil.

    L’outil est exécuté correctement et ajoute une couche surfacique à la carte.

    Remarque :
    L'outil peut générer des messages d'avertissement.