9x
005597
2024-08-22

Zapytania (API) Geo-Zone Tool: Automatyzacja w Python

Jak zautomatyzować wysyłanie zapytań internetowych (API) do narzędzia Geo-Zone Tool przy użyciu języka Python?


Odpowiedź:

Tak, można to zrobić bardzo łatwo. Pokazuje to poniższy przykład.

Przygotowanie

Aby przesyłać zapytania internetowe do Geo-Zone Tool za pomocą Pythona, potrzebne są:

  1. Edytor lub IDE (Integrated Development Environment) do pisania skryptu
  2. Python - python.org
  3. Żądania biblioteki Python
  4. Biblioteka Python Pandas (opcjonalnie)

Aby przesłać zapytanie online o narzędzie do geolokalizacji, wymagane są informacje dla narzędzia do geolokalizacji. Wyjaśnimy to na przykładzie struktury adresu URL w zapytaniu:
Controlling WebService (API)

W tym przykładzie wykorzystane zostały następujące informacje, które należy zastąpić w skrypcie własnymi:

  1. Język: pl (niemiecki)
  2. Logowanie: jan [email protected]
  3. linia krzyżująca: 123456ABCD
  4. Mapa: wiatr-DIN-EN-1991-1-4 (obciążenie wiatrem zgodnie z niemieckim załącznikiem EC1)
  5. Położenie: Dlubal, Tiefenbach (siedziba Dlubal GmbH)
  6. Pozycja: 49.4353975, 12.5894907 (szerokość i długość geograficzna)

Wykonaj żądanie sieciowe i odczytaj dane

Poniższy skrypt wysyła zapytanie do usługi sieciowej Narzędzia do geolokalizacji i dokumentuje wymagane czasy oraz zawartość.


...
#%% Import
# Biblioteka do odczytywania znacznika czasu (biblioteka standardowa, opcjonalna) 
Importuj datę/czas jako dt
# Uruchom bibliotekę za pomocą żądania internetowego
Żądania importu

#%% Zdefiniuj parametry
# Narzędzie geolokalizacji URL Webservice 
urlgz = ' https://external-crm.dlubal.com/loadzones/data.aspx'

# Parametry zapytania (zastąp własnymi wartościami)
parz = {
        'język': 'pl',
        'logowanie': '[email protected]',
        Hash '': '123456ABCD',
        'mapa': 'wiatr-DIN-PL-1991-1-4',
        'miejsce': 'Dlubal, Tiefenbach, Niemcy',
        'przedmiot': '49.4353975,12.5894907'
        }
# Ustaw czas anulowania żądania
reto=10 #p

Wykonaj #%% zapytanie
# Znacznik czasu przed pobraniem
cdt1 = dt.datetime.now ()
# Zapytanie sieciowe za pomocą zapytań
rgz = query.get(urlgz, params=pargz, timeout=reto)
# Znacznik czasu po pobraniu
cdt2 = dt.datetime.now ()
# Czas trwania zapytania w sekundach
dur=(cdt2-cdt1).całkowita_sekunda ()
# Kod statusu HTTP żądania
sgz=rgz.status_code
# Opis treści zapytania
hgz=rgz.headers['Content-Type']
# Treść żądania internetowego jako tekst
tgz = rgz.text

#%% Dane wyjściowe konsoli dla żądania internetowego
txt=[]
txt.append(f"Znacznik czasowy: {cdt1}") #Time RRRR-MM-DD GG:MM:SS.SSSSSS
txt.append(f"Czas trwania: {dur} s") #Czas trwania zapytania
txt.append(f"Kod stanu: {rgz.status_code}"), #Kod statusu HTTP (zwykły: 200)
txt.append(f"Nagłówek: {hgz}"), #opis treści (normalnie: text/html; charset=utf-8)
txt.append(f"Tekstowe dane wyjściowe żądania:\n{tgz}") #Dane wyjściowe narzędzia do geolokalizacji
drukuj ('\n'.join(txt))
...

Prowadzi to na przykład do następujących wyników:

  1. kod.wyjście#

Znacznik czasu: 2024-08-22 13:24:32.727006
Długość: 2,214527
Kod statusu: 200
Nagłówek: text/html; charset=utf-8
Tekst wniosku:
Wynik 1, Wynik 2, Strefa, Szerokość, Długość geograficzna, Wysokość, Ulica, Kod pocztowy, Miasto, Norma, Załącznik, Notatka(i), Nota prawna
22,5 m/s,0,32 kN/m2,1,49.4353975,12.5894907,520.69384765625,Am Zellweg 2,9346,Tiefenbach,EN 1991-1-4,DIN EN 1991-1-4
#/code#

Dodanie: Przygotowywanie treści żądania internetowego

Poniższy skrypt konwertuje tekst uzyskany z usługi sieciowej Geo-Zone Tool do postaci tabelarycznej. Ponadto wartości wyników są oddzielane od ich jednostek i ostatecznie zapisywane jako plik CSV i Excel.


...
#%% Import
# Funkcje ciągów znaków z biblioteki standardowej dla importu i eksportu
z io importuj StringIO
# Biblioteka do przetwarzania danych
Importuj pandy jako pd

#%% Funkcje
of rsep_val_unit(indf, cnstart='Wynik',):
    "''"
    Oddzielne kolumny Dataframe żądania narzędzia Dlubal Geo-Zone Tool z wynikami według wartości i jednostek.

    Parametry
    ----------
    indf pandas.DataFrame
        Dane wejściowe.
    Cnpoczątek: ciąg znaków, opcjonalny
        Identyfikator na początku nazwy kolumny zawierającej wyniki

    Zwroty
    -------
    outff : pandas.DataFrame
        Dane wyjściowe.

    "''"
    tmp2 = indf.loc(oś=1)[indf.columns.str.startswith(cnstart)]
    tmp3 = pd.DataFrame ()
    for i w tmp2.columns:
        tmp3[[(i, 'value'), (i, 'unit')]] = tmp2[i].str.split(
            ' ', n=1, expand=prawda)
    outdf = pd.concat (
        [tmp3, indf.loc(axis=1)[~indf.columns.str.startswith(cnstart)]], oś=1)
    powrót outdf

#%% Wykonaj konwersję
# Konwertuj dane wyjściowe narzędzia Geo-Zone Tool na "tabelaryczną" ramkę danych
dfgz=pd.read_csv(StringIO(rgz.text))
# Ramka DataFrame z wynikami oddzielonymi od siebie wartością i jednostką
dfgz_rs=rsep_val_unit(dfgz)

#%% Oszczędność
# jako plik CSV
dfgz_rs.to_csv("Wniosek_Dlubal_ULS.csv")
# jako plik Excel
dfgz_rs.to_excel("Wniosek_Dlubal_ULS.xlsx")

#%% Dane wyjściowe konwersji konsoli
print(f"Oryginalna ramka danych:\n{dfgz.to_string()}")
print(f"Manipulowana ramka danych:\n{dfgz_rs.to_string()}")
print("Przykładowe dane wyjściowe:\n"
      + f"Pierwszy wynik ma wartość {dfgz_rs.iloc[0,0]}."
      + f" (in {dfgz_rs.iloc[0,1]})")
...

Daje to na przykład następujące wyniki:

  1. kod.wyjście#

Oryginalny Dataframe:

  1. Wynik 1, Wynik 2, Strefa, szerokość, długość geograficzna, wysokość, ulica, kod pocztowy, kod pocztowy, norma miejska Załącznik Uwagi

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
Manipulowana ramka danych:

  1. (Wynik 1, wartość) (Wynik 1, jednostka) (Wynik 2, wartość) (Wynik 2, jednostka) Strefa Szerokość Długość Wysokość Ulica ZIP Miasto Standard Załącznik Uwagi

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
Przykładowe dane wyjściowe:

  1. Pierwszy wynik ma wartość 22,5. (m/s)
#/code#

Autor

Pan Gebhardt zapewnia wsparcie techniczne klientom firmy Dlubal Software i odpowiada na ich zapytania.

Odnośniki