9x
005597
22.08.2024

Demandes Web (API) Outil de géolocalisation : Automatisation avec Python

Comment automatiser les requêtes web (API) vers l’outil Geo-Zone Tool à l’aide de Python ?


Réponse:

Oui, cette opération est très simple. L’exemple suivant vous le montre.

Préparation

Les demandes Web dans l’outil de géolocalisation à l’aide de Python nécessitent :

  1. Éditeur ou EDI (environnement de développement intégré) pour écrire le script
  2. Python - Python.org
  3. Demandes de la bibliothèque Python
  4. Bibliothèque Python Pandas (facultatif)

Effectuer une demande Web de l’outil de géolocalisation Dlubal nécessite des informations associées à l’outil de géolocalisation Dlubal. Cette opération est expliquée dans l’article suivant à l’aide de l’exemple de la structure URL d’une demande :
Contrôle des services Web (API)

Dans cet exemple, les informations suivantes sont utilisées, remplacez-les par les vôtres dans le script :

  1. Langue : fr (français)
  2. Connexion : max [email protected]
  3. Hachage : 123456ABCD
  4. Carte : vent-DIN-EN-1991-1-4 (charge de vent selon l’Annexe allemande de l’EC1)
  5. Lieu : Dlubal, Tiefenbach (siège social de Dlubal GmbH)
  6. Position : 49,4353975, 12,5894907 (Latitude, longitude)

Exécution de la demande Web et lecture des données

Le script suivant effectue la demande au service Web de l’outil de géolocalisation et documente la durée et le contenu.


...
#%% Import
# Bibliothèque pour la lecture des horodatages (bibliothèque standard, facultative)
import datetime as dt
# Bibliothèque pour exécuter la demande Web
import requests

#%% Définir les paramètres
# URL Service Web Outil de géolocalisation
urlgz = 'https://external-crm.dlubal.com/loadzones/data.aspx'

# Paramètres de la demande (remplacer avec vos propres valeurs)
pargz = {
        'language': 'fr',
        'login': '[email protected]',
        'hash': '123456ABCD',
        'map': 'wind-DIN-EN-1991-1-4',
        'place': 'Dlubal, Tiefenbach',
        'position': '49.4353975,12.5894907'
        }
# Définir le délai d’annulation de la demande
reto=10 # s

#%% Exécuter la demande
# Horodatage avant annulation
cdt1 = dt.datetime.now()
# Recherche sur le Web via des demandes
rgz = requests.get(urlgz, params=pargz, timeout=reto)
# Horodatage après annulation
cdt2 = dt.datetime.now()
# Durée de la demande en secondes
dur=(cdt2-cdt1).total_seconds()
# Code du statut HTTP de la demande
sgz=rgz.status_code
# Description du contenu de la demande
hgz=rgz.headers['content-type']
# Contenu de la demande Web sous forme de texte
tgz = rgz.text

#%% Sortie de la console de la demande Web
txt=[]
txt.append(f"Timestamp: {cdt1}") # Temps YYYY-MM-DD HH:MM:SS.SSSSSS
txt.append(f"Duration: {dur} s") # Durée de la demande
txt.append(f"Status code: {rgz.status_code}") # HTTP-Statuscode (normal: 200)
txt.append(f"Header: {hgz}") # Description du contenu (normal: text/html; charset=utf-8)
txt.append(f"Text output of request:\n{tgz}") # Sortie de l’outil de géolocalisation
print('\n'.join(txt))
...

On obtient ainsi par exemple les résultats suivants :


Timestamp: 2024-08-22 13:24:32.727006
Duration: 2.214527
Status code: 200
Header: text/html; charset=utf-8
Text output of request: 
Result 1,Result 2,Zone,Latitude,Longitude,Elevation,Street,ZIP,City,Standard,Annex,Note(s),Legal notice
22.5 m/s,0.32 kN/m2,1,49.4353975,12.5894907,520.69384765625,Am Zellweg 2,93464,Tiefenbach,EN 1991-1-4,DIN EN 1991-1-4,,Données non garanties

Complément : Préparation du contenu de la demande Web

Le script suivant convertit le texte obtenu à partir du service Web de l’outil de géolocalisation sous forme de tableau. De plus, les valeurs de résultats sont séparées de leurs unités et enregistrées sous forme de fichier CSV et Excel.


...
#%% Import
# Fonctions de chaîne de la bibliothèque standard pour l’importation et l'exportation
from io import StringIO
# Bibliothèque pour le traitement des données
import pandas as pd

#%% Fonctionnalités
def rsep_val_unit(indf, cnstart='Result',):
    """
    Seperates Dlubal Geo-Zone-Tool request Dataframe columns with results by value and unit.

    Paramètres
    ----------
    indf : pandas.DataFrame
        Input data.
    cnstart: string, optional
        Identifier at start of column name containing results.

    Returns
    -------
    outdf : pandas.DataFrame
        Output data.

    """
    tmp2 = indf.loc(axis=1)[indf.columns.str.startswith(cnstart)]
    tmp3 = pd.DataFrame()
    for i in tmp2.columns:
        tmp3[[(i, 'value'), (i, 'unit')]] = tmp2[i].str.split(
            ' ', n=1, expand=True)
    outdf = pd.concat(
        [tmp3, indf.loc(axis=1)[~indf.columns.str.startswith(cnstart)]], axis=1)
    return outdf

#%% Effectuer la conversion
# Convertir la sortie de l’outil de géolocalisation en données « tabulées »
dfgz=pd.read_csv(StringIO(rgz.text))
# Cadre de données avec résultats séparés par valeur et unité
dfgz_rs=rsep_val_unit(dfgz)

#%% Sauvegarde
# sous forme de fichier CSV
dfgz_rs.to_csv("Dlubal_GZT_request.csv")
# comme fichier Excel
dfgz_rs.to_excel("Dlubal_GZT_request.xlsx")

#%% Sortie de la conversion de la console
print(f"Original Dataframe:\n{dfgz.to_string()}")
print(f"Manipulated Dataframe:\n{dfgz_rs.to_string()}")
print("Exemplary Output:\n"
      + f"   The first result has the value {dfgz_rs.iloc[0,0]}."
      + f" (in {dfgz_rs.iloc[0,1]})")
...

Par exemple, on obtient les résultats suivants :


Original Dataframe:
   Result 1               Result 2  Zone   Latitude  Longitude   Elevation        Street    ZIP        City     Standard            Annex  Note(s)              Legal notice
0  22.5 m/s  0.32 kN/m2     1  49.435398  12.589491  520.693848  Am Zellweg 2  93464  Tiefenbach  EN 1991-1-4  DIN EN 1991-1-4      NaN  Données non garanties
Manipulated Dataframe:
  (Result 1, value) (Result 1, unit) (Result 2, value)  (Result 2, unit)  Zone   Latitude  Longitude   Elevation        Street    ZIP        City     Standard            Annex  Note(s)              Legal notice
0              22.5              m/s              0.32  kN/m2     1  49.435398  12.589491  520.693848  Am Zellweg 2  93464  Tiefenbach  EN 1991-1-4  DIN EN 1991-1-4      NaN Données non garanties
Exemple de sortie :
   Le premier résultat a la valeur 22,5. (m/s)

Auteur

M. Gebhardt fournit un support technique aux clients de Dlubal Software et s’occupe de leurs demandes.

Liens