Je crée un nouveau terme ici - Intégration Totale - signifiant l'intégration continue et automatisée de toutes les données et de tout service ArcGIS, ce concept combine le déplacement des données avec le rafraîchissement des services web que les données alimentent. Pas d'ETL manuel, pas de processus déconnectés après l'ETL, pas de temps d'arrêt, juste une maintenance continue du Enterprise Service Bus comme cela devrait être fait, en un seul processus.<\/P>
Il est devenu banal de dire que vous êtes "excité" de partager des détails sur la fonctionnalité, mais je ressens vraiment que l'utilisation d'un Notebook comme planificateur léger apportera l'automatisation des outils web à la masse.<\/P>
Mon scénario d'exemple se passe d'ailleurs autour du maintien d'un localisateur de portail (c'est-à-dire un service de géocodage), un service fondamental très courant, mais lisez entre les lignes et imaginez votre suite complète de services sous gestion continue peu importe comment les données qui les alimentent changent. Bien sûr, vous n'avez pas besoin de maintenir un service, votre outil web peut effectuer tout type de géotraitement.<\/P>
Données du localisateur de San Francisco provenant de Socrata<\/span><\/span><\/P>Il y a plusieurs parties à l'intégration totale, le truc est de les faire fonctionner ensemble. Les étapes logiques sont:<\/P>Publier un outil web qui déplace vos données et <\/STRONG>rafraîchit votre service web cible (si applicable)<\/LI>Automatiser l'outil web selon un calendrier<\/LI><\/OL>Dans mon cas j'utilise ArcGIS Data Interoperability dans l'outil web mais ce n'est qu'un artefact de ma source de données. Les moments d'illumination pour moi ont été de réaliser que je pouvais combiner ETL avec le géotraitement principal pour inclure le rafraîchissement du service dans mon outil web et aussi utiliser un Notebook hébergé ArcGIS Online comme planificateur léger pour une automatisation complète.<\/P>Bien que je sois habituellement un gars sans code, il y a un peu de Python impliqué, mais vous pouvez vous détendre, je partage les modèles de code dans le téléchargement du blog. Mon scénario de blog est à l'extrémité haute dans son utilisation d'ArcPy mais seulement parce qu'ArcGIS manque actuellement d'un outil de géotraitement qui reconstruit un localisateur de portail (note pour moi-même : en obtenir un bientôt), la plupart du temps vous pourriez construire votre outil web en utilisant Data Interoperability appelé dans ModelBuilder, donc sans code ArcPy.<\/P>Ainsi avec un peu d'ArcPy et en utilisant l'API Python ArcGIS dans un Notebook nous pouvons tout assembler. Commençons !<\/P>Mon jeu de données source à intégrer est le système d'adressage d'entreprise de la ville et du comté de San Francisco Adresses avec unités<\/A>. Les données changent quotidiennement et je veux qu'un localisateur de portail soit rafraîchi chaque jour avant les heures ouvrables. Voici mon espace de travail Data Interoperability créé dans Pro et qui fait le travail interactivement:<\/P>
Rafraîchir le localisateur du portail<\/span><\/span><\/P>L'outil ETL lit un fichier CSV à une URL fournie par Socrata, écrit les entités dans une géodatabase temporaire, effectue une détection des changements entre les dernières données et leur état précédent (maintenu dans un service d'entités du portail) puis écrit les changements à la fois dans le service d'entités et une classe d'entités Modifications dans la géodatabase temporaire. Il m'envoie également par e-mail un résumé pratique des adresses nouvelles ou modifiées. L'outil est dans le téléchargement du blog et nécessite Pro 3.0+ et Data Interoperability.<\/P>
Spoiler<\/a>script d'arrêt qui appelle ArcPy dans l'environnement géotraitement temporaire ! Les outils ETL Data Interoperability sont des outils géotraitement et la géodatabase temporaire dans ce cas est trouvée par ce paramètre scripté:<\/P> <\/P>import arcpy
scratchGDB = arcpy.CreateScratchName("xyz",".gdb","Workspace",arcpy.env.scratchFolder)
arcpy.AddMessage('Utilisation du GDB temporaire {}'.format(scratchGDB))
return scratchGDB<\/code><\/pre><P> <\/P><P>Dossier temporaire trouvé de manière similaire :<\/P><P> <\/P><pre class="lia-code-sample language-python"><code>import arcpy
scratchFolder = str(arcpy.env.scratchFolder)
arcpy.AddMessage('Utilisation du dossier temporaire {}'.format(scratchFolder))
return scratchFolder<\/code><\/pre><P> <\/P><P>Lorsqu'il est partagé comme outil web le journal affiche ces messages :<\/P><P><STRONG>Utilisation du GDB temporaire C:\Users\arcgis\AppData\Local\Temp\scratch\xx0.gdb<\/STRONG><BR \/><STRONG>Utilisation du dossier temporaire C:\Users\arcgis\AppData\Local\Temp\scratch<\/STRONG><\/P><P>A présent la partie puissante, utiliser ArcPy dans un <A title="Shutdown Scripts" href="https:\/\/docs.safe.com\/fme\/2022.0\/html\/DataInterop_Documentation\/FME_Workbench\/Workbench\/Startup_and_Shutdown_Python_Scripts.htm" target="_blank" rel="noopener nofollow noreferrer">script d'arrêt</A> pour recréer le service localisateur. Le code de création du localisateur provient initialement d'une copie depuis un élément historique après une exécution de Create Locator tool, le reste vient simplement en lisant l'aide.<\/P><P> <\/P><pre class="lia-code-sample language-python"><code># S'il y a des modifications alors recréer le localisateur du portail
import arcpy
import datetime
import fme
import os
import pytz
scratchGDB = fme.macroValues['ScratchGDB']
scratchFolder = fme.macroValues['ScratchFolder']
portalURL = fme.macroValues['PortalURL']
serverURL = fme.macroValues['ServerURL']
portalUser = fme.macroValues['PortalUser']
portalPassword = fme.macroValues['PortalPassword']
arcpy.env.workspace = scratchGDB
arcpy.env.overwriteOutput = True
if arcpy.Exists('Edits') and arcpy.Exists('AddressesWithUnits'):
# Créer ou recréer le localisateur s'il y a des changements dans les données
arcpy.geocoding.CreateLocator("USA",
r"{}\\AddressesWithUnits PointAddress".format(scratchGDB),
"'PointAddress.HOUSE_NUMBER AddressesWithUnits.Full_Address_Number';"+
"'PointAddress.STREET_NAME AddressesWithUnits.Street_Name';"+
"'PointAddress.STREET_SUFFIX_TYPE AddressesWithUnits.Street_Type';"+
"'PointAddress.SUB_ADDRESS_UNIT AddressesWithUnits.Unit_Number';"+
"'PointAddress.NEIGHBORHOOD AddressesWithUnits.Neighborhood';"+
"'PointAddress.CITY AddressesWithUnits.City';"+
"'PointAddress.SUBREGION AddressesWithUnits.County';"+
"'PointAddress.REGION AddressesWithUnits.Region';"+
"'PointAddress.POSTAL AddressesWithUnits.ZIP_Code';"+
"'PointAddress.COUNTRY AddressesWithUnits.Country';",
r"{}\\SanFrancisco".format(scratchFolder),
"ENG",None,None,None,"GLOBAL_HIGH")
# Créer le brouillon SD et SD
locator_path = os.path.join(scratchFolder,'SanFrancisco')
sddraft_file = os.path.join(scratchFolder,'SanFrancisco.sddraft')
sd_file = os.path.join(scratchFolder,'SanFrancisco.sd')
service_name = 'SanFrancisco'
pst = pytz.timezone('US\\Pacific')
sfNow = datetime.datetime.now(pst)
sfNowStr = sfNow.strftime('%Y:%m:%d %H:%M:%S')
summary = 'Localisateur Point Address With Units pour la ville de San Francisco mis à jour à {} PST'.format(sfNowStr)
summary += '\\nConstruit à partir de la source Socrata : https:\/\/data.sfgov.org\/Geographic-Locations-and-Boundaries\/Addresses-with-Units-Enterprise-Addressing-System\\/ramy-di5m'
tags = 'San Francisco,EAS'
analyze_messages = arcpy.CreateGeocodeSDDraft(locator_path,
sddraft_file,
service_name,
copy_data_to_server = True,
summary = summary,
tags = tags,
max_result_size=50,
max_batch_size=1000,
suggested_batch_size=150,
overwrite_existing_service=True)
# Télécharger le localisateur
if analyze_messages['errors'] == {}:
arcpy.SignInToPortal(portalURL,portalUser,portalPassword)
arcpy.server.StageService(sddraft_file,sd_file)
arcpy.server.UploadServiceDefinition(sd_file,serverURL)
# Nettoyer la GDB temporaire
try:
arcpy.management.Delete(scratchGDB)
except:
pass
Donc voilà l'outil ETL que j'ai publié en tant qu'outil web. Avant de passer à la façon dont nous orchestrons l'outil web, j'ai quelques conseils sur la création et la publication.<\/P>
- L'outil ETL est sans paramètre du point de vue de l'environnement de géotraitement, car j'ai défini toutes ses entrées pour ne pas<\/EM> être publiées. Cela contourne un comportement avec un fichier CSV d'entrée qui est à une URL : ArcGIS Enterprise ne peut pas enregistrer une URL comme magasin de données ni copier les données sur le serveur au moment de l'exécution, donc nous le cachons simplement en ne publiant pas le paramètre.<\/LI>L'outil ETL utilise quelques connexions web pour accéder au portail et s'authentifier à un service email. Vous obtenez ces connexions sur le serveur en les copiant sous forme de fichiers XML depuis le menu Tools>Options>Web Connections, en les copiant sur le serveur, en vous connectant au serveur en tant que propriétaire du service arcgis, en lançant Workbench depuis fmeworkbench.exe<\/STRONG> et en les important depuis la même interface. Assurez-vous de ré-authentifier chaque connexion après leur importation.<\/LI>Parce que nous utilisons l'environnement scratch sur le serveur, qui est partagé entre les processus (ce comportement peut changer), le service de géotraitement de l'outil web est configuré pour s'exécuter avec un maximum d'une instance, cela nous empêche d'avoir des conflits entre instances écrivant dans la géodatabase fichier scratch (plusieurs tâches seront mises en file d'attente). Si vous devez publier plusieurs outils web qui écrivent dans l'environnement serveur alors refactorez-les pour utiliser des espaces de travail temporaires.<\/LI><\/UL>À ce stade, nous avons un outil web qui fait ce que nous voulons, maintenant nous devons l'orchestrer selon un planning<\/STRONG>. Pour cela, nous utilisons un Notebook hébergé dans ArcGIS Online. C'est le premier notebook que j'ai jamais créé (mon expérience sans code se voit) donc si je peux le faire vous aussi. L'outil web s'exécute sur mon portail mais mon notebook s'exécute dans Online<\/STRONG>. Ce n'est pas un problème pour le notebook, l'outil web ne s'exécute pas dans Online<\/STRONG>, sous le capot le notebook s'authentifie simplement auprès du portail et envoie une requête REST submitJob<\/STRONG>. Les notebooks Online savent comment se connecter aux instances GIS du portail. Voici le notebook à cellule unique (Standard runtime) :<\/P>
Notebook hébergé Online<\/span><\/span><\/P> C'est dur ? Extrêmement simple.<\/STRONG> La partie la plus difficile a été d'obtenir un certificat des informaticiens que le portail accepterait lors d'une communication depuis ArcGIS Online (mon collègue Renato S. mérite le crédit). Tout ce que j'ai fait c'est lire l'aide et remplacer les exemples d'aide par mes chemins et noms.<\/P>Pour trouver le nom de fonction à utiliser après avoir importé la boîte à outils web, j'ai juste mis le code dans IDLE pour que intellisense me donne les méthodes.<\/P>Puis pendant l'édition du notebook je suis allé dans l'éditeur de Tâches et j'ai programmé mon notebook pour qu'il s'exécute les jours ouvrables à 6h du matin. Notez que le sélecteur horaire de l'éditeur de tâches utilise les valeurs horaires locales de votre navigateur.<\/P>Maintenant je peux laisser tourner le(s) système(s) et chaque jour mon organisation dispose d'un localisateur à jour maintenu dans un portail !<\/P>
Détails de l'élément Locator plus email des changements d'adresse du jour<\/span><\/span><\/P> <\/P> <\/P>