Ano, to můžete udělat velmi snadno. V následujícím textu bude vše předvedeno na příkladu.
Příprava
Pro zadávání webových dotazů pro nástroj Geo-Zone Tool pomocí Pythonu potřebujete:
- Editor nebo IDE (Integrated Development Environment) pro psaní skriptu
- Python – python.org
- Dotazy na knihovnu Python
- Knihovna Python Pandas (volitelné)
Pro zadání dotazu nástroje Geo-Zone Tool jsou vyžadovány informace z nástroje Geo-Zone Tool. V následujícím příspěvku si to vysvětlíme na příkladu struktury URL dotazu:
→
Ovládání Webové služby (API)
Pro tento příklad použijeme následující informace, které je třeba ve skriptu nahradit svými vlastními:
- Jazyk: cs (čeština)
- Přihlášení: jan [email protected]
- Hash: 123456ABCD
- Mapa: wind-DIN-EN-1991-1-4 (zatížení větrem podle německé přílohy EC1)
- Místo: Dlubal, Tiefenbach (Sídlo společnosti Dlubal GmbH)
- Poloha: 49.4353975, 12.5894907 (zeměpisná šířka, délka)
Provedení webového dotazu a načtení dat
Následující skript se dotazuje na webovou službu nástroje Geo-Zone Tool a dokumentuje požadované časy a obsah.
...
#%% Imports
# Databáze pro načtení časových razítek (standardní databáze, volitelná)
import datetime as dt
# Spuštění knihovny pomocí webového dotazu
import requests
#%% Nastavení parametrů
# URL webové služby Geo-Zone Tool
urlgz = 'https://external-crm.dlubal.com/loadzones/data.aspx'
# Parametry pro dotaz (nahraďte vlastními hodnotami)
pargz = {
'language': 'cs',
'login': 'jan [email protected]',
'hash': '123456ABCD',
'map': 'wind-DIN-EN-1991-1-4',
'place': 'Dlubal, Tiefenbach',
'position': '49.4353975,12.5894907'
}
# Nastavit čas pro zrušení dotazu
reto=10 # s
#%% Provedení dotazu
# Časové razítko před načtením
cdt1 = dt.datetime.now()
# Webový dotaz pomocí Requests
rgz = requests.get(urlgz, params=pargz, timeout=reto)
# Časové razítko po načtení
cdt2 = dt.datetime.now()
# Doba trvání dotazu v sekundách
dur=(cdt2-cdt1).total_seconds()
# Stavový kód HTTP požadavku
sgz=rgz.status_code
# Popis obsahu dotazu
hgz=rgz.headers['content-type']
# Obsah webového dotazu jako text
tgz = rgz.text
#%% Výstup z konzoly dotazu na web
txt=[]
txt.append(f"Timestamp: {cdt1}") # Zeitpunkt YYYY-MM-DD HH:MM:SS.SSSSSS
txt.append(f"Duration: {dur} s") # Doba trvání dotazu
txt.append(f"Status code: {rgz.status_code}") # HTTP-Statuscode (normal: 200)
txt.append(f"Header: {hgz}") # popis obsahu (normal: text/html; charset=utf-8)
txt.append(f"Text output of request:\n{tgz}") # Výstup nástroje Geo-zone Tool
print('\n'.join(txt))
...
To vede například k následujícím výsledkům:
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,,Alle Angaben ohne Gewähr
Doplněk: Příprava obsahu webového dotazu
Následující skript převede text získaný z webové služby Geo-Zone Tool do tabulky. Kromě toho se výsledné hodnoty oddělí od příslušných jednotek a nakonec se uloží jako soubor CSV a Excel.
...
#%% Importy
# Stringové funkce ze standardní databáze pro import a export
from io import StringIO
# Databáze pro zpracování dat
import pandas as pd
#%% Funkce
def rsep_val_unit(indf, cnstart='Result',):
"""
Seperates Dlubal Geo-Zone-Tool request Dataframe columns with results by value and unit.
Parameters
----------
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
#%% Provedení konverze
# Zkonvertujte výstup nástroje Geo-Zone Tool do "tabulkového" datového rámce
dfgz=pd.read_csv(StringIO(rgz.text))
# DataFrame s výsledky oddělenými podle hodnot a jednotek
dfgz_rs=rsep_val_unit(dfgz)
#%% Uložení
# jako soubor CSV
dfgz_rs.to_csv("Dlubal_GZT_request.csv")
# jako soubor Excel
dfgz_rs.to_excel("Dlubal_GZT_request.xlsx")
#%% Výstup konverze z konzoly
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]})")
...
Výstupem jsou například následující výsledky:
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 Alle Angaben ohne Gewähr
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 Alle Angaben ohne Gewähr
Exemplary Output:
The first result has the value 22.5. (in m/s)