Skip to main content
  • »
  • EODATA »
  • Używanie Pythona do wysyłania żądań do katalogu EODATA na NSIS Cloud

Używanie Pythona do wysyłania żądań do katalogu EODATA na NSIS Cloud

Ten artykuł zawiera przykłady wysyłania zapytań do katalogów EODATA opisanych w tym artykule Podręcznik API katalogu EOData na NSIS.

Adresy URL używane do wysyłania tych żądań mogą powodować problemy podczas korzystania na przykład z polecenia curl w Bashu. Na przykład następujący adres URL:

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products?$filter=not contains(Name,'S2') and ContentDate/Start gt 2022-05-03T00:00:00.000Z and ContentDate/Start lt 2022-05-03T00:10:00.000Z

zawiera między innymi znak dolara, spacje i nawiasy. Muszą one być odpowiednio poprzedzone odwrotnym ukośnikiem i/lub zakodowane, aby upewnić się, że żądanie jest prawidłowe. Na przykład Bash może zinterpretować $filter jako zmienną $filter, gdy w rzeczywistości jest ona częścią adresu URL.

W tym artykule omawiamy ten problem poprzez:

  • wklejenie adresu URL do jednego pliku,

  • wklejenie treści żądania do innego pliku (w razie potrzeby),

  • utworzenie kolejnego pliku z kodem w języku Python

  • a następnie jego wykonanie.

Wymagania wstępne

Nr 1 Zainstalowane środowisko Python

Ten artykuł został napisany dla prostych środowisk Python działających w systemie Ubuntu 22.04 i Windows Server 2022. Inne systemy operacyjne (takie jak Windows 11) i środowiska (takie jak PyCharm) mogą również działać, ale wykracza to ą poza zakres tego artykułu.

Poniższe artykuły zawierają sekcje dotyczące instalacji środowiska Python:

Jeśli twój system to Ubuntu możesz też użyć virtualenvwrapper: Jak zainstalować Python virtualenv lub virtualenvwrapper na NSIS Cloud

Nr 2 Biblioteka Pythona o nazwie requests

Musisz zainstalować pakiet Pythona o nazwie requests. Można to zrobić za pomocą narzędzia pip:

pip install requests

W systemie Ubuntu 22.04 można również zainstalować tę bibliotekę globalnie za pomocą narzędzia apt:

sudo apt install python3-requests

Co zostanie omówione?

  • Wysyłanie żądań GET

  • Wysyłanie żądań POST

Wysyłanie żądań GET

Większość linków znalezionych w instrukcjach API to żądania GET, które nie mają żadnej treści.

Utwórz skrypt o nazwie send_get.py i wprowadź do niego następującą treść:

Wyślij zapytanie GET do serwera
import requests
from requests.utils import requote_uri
# Open URL from file
url = open('link1.txt').read()
# Encode URL
url_encoded = requote_uri(url)
# Remove unnecessasary characters from encoded URL
url_encoded_cleared = url_encoded.replace('%0A', '')
# Obtain and print the response
response = requests.get(url_encoded_cleared)
print(response.json())

Utwórz plik o nazwie link1.txt w tym samym katalogu co skrypt send_get.py, który zawiera link, do którego chcesz uzyskać dostęp. W tym pliku może być tylko jeden adres URL.

Za pomocą terminala przejdź do katalogu, w którym znajduje się skrypt i plik link1.txt i uruchom skrypt:

python3 send_get.py

Dane wyjściowe powinny zawierać odpowiedzi z API Katalogu.

Przykład 1: OData API

Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products?$filter=contains(Name,'S1A') and ContentDate/Start gt 2022-05-03T00:00:00.000Z and ContentDate/Start lt 2022-05-21T00:00:00.000Z

Ten link wyszukuje produkty, które:

  • zawierają w swojej nazwie frazę S1A, oraz

  • mają datę rozpoczęcia wykrywania późniejszą niż 2022-05-03T00:00:00.000Z i wcześniejszą niż 2022-05-21T00:00:00.000Z.

Powinno to zwrócić 20 najlepszych wyników.

Wykonaj skrypt. W tym przykładzie użyto terminala GNOME i gedit w systemie Ubuntu 22.04. Zwróć uwagę, że gedit opisuje ten kod jako Python 2, mimo że w rzeczywistości jest używany Python 3.

../_images/using-python-eodata-catalogue-requests-01_nsis_pl.png

Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.

Przykład 2: Usunięte produkty ODATA API

Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/DeletedProducts?$filter=not contains(Name,'S1') and DeletionDate gt 2023-04-01T00:00:00.000Z and DeletionDate lt 2023-05-30T23:59:59.999Z&$orderby=DeletionDate

Ten link wyszukuje usunięte produkty, które:

  • mają nazwę, która nie zawiera frazy S1, oraz

  • mają datę usunięcia ustawioną na późniejszą niż 2023-04-01T00:00:00.000Z i wcześniejszą niż 2023-05-30T23:59:59.999Z.

Wyniki są sortowane według daty usunięcia. Powinno zostać zwrócone 20 najlepszych wyników.

Wykonaj skrypt:

../_images/using-python-eodata-catalogue-requests-02_nsis_pl.png

Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.

Przykład 3: API OpenSearch

Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):

https://catalogue.nsiscloud.polsa.gov.pl/resto/api/collections/Sentinel2/search.json?startDate=2021-07-01&completionDate=2021-07-31

Ten link wyszukuje produkty Sentinel-2, które mają 2021-07-01 i 2021-07-31 jako odpowiednio początkową i końcową datę obserwacji.

Wykonaj skrypt:

../_images/using-python-eodata-catalogue-requests-03_nsis_pl.png

Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.

Wysyłanie żądań POST

Utwórz plik o nazwie send_post.py i wprowadź do niego następujący kod:

Wyślij zapytanie POST do serwera
import requests
import json
from requests.utils import requote_uri
# Open URL from file
url = open('link2.txt').read()
# Open body from file and convert it to JSON object
query = open('body.json')
body = json.load(query)
# Encode URL
url_encoded = requote_uri(url)
# Remove unnecessasary characters from encoded URL
url_encoded_cleared = url_encoded.replace('%0A', '')
# Obtain and print the response
response = requests.post(url_encoded_cleared, json=body)
print(response.json())

Przedstawiony powyżej skrypt działa podobnie jak skrypt przedstawiony w poprzedniej sekcji.

Adres URL powinien jednak tym razem zostać umieszczony w pliku link2.txt, a nie link1.txt.

Treść żądania należy umieścić w pliku body.json.

Wszystkie pliki wymienione w tej sekcji powinny znajdować się w tym samym katalogu.

Przejdź do tego katalogu za pomocą terminala i uruchom kod w języku Python:

python3 send_post.py

Dane wyjściowe powinny zawierać odpowiedzi z API Katalogu.

Przykład: OData API

Użyjmy linku z sekcji ** Zapytanie według listy** z artykułu

Podręcznik API katalogu EOData na NSIS

aby wyszukiwać wiele nazw produktów jednocześnie:

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products/OData.CSC.FilterList

Umieść ten link w pliku link2.txt.

Umieść treść znalezioną w tym artykule w pliku body.json:

{
    "FilterProducts":
    [
        {"Name": "S1A_IW_GRDH_1SDV_20141031T161924_20141031T161949_003076_003856_634E.SAFE"},
        {"Name": "S3B_SL_1_RBT____20190116T050535_20190116T050835_20190117T125958_0179_021_048_0000_LN2_O_NT_003.SEN3"},
        {"Name": "xxxxxxxx.06.tar"}
    ]
}

Wykonaj skrypt:

../_images/using-python-eodata-catalogue-requests-04_nsis_pl.png