Rechercher dans le blog

Experience Builder avec l'API Python d'ArcGIS

L'API Python d'ArcGIS vous permet d'automatiser votre SIG web, que ce soit pour vos analyses spatiales, vos processus d'administration des utilisateurs ou la encore gestion du contenu de votre portail. Parmi toutes les capacités l'API, ma  préférée est certainement la possibilité d'accéder à différentes applications du portail via le module arcgis.apps, comme par exemple Hub, StoryMaps, Survey123, etc. Cela vous permet par exemple, une fois une analyse exécutée, de mettre à jour automatiquement le contenu d'une application avec les résultats de cette analyse ; ou encore de créer rapidement un grand nombre d'applications aux mises en pages uniformes. 
Lors de la mise à jour en version 2.2.0 en octobre dernier, j'ai donc appris avec grand plaisir qu'une nouvelle application du portail était désormais prise en charge par l'API : Experience Builder, avec l'introduction du sous-module expbuilder.
Dans cet article, je vous propose de voir ensemble un peu plus en détails ce que nous permet de faire l'API Python d'ArcGIS avec Experience Builder. Notez que, même si pour l'instant les capacités restent limitées, il s'agit d'une première implémentation qui sera enrichie au fur et à mesure des mises à jour de l'API, dont je vous tiendrai au courant sur ce blog. Vous pouvez accéder au code présenté dans cet article ici sur Github, ou alors directement via ce Notebook partagé dans ArcGIS Online.

Prérequis

Avant de commencer, assurez-vous que la version de l'API Python d'ArcGIS que vous utilisez est au minimum la 2.2.0. Vous pouvez vérifier cela très facilement en interrogeant la version de l'API directement dans votre script :
import arcgis
arcgis.__version__
Si ça n'est pas le cas, vous pouvez retrouver la dernière version de l'API (à l'heure où j'écris cet article) ici :
Vous devrez ensuite vous connecter à votre portail SIG :  
from arcgis.gis import GIS
#utiliser une des deux méthodes ci-dessous :
gis = GIS("https://url/portal/home", "username")#remplacer par l'url de votre portail et votre nom d'utilisateur
#gis = GIS("home")#utilisez cette ligne si votre environnement est connecté à votre portail
Nous allons maintenant pouvoir explorer le module expbuilder. Celui-ci est composé de deux classes, Templates et WebExperience, que je vous propose de regarder ensemble. Je vous conseille de travailler dans un environnement Notebook pour profiter de l'interactivité (depuis n'importe quel Jupyter Notebook, ou alors directement dans la suite ArcGIS via les Notebooks d'ArcGIS Pro ou d'ArcGIS Online).

Classe Templates

La classe Templates permet de prévisualiser les modèles d'expérience disponibles, afin de pouvoir vérifier que les mises en page vous conviennent avant de créer une expérience. 
Vous devrez commencer par importer la classe :
from arcgis.apps.expbuilder import Templates
Pour l'instant, tous les modèles ne sont pas encore accessibles via l'API. La ligne suivante vous permet d'obtenir facilement la liste des modèles que vous pouvez appeler : 
dir(Templates)
De nouveaux modèles devraient être accessibles via les futures mises à jour de l'API, mais voici ceux que vous pouvez utiliser à l'heure actuelle :  'BILLBOARD', 'BLANKFULLSCREEN', 'BLANKSCROLLING', 'DART', 'DASH', 'EPIC', 'EXHIBITION', 'FOLDABLE', 'GALLERY', 'GENERAL', 'INDICATOR', 'INTRODUCTION', 'JEWELERYBOX', 'JOURNEY', 'LAUNCHPAD', 'MONITOR', 'PARALLAX', 'POCKET', 'QUICKNAVIGATION', 'REVEAL', 'RIBBON', 'SCENIC', 'SNAPSHOT', 'SUMMARY', 'TIMELINE'.
En choisissant un modèle dans cette liste, vous pouvez le prévisualiser avec le code suivant :  
launchpad = Templates.LAUNCHPAD
launchpad.preview()
WebExperience est la deuxième classe disponible avec ce module. C'est elle qui va nous permettre de créer, supprimer, publier, cloner des expériences. Commençons par l'importer :
from arcgis.apps.expbuilder import WebExperience
Voici comment la classe est référencée dans la documentation :
Il est très facile d'instancier cette classe : 
  • Pour travailler avec une expérience déjà existante sur votre portail, il suffit de renseigner l'argument item avec la chaîne de caractères de l'item ou de l'item ID de l'expérience de votre portail avec laquelle vous souhaitez travailler ;
  • Pour travailler avec une expérience locale créée à partir d'Experience Builder en version desktop, il faut renseigner l'argument path avec le chemin vers le le fichier config.json ;
  • Pour créer une nouvelle expérience, il faudra simplement instancier la classe sans renseigner les arguments item ou path, mais uniquement en renseignant un modèle et un nom.

Créer et manipuler une nouvelle expérience

Voyons cela ensemble, et commençons par créer une nouvelle expérience. Nous allons donc renseigner les arguments template et name :
new_exp = WebExperience(template = "billboard", name = "Experience - API Python")

Notez que cette fois-ci, il faut donner le nom du modèle en minuscule. Par défaut, l'expérience sera créée dans le portail SIG auquel nous nous sommes connectés au début, qui est notre environnement actif. Cependant, vous pouvez utiliser un troisième paramètre, gis, pour enregistrer l'expérience dans un autre portail.
Nous pouvons également appeler la propriété item comme ci-dessous, pour que le Notebook nous donne un lien direct vers l'item créé dans notre portail :
new_exp.item
La propriété itemid permet quant à elle de récupérer la chaîne de caractères donnant l'identifiant de l'élément créé dans le portail : 
new_exp.itemid
Comme tout à l'heure avec la classe Template, nous pouvons tirer parti de la fonction preview() pour visualiser l'expérience dans l'interface interactive du Notebook. Sachez que vous pouvez utiliser les arguments width et height pour modifier la taille d'affichage de la prévisualisation (par défaut, width = 800 et height = 500).
Pour l'instant, cette expérience possède le statut de brouillon, elle n'est pas encore publiée. La méthode save() va nous permettre de sauvegarder l'expérience, et, si nous le souhaitons, de la publier. Il suffit pour cela de fixer la valeur du paramètre publish sur True :
new_exp.save(publish=True)
Vous pouvez également accéder à des paramètres supplémentaire, comme access permettant de définir le niveau de partage de votre expérience ("private", "org" ou "public"), ou encore tags qui vous permet d'y ajouter des balises.
new_exp.save(publish=True, access='org', tags='test, API Python')
Une fois publiée, vous pouvez visualiser l'élément publié, mais cette fois-ci avec la méthode view() (la méthode preview() utilisée plus tôt permet de voir ce qui n'est pas encore publié).
new_exp.view()
Enfin, vous pouvez supprimer une expérience avec la méthode delete().
new_exp.delete()
Nous allons maintenant regarder d'autres méthodes disponibles, permettant de regarder les sources de données d'une expérience ou bien d'en cloner une. Il est bien sûr possible de le faire avec une expérience créée directement avec l'API, mais nous allons ici travailler sur des expériences déjà existantes sur notre portail.
 

Manipuler une expérience existante

Pour accéder à une expérience existante il suffit de connaître l'identifiant de l'expérience. Vous pouvez le récupérer très facilement dans l'url de l'item :  Il suffit ensuite d'instancier la classe WebExperience en passant l'itemid en argument :
exp = WebExperience("34212dda74e9443bbc3e5a6be7058036")#itemid à modifier
L'expérience étant déjà publiée, j'utilise view() pour voir à quoi elle ressemble :

Nous allons en profiter pour regarder une nouvelle propriété accessible avec l'API : datasource vous permet d'obtenir les sources de données utilisées dans l'expérience.
exp.datasources
Maintenant, si vous ne connaissez pas directement l'itemid de votre expérience, vous pouvez bien sûr utiliser les capacités classiques de l'API pour retrouver cette dernière. Ci-dessous par exemple, j'ai pu retrouver mon expérience à partir de son nom avec la méthode search() du ContentManager. Cette méthode renvoyant une liste, j'instancie ensuite la classe WebExperience comme plus tôt, en récupérant l'itemid du premier élément de la liste :
search_exp = gis.content.search(query="title:Ressources Experience Builder",#changer le titre de l'experience si nécessaire         					
  					#outside_org=True, #à utiliser pour élargir la recherche en dehors de votre application                               
  					item_type="Web Experience",
max_items=1) toclone_exp = WebExperience("{0}".format(search_exp[0].itemid))
Nous allons maintenant voir comment cloner cet expérience, par exemple vers le contenu d'un autre utilisateur. Pour cela, je définis tout d'abord quelle sera la "cible", c'est-à dire-l'endroit où le clone de l'expérience sera copié. Pour cela, je vais rester dans mon portail actuel mais passer les informations d'authentification d'un utilisateur tiers. Nous pouvons ensuite utiliser la méthode clone() pour cloner l'expérience :
cible = GIS(username="username",password="password")#infos d'authentification à modifier
cloned_exp = toclone_exp.clone(
	target = cible, 
    owner = "username",
    search_existing_items = False
)
cloned_exp
A nouveau, nous pouvons utiliser la fonction view() pour visualiser l'expérience clonée, et vérifier qu'elle fonctionne correctement :
Voilà, nous arrivons au bout des fonctions majeures implémentées par cette première version du module expbuilder. Comme évoqué plus tôt, les équipes d'Esri ont prévu d'y ajouter de nouvelles méthodes au fur et à mesure des nouvelles versions de l'API, pour nous permettre d'aller plus loin dans la manipulation d'Experience Builder avec Python. Nous en reparlerons évidemment sur ce blog ; mais en attendant, je vous invite à consulter les autres nouveautés de la version 2.2.0 de l'API ! N'oubliez pas également que tout le code présenté est téléchargeable sur Github ou depuis cet item sur ArcGIS.

Aucun commentaire:

Enregistrer un commentaire