Cartographie des chantiers de la ville de Québec
ModelBuilder et Arcpy
Présenté à: Véronique Beaulieu et Jonathan Gagnon
Dans le cadre du cours GMT-4015, SIG et Analyse spatiale
Nicolas Massot, Daniel Bélanger, Benjamin Roy
Mandatés par la ville de Québec, qui souhaite disposer d’un système de gestion des chantiers à partir du logiciel ArcGIS Pro, nous avons développé des outils géomatiques permettant d’aider les administrateurs à optimiser la gestion des chantiers sur le territoire. Pour respecter ce mandat, nous avons créé quatre outils. Ceux-ci se démarquent par leur simplicité d’utilisation. En effet, nous avons considéré, conformément aux instructions reçues, que les utilisateurs du système ne sont pas des spécialistes en géomatique, de ce fait, nous avons développé des outils simples d’utilisation. Le présent document fait aussi office de guide d’utilisateur, pour les outils suivants:
Dans une ville telle que Québec, plusieurs types de chantiers peuvent affecter la circulation sur les voies publiques. Il est nécessaire de bien définir les types de chantiers, afin de mieux déterminer les restrictions qui en découlent. En s’inspirant des travaux en cours de réalisation dans la ville de Québec, nous avons établi les catégories de chantiers suivantes:
Le premier outil pouvant être programmé en enchaînant une série de géotraitements existants, nous avons alors opté pour Model Builder puisqu’il s’agit de sa principale fonction.
Quant à eux, les outils 2 et 3 nécessitent d’aller faire des modifications dans les enregistrements des tables attributaires. C’est pour cette raison qu’ils ont été construits à l’aide de scripts Python. En effet, les curseurs sont des objets qui facilitent grandement la modification des tables par rapport aux Model Builder, apportant par le fait même une souplesse d’utilisation absente de ce dernier au niveau de la modification des enregistrements.
L’outil 4 a uniquement été effectué grâce au script python. Nous utilisons cette méthode pour faciliter la cartographie automatisée par ordinateur à l’aide d’ArcPy, en utilisant les attributs et méthodes du module mp.
Notre mandataire étant la ville de Québec, il est naturel d’utiliser comme source le site Données Ouvertes Québec, qui est la source de donnée officielle du gouvernement du Québec. Afin de remplir notre mandat, nous avons utilisé les fichiers de forme correspondant aux voies de circulation ainsi que celle des quartiers de la ville. Il est alors possible de localiser et d’agréger les chantiers par quartiers.
Les données originales étant référencées en WGS 84, nous avons procédé à la transformation des couches dans le système de référence demandé, qui est le NAD83 CSRS MTM7. C’est dans ce dernier système que tous les outils présentés opèrent.
# Donnée | Nom de la donnée | Produit/producteur | Système de coordonnées | Format | Hyperlien |
1 | Quartiers | Ville de Québec | WGS 84 | shp | |
2 | Routes | Ville de Québec | WGS 84 | shp |
Tableau 1. Source des données du projet.
La boîte outil que nous avons développé apparaît ainsi dans le navigateur ArcGis Pro.
L’outil 1 sert principalement à géocoder de nouveaux chantiers en cours sur le territoire de la ville de Québec à l’aide de leurs adresses. Il permet également de leur assigner des informations descriptives telles que le type de travaux, les restrictions mises en place, ainsi que la date de début et de fin. Ces informations sont stockées dans la table nommée « chantier ». Il est ainsi possible de les visualiser dans la carte de ArcGis Pro.
L’outil 2 à deux objectifs. Le premier est de mettre à jour le type de restriction, ainsi que de prolonger ou réduire la date de fin du chantier. Notons que nous sélectionnons un chantier avec l’OBJECTID. Les informations qui ne sont pas modifiées demeureront inchangées par rapport à l’entrée initiale du chantier. Le second objectif de cet outil est de vérifier s’il existe dans la base de données des chantiers qui sont terminés. Pour ce faire, l’outil parcourt tous les chantiers et vérifie si la date de fin est dépassée ou non. Si elle est dépassée, le chantier est supprimé.
L’outil 3 permet de lister les chantiers en cours dans un quartier donné. Ainsi, la sortie de cet algorithme est une table au format .csv, ce qui permet de rendre accessible les informations descriptives à tout un chacun, notamment à ceux qui ne sont pas familiarisés avec les SIG.
L’outil 4 sert à cartographier les travaux en cours dans les différents quartiers de la ville. Il permet de visualiser les chantiers d’un quartier donné. Pour faciliter l’utilisation, la cartographie engendrée peut être exportée sous forme d’un document PDF vectoriel.
Pour tous ces outils, plusieurs informations pertinentes sont aussi présentes dans les métadonnées de chacun des outils. Ces informations sont présentes sous forme de bulles d’informations.
L’objectif de cet outil est de localiser et de lister les différents chantiers en cours dans la ville, tout en considérant le type de travail effectué, les restrictions à la circulation qui seront engendrées et les dates de début et de fin.
Pour faire fonctionner ce premier outil, l’utilisateur doit simplement accéder à la boîte de dialogue et entrer manuellement les informations demandées soit ;
Les types de restriction et de travaux sont déjà disponibles dans les listes de choix prédéfinis, tandis que les dates de début et de fin du chantier sont facilement sélectionnables avec l’utilisation du calendrier. Les bandes déroulantes ainsi que les calendriers faciliteront grandement l’utilisation de l’interface par un néophyte. De plus, pour répondre aux questions potentielles de l’utilisateur, des bulles d’informations sont disposées à chaque entrée de paramètre et permettent de visualiser ce qui est attendu.
Ainsi, l’interface de l’outil correspond à la figure 1 ci-dessous. Les informations munies d’un astérisque rouge doivent obligatoirement être inscrites pour pouvoir démarrer la recherche. Certaines autres informations complémentaires à l’outil sont présentées dans les métadonnées de l’outil.
Par exemple, si un chantier d’élargissement des voies prend place au 17 Rue du Fort à Québec, cause une restriction de réductions des voies, débute le 10 mars et se termine le 26 mars, l’utilisateur devra inscrire ces informations dans le formulaire comme indiqué dans la figure 2 ci-dessus.
Une fois les informations entrées et exécutées, le procédé engendre une nouvelle entrée dans la table nommée « chantier ». Chaque entrée se voit attribuer un OBJECTID unique qui permettra d’identifier le chantier. De plus, grâce à l’adresse mentionnée lors de l’inscription des chantiers, l’exécution localise le lieu de cette entrée et enregistre les coordonnées X et Y du chantier dans des champs dédiés.
Ce deuxième outil fonctionne de pair avec le premier outil. Il s’agit ici de pouvoir modifier et supprimer les chantiers précédemment enregistrés avec l’outil 1. Pour ce faire, la boîte de dialogue de cet outil requiert quelques informations :
Le champ restriction est toujours muni d’une bande déroulante permettant de sélectionner les types de restriction. La sélection de la date de fin est aussi simplifiée par la présence d’un calendrier virtuel. Dans ce formulaire, à l’exception du chemin d’accès de la table chantier, aucune information n’est obligatoire, ce qui permet de modifier uniquement un élément à la fois. Il est aussi possible de modifier simultanément le type de restriction et la date de fin des travaux. Dans le but de supprimer uniquement les chantiers terminés lors de la mise à jour, sans modifier de chantier en cours, il suffit de seulement cocher la casse « Supprimer les chantiers ». Pour faciliter l’utilisation de l’outil, chaque case est munie d’une bulle d’information qui rappelle à l’utilisateur ce qui est attendu d’inscrire à chaque ligne du formulaire. D’autres informations complémentaires sont aussi présentes dans les métadonnées de l’outil.
Par exemple, pour notre table chantier situé dans la gdb projet2_arcpy du dossier X de notre ordinateur. En plus de supprimer les chantiers terminés en cochant la case « Supprimer les chantiers ». Pour le chantier dont l’OBJECTID est 1, nous désirons modifier le type de restrictions pour « Détours » ainsi que la date de fin du chantier pour le 5 mars 2024. L’utilisateur doit inscrire ces informations comme illustrées dans la figure 2 à droite.
La résultante de l’exécution de cet outil est la modification de la table chantier créé précédemment à l’outil 1. Ainsi, les chantiers expirés peuvent être retirés en sélectionnant la case « Supprimer les chantiers ». De plus, les restrictions ainsi que la date de fin de chaque chantier inscrit peuvent être modifiées.
# Importation du module arcpy pour la manipulation de données géospatiales
import arcpy
# Importation de la classe datetime du module datetime pour la gestion des dates
from datetime import datetime
# Définition de la fonction pour mettre à jour et supprimer des chantiers
def update_and_delete_chantiers(chantier, OBJECTID, Restriction=None, Date_fin=None, delete_expired=False):
"""
Met a jour les champs 'Restriction' et 'Date_fin' pour un chantier specifique identifie par son numero,
permettant a l'utilisateur de laisser des valeurs vides pour ne pas les mettre a jour.
Supprime les travaux qui sont terminés si cette fonction est activée.
Args:
chantier (str): Chemin vers la classe d'entites 'chantiers'.
OBJECTID (str): Numero du chantier a mettre a jour.
Restriction (str): Nouvelle valeur pour le champ 'Restriction', optionnel.
Date_fin (str): Nouvelle valeur pour le champ 'Date_fin', optionnel.
delete_expired(boolean): Permet de supprimer les travaux terminés après avoir comparé les dates de fin du travaux avec la date du jours.
"""
# Convertir OBJECTID en entier si possible, sinon None
objectid_int = int(OBJECTID) if OBJECTID else None
# Liste des champs à manipuler
fields = ['OBJECTID', 'Restriction', 'Date_fin']
# Date du jour
today = datetime.now()
# Variable pour suivre si un chantier a été mis à jour
updated = False
# Compteur pour le nombre de chantiers supprimés
deleted_count = 0
# Ouvrir un curseur de mise à jour sur la couche chantier
with arcpy.da.UpdateCursor(chantier, fields) as cursor:
for row in cursor:
# Mise à jour du chantier spécifié par OBJECTID
if objectid_int and row[0] == objectid_int:
if Restriction not in (None, '', '#', ' '):
row[1] = Restriction
if Date_fin not in (None, '', '#', ' '):
row[2] = Date_fin
cursor.updateRow(row)
# Message de succès pour la mise à jour
arcpy.AddMessage(f"Chantier {OBJECTID} mis à jour avec succès.")
updated = True
# Suppression des chantiers dont la date de fin est dépassée
if delete_expired and row[2]:
# Convertir la date de fin en datetime si c'est une chaîne de caractères
date_fin_chantier = datetime.strptime(row[2], "%d/%m/%Y") if isinstance(row[2], str) else row[2]
if date_fin_chantier < today:
cursor.deleteRow()
deleted_count += 1
# Messages finaux
if updated:
arcpy.AddMessage(f"Chantier {OBJECTID} a été mis à jour.")
if delete_expired:
arcpy.AddMessage(f"{deleted_count} chantier(s) dont la date de fin est dépassée ont été supprimés.")
# Point d'entrée du script
if __name__ == "__main__":
# Récupération des paramètres en entrée
chantier = arcpy.GetParameterAsText(0)
OBJECTID = arcpy.GetParameterAsText(1) # Peut être vide si la mise à jour n'est pas nécessaire
Restriction = arcpy.GetParameterAsText(2)
Date_fin = arcpy.GetParameterAsText(3)
delete_expired = arcpy.GetParameterAsText(4) == 'true'
# Appel de la fonction avec les paramètres récupérés
update_and_delete_chantiers(chantier, OBJECTID, Restriction, Date_fin, delete_expired)
Ce troisième outil a comme objectif d’engendrer un tableau regroupant les différents travaux en cours selon le quartier demandé. Pour atteindre ce résultat, l’utilisateur doit inscrire certaines informations ;
Toutes ces informations sont obligatoires pour faire fonctionner l’outil.
Par exemple, pour notre table quartiers et chantier tous deux situés dans la gdb projet2_arcpy du dossier X de notre ordinateur. L’utilisateur doit sélectionner, dans le menu déroulant, le nom du quartier pour lequel il souhaite consulter la liste des chantiers en cours, dans notre exemple nous avons choisi le quartier Cap-Rouge.
L’exécution de cet outil engendre une table CSV. qui cumule tous les chantiers en cours dans le quartier demandé. La table est consultable directement dans ArcGis Pro, mais peut aussi être exportée dans n’importe quel format choisi par l’utilisateur. Lorsqu’utiliser sur le même poste de travail, les deux premiers renseignements à fournir demeureront toujours identiques. Il ne reste qu’à sélectionner à l’aide du menu déroulant le quartier qu’on souhaite visualiser. La table engendrée se nomme chantier_dans_quartier_selectionne.
import arcpy
def outil3(quartier, chantier, quartier_selection) :
"""
Cette fonction sert à sélectionner les chantiers qui se situent dans un quartier sélectionné, et de les exporter dans une table .csv
quartier = la classe d'entité qui comporte les quartiers
chantier = la classe d'entité qui comporte les chantiers
quartier_selection = quartier sélectionné par l'utilisateur parmi la liste des quartiers
"""
arcpy.env.overwriteOutput = True
#Permet de concaténer la variable quartier_selection avec des éléments qui permettent de construire une requête SQL
concat = "g_nom ='" + quartier_selection + "'"
#Permet de sélectionner le quartier choisi avec notre variable concat
select_quartier = arcpy.management.SelectLayerByAttribute(quartier, 'NEW_SELECTION', concat)
#Permet de sélectionner les chantiers qui intersectent le quartier sélectionné
export = arcpy.management.SelectLayerByLocation(chantier, 'INTERSECT', select_quartier)
#Initialise le nom de mon fichier
#nom_sortie = "chantiers_dans_" + quartier_selection
#Permet d'exporter la table à l'endroit souhaité
arcpy.conversion.ExportTable(export, 'chantier_dans_quartier_selectionne', use_field_alias_as_name='USE_ALIAS')
#Définit les paramètres
if __name__ == "__main__":
quartier=arcpy.GetParameterAsText(0)
chantier=arcpy.GetParameterAsText(1)
quartier_selection=arcpy.GetParameterAsText(2)
#Appelle les fonctions
outil3(quartier, chantier, quartier_selection)
Ce quatrième outil sert à cartographier rapidement les travaux en cours dans les différents quartiers de la ville. L’outil permet de visualiser les chantiers en cours pour un quartier à la fois. Pour faciliter l’utilisation, la cartographie engendrée est envoyée sous forme de document PDF. Pour ce faire, certaines informations doivent être inscrites dans les paramètres de l’outil par l’utilisateur, soit ;
L’option d’exporter la carte en format est très simple grâce à l’option de type booléen du formulaire. De plus, pour faciliter la sélection du quartier désiré, un menu déroulant permet à l’utilisateur de sélectionner les 35 différents quartiers de la ville de Québec.
Dans le cas illustré ci-dessus, l’utilisateur souhaite obtenir la carte PDF, dans le fichier arcpy de son dossier X, illustrant les chantiers en cours dans le quartier Saint-Sauveur.
Le résultat de l’exécution de cet outil est une carte PDF qui présente uniquement les chantiers en cours dans le quartier sélectionné.
import arcpy
def cartoautomatique(export, sortie, quartier_selectionne):
projet = arcpy.mp.ArcGISProject("CURRENT") # importe les variables d'environnement
map = projet.listMaps('Map')[0]
pages = projet.listLayouts('Layout')[0]
chantier = map.listLayers('chantier')[0] # importe les variables d'initialisation
quartier = map.listLayers('quartiers')[0]
chantier_quartier = map.listLayers('chantier_quartier')[0]
# Sélectionne le quartier désiré
quartier_temp = arcpy.management.SelectLayerByAttribute(quartier, 'NEW_SELECTION', "\"g_nom\" = '" + quartier_selectionne + "'")
# Sélectionne les chantiers qui intersectent le quartier
couche_temp = arcpy.management.SelectLayerByLocation(chantier, 'INTERSECT', quartier_temp,selection_type='NEW_SELECTION')
# Ajoute les chantiers sélectionnés dans la couche 'chantier_quartier'
arcpy.management.Append(couche_temp, chantier_quartier, 'NO_TEST', update_geometry='UPDATE_GEOMETRY')
# Supprime la sélection des quartiers et des chantiers
arcpy.management.SelectLayerByAttribute(quartier, 'CLEAR_SELECTION')
arcpy.management.SelectLayerByAttribute(chantier, 'CLEAR_SELECTION')
#Tentative infructueuse d'améliorer le zoom sur les chantiers du quartier
#cam = projet.activeView.camera
#ext = arcpy.Describe(chantier_quartier).extent
#cam.setExtent(ext)
if export == 'Oui':
chemin_sortie = sortie + "/chantier dans " + quartier_selectionne + ".pdf"
pages.exportToPDF(chemin_sortie)
# Sélectionne les chantiers dans la table chantier_quartier, 'Canada' étant une sélection générique à tous les chantiers
#arcpy.management.SelectLayerByAttribute(chantier_quartier, 'NEW_SELECTION', "\"Pays\" = 'Canada'")
# Supprime les entités sélectionnées
#arcpy.management.DeleteFeatures(chantier_quartier)
# Définit les paramètres
if __name__ == "__main__":
export = arcpy.GetParameter(0)
sortie = arcpy.GetParameterAsText(1)
quartier_selectionne = arcpy.GetParameterAsText(2)
# Appelle la fonction
cartoautomatique(export, sortie, quartier_selectionne)