Dans cet article, nous allons vous montrer comment géocoder une adresse avec l’ETL SAP Data Services - (aussi connu sous le nom de SAP BusinessObjects Data Services ou SAP BODS) - mais aussi comment intégrer du code Python sur SAP DS. Pour cela nous aurons besoin de l’outil User-Defined permettant d’accéder à un Web Service en utilisant un script de géocodage codé en Python.
Nous aurons besoin d’importer le package Python Requests permettant d’utiliser le protocole http de façon à récupérer les données d’une page web.
En effet, le script Python prendra en entrée une adresse, un code postal et une ville. Nous prendrons en fichier d’entrée d’exemple les adresses des agences de Next Decision en France. Ce script ira chercher ensuite les adresses dans la Base Adresse Nationale (BAN) puis nous retournera en sortie des coordonnées géographiques (latitude, longitude, x, y, nom de la commune, …).
Une fois que les données sont extraites et importées dans notre flux de travail, on ajoute un nouveau champ qui concatène à l’aide d’un Query de transformation le libellé de la structure, son adresse, code postal et sa commune dans une colonne qu’on nommera CONCAT avec une longueur de 500. Ce query sera en entrée de notre User-Defined.
Dans la bibliothèque d’objets locale, se trouve l’outil User-Defined dans l’onglet «Transformation». Cet outil contiendra le script Python qui appelle le Web Service pour géocoder notre adresse.
En premier lieu, on glisse puis dépose l’User-Defined (nommé UD_Python_Geocodage) pour l’insérer dans le canevas.
On relie le Query à l’User-Defined, puis on double-clique sur ce dernier pour ouvrir l’outil. On glisse et dépose le champ CONCAT dans l’onglet entrée qu’on nommera « Adresse » comme dans la capture ci-dessous :
On accède à l’onglet options, appuyer sur le bouton « Modifier les options » pour ouvrir ensuite l’éditeur d’expressions Python.
Dans l’onglet « champs E/S » de l’éditeur d’expressions Python, nous déclarons la variable « Adresse » en champ entrée si elle n’existe pas.
On fait ensuite un clic droit sur « champs de sortie » pour déclarer les variables suivantes :
Score_sortie : valeur de 0 à 1 indiquant la pertinence du résultat
Postcode_sortie : code postal
Citycode_sortie : nom de la commune
X_sortie : coordonnées géographiques en projection légale
Y_sortie : coordonnées géographiques en projection légale
Label_sortie : libellé complet de l’adresse
Type_sortie : type de résultat trouvé
Name_sortie : numéro éventuel et nom de la voie ou lieu-dit
Avec une taille varchar (200) pour chaque champ.
On copie-colle le script Python suivant dans l’éditeur :
# Importation de la bibliotheque des requetes
import requests
adre = record.GetField(unicode('Adresse'))
#CP = record.GetField(unicode('Code postal'))
# api-endpoint
URL = "https://api-adresse.data.gouv.fr/search/?q="+ adre
print URL
# envoi d'une requete get et sauvegarde de la reponse en tant qu'objet réponse
r = requests.get(url = URL)
# extraction de donnees au format json
reponse = r.json()
# extraction de la latitude, de la longitude et de l'adresse formatee
# du premier emplacement correspondant
if len(reponse['features'])==0:
latitude = ''
longitude = ''
x = ''
y = ''
label = ''
score = ''
type = ''
name = ''
citycode = ''
postcode = ''
else :
latitude = str(reponse['features'][0]['geometry']['coordinates'][0])
record.SetField(unicode('latitude_sortie'),unicode(latitude))
longitude = str(reponse['features'][0]['geometry']['coordinates'][1])
record.SetField(unicode('longitude_sortie'),unicode(longitude))
x = unicode(reponse['features'][0]['properties']['x'])
record.SetField(unicode('x_sortie'),unicode(x))
y = unicode(reponse['features'][0]['properties']['y'])
record.SetField(unicode('y_sortie'),unicode(y))
label = unicode(reponse['features'][0]['properties']['label'])
record.SetField(unicode('label_sortie'),unicode(label))
score = unicode(reponse['features'][0]['properties']['score'])
record.SetField(unicode('score_sortie'),unicode(score))
citycode = unicode(reponse['features'][0]['properties']['citycode'])
record.SetField(unicode('citycode_sortie'),unicode(citycode))
type = unicode(reponse['features'][0]['properties']['type'])
record.SetField(unicode('type_sortie'),unicode(type))print 'RESULTAT '+ ' ' + longitude + ' ' + latitude
# mettre la latitude, la longitude et l'adresse formatée dans le tableau
NB1 : Pour vérifier l’exactitude des coordonnées générés, on peut vérifier sur Google Maps.
NB2 : En cas d’industrialisation, il est préférable de garder en sortie uniquement les champs attendus pour améliorer les performances.
On ferme l’éditeur, puis on accède à l’onglet « sortie » du User-defined afin de cocher tous les champs qu’on veut intégrer dans notre table en sortie de l’entrepôt de données, comme dans la capture ci-dessous :
On retourne dans le canevas pour y insérer un deuxième Query en sortie du User-Defined. Ce Query servira à renommer les colonnes générées par le script Python selon vos règles de nommage.
Enfin on relie le Query à la table de sortie que vous voulez alimenter.
Et voilà, vous savez tout sur le géocodage d'une adresse avec SAP Data Services !
Nos consultants experts de Next Decision sont à votre écoute pour vous accompagner dans vos projets SAP Data Services ! Contactez-nous !