Ingestování dat do GeoCatalogu pomocí rozhraní API hromadného příjmu dat

V tomto článku se dozvíte, jak ingestovat mnoho geoprostorových datových prostředků najednou do GeoCatalogu pomocí rozhraní API hromadného příjmu dat. Nejprve vytvoříme a nakonfigurujeme zdroj příjmu dat GeoCatalog. Vytvoření zdroje příjmu dat vytvoří zabezpečené připojení mezi prostředkem GeoCatalog a umístěním úložiště pro vaše stávající geoprostorová data. Dále vytvoříme kolekci katalogu STAC (SpatioTemporal Access Catalog) v rámci vašeho prostředku GeoCatalog pro ukládání přijatých dat. Nakonec použijeme rozhraní API pro hromadný příjem dat k zahájení pracovního postupu příjmu dat. Po dokončení těchto kroků se geoprostorová data ingestují a zpřístupní z uživatelských rozhraní a rozhraní API GeoCatalogu.

Diagram znázorňující proces importu statického katalogu pro GeoCatalog zobrazující tok dat z úložiště do GeoCatalogu prostřednictvím rozhraní API hromadného příjmu dat

Požadavky

V předplatném Azure:

Geoprostorová datová sada ve vašem blobovém kontejneru úložného účtu:

  • Geoprostorové datové prostředky (například soubory GeoTIFF)
  • Propojené položky STAC vytvoří položky STAC pro tyto prostředky.
  • SOUBOR JSON kolekce STAC, který odkazuje na všechny položky STAC a geoprostorové datové prostředky.

V místním /vývojovém prostředí:

Microsoft Planety Computer Pro musí mít přístup k kontejneru Azure Blob Storage. V tomto článku vytvoříme a použijeme dočasné přihlašovací údaje tokenu SAS k udělení tohoto přístupu. Případně můžete pomocí těchto průvodců nastavit spravovanou identitu nebo pevně zakódované tokeny SAS.

Vytvoření zdroje příjmu dat

Vytvoření zdroje pro ingestování definuje pro GeoCatalog, ze kterého zdroje má být ingestována geoprostorová data, a který mechanismus přihlašovacích údajů se má použít v procesu ingestování.

  1. Nainstalujte požadované moduly Pythonu pomocí pipu

    pip install pystac-client azure-identity requests azure-storage-blob pyyaml
    
  2. Import požadovaných modulů Pythonu

    import os
    import requests
    from azure.identity import AzureCliCredential
    from datetime import datetime, timedelta, timezone
    import azure.storage.blob
    from urllib.parse import urlparse
    import yaml
    
  3. Nastavení požadovaných konstant podle vašeho prostředí

    MPCPRO_APP_ID = "https://geocatalog.spatio.azure.com"
    CONTAINER_URI = "<container_uri>" # The URI for the blob storage container housing your geospatial data
    GEOCATALOG_URI = "<geocatalog uri>" # The URI for your GeoCatalog can be found in the Azure portal resource overview 
    API_VERSION = "2025-04-30-preview"
    
  4. Vytvoření tokenu SAS

    # Parse the container URL
    parsed_url = urlparse(CONTAINER_URI)
    account_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
    account_name = parsed_url.netloc.split(".")[0]
    container_name = parsed_url.path.lstrip("/")
    
    credential = azure.identity.AzureCliCredential()
    blob_service_client = azure.storage.blob.BlobServiceClient(
        account_url=account_url,
        credential=credential,
    )
    
    now = datetime.now(timezone.utc).replace(microsecond=0)
    key = blob_service_client.get_user_delegation_key(
        key_start_time=now + timedelta(hours=-1),
        key_expiry_time=now + timedelta(hours=1),
    )
    
    sas_token = azure.storage.blob.generate_container_sas(
        account_name=account_name,
        container_name=container_name,
        user_delegation_key=key,
        permission=azure.storage.blob.ContainerSasPermissions(
            read=True,
            list=True,
        ),
        start=now + timedelta(hours=-1),
        expiry=now + timedelta(hours=1),
    )
    
  5. Získání přístupového tokenu rozhraní API GeoCatalog

    # Obtain an access token
    credential = AzureCliCredential()
    access_token = credential.get_token(f"{MPCPRO_APP_ID}/.default")
    
  6. Vytvořte POST payload pro API zdroj pro příjem dat

    # Payload for the POST request
    payload = {
        "Kind": "SasToken",
        "connectionInfo": {
            "containerUrl": CONTAINER_URI,
            "sasToken": sas_token,
        },
    }
    
  7. Vytvoření zdroje příjmu dat odesláním datové části POST do koncového bodu zdroje příjmu dat

    # STAC Collection API endpoint
    endpoint = f"{GEOCATALOG_URI}/inma/ingestion-sources"
    
    # Make the POST request
    response = requests.post(
        endpoint,
        json=payload,
        headers={"Authorization": f"Bearer {access_token.token}"},
        params={"api-version": API_VERSION},
    )
    
  8. Ověření odpovědi

    # Print the response
    if response.status_code == 201:
        print("Ingestion source created successfully")
        ingestion_source_id = response.json().get("id") #saved for later to enable resoource clean up
    else:
        print(f"Failed to create ingestion: {response.text}")
    

Poznámka:

Opakované spuštění těchto kroků za sebou vede k tomu, že je vrácena odpověď 409:

Container url <container uri> already contains a SAS token ingestion source with id <sas token id>

Rozhraní API zdroje příjmu dat neumožňuje vytvořit pro stejnou adresu URL kontejneru více než jeden zdroj příjmu dat. Abyste se vyhnuli konfliktům, před vytvořením nového zdroje se ujistěte, že vyčistíte všechny existující zdroje příjmu dat. Podrobnosti najdete v tématu Vyčištění prostředků.

Vytvořit kolekci

Kolekce STAC je kontejner vysoké úrovně pro položky STAC a jejich přidružené geoprostorové prostředky. V této části vytváříme kolekci STAC v rámci našeho GeoCatalogu pro umístění geoprostorových dat, která ingestujeme v další části.

  1. Import požadovaných modulů

    import os
    import requests
    import yaml
    from pprint import pprint
    from azure.identity import AzureCliCredential
    
  2. Nastavení požadovaných konstant podle vašeho prostředí

    MPCPRO_APP_ID = "https://geocatalog.spatio.azure.com"
    GEOCATALOG_URI = "<geocatalog uri>" # The URI for your GeoCatalog can be found in the Azure portal resource overview 
    API_VERSION = "2025-04-30-preview"
    
    COLLECTION_ID = "example-collection" #You can your own collection ID
    COLLECTION_TITLE = "Example Collection" #You can your own collection title    
    
  3. Získání přístupového tokenu rozhraní API GeoCatalog

    # Obtain an access token
    credential = AzureCliCredential()
    access_token = credential.get_token(f"{MPCPRO_APP_ID}/.default")
    
  4. Vytvoření základní specifikace kolekce STAC

    collection = {
        "id": COLLECTION_ID,
        "type": "Collection",
        "title": COLLECTION_TITLE,
        "description": "An example collection",
        "license": "CC-BY-4.0",
        "extent": {
            "spatial": {"bbox": [[-180, -90, 180, 90]]},
            "temporal": {"interval": [["2018-01-01T00:00:00Z", "2018-12-31T23:59:59Z"]]},
        },
        "links": [],
        "stac_version": "1.0.0",
        "msft:short_description": "An example collection",
    }
    

    Poznámka:

    Tato specifikace ukázkové kolekce je základním příkladem kolekce. Další informace o kolekcích STAC a otevřených standardech STAC naleznete v přehledu STAC. Další informace o vytvoření kompletní kolekce STAC naleznete v tématu Vytvoření kolekce STAC.

  5. Vytvoření nové kolekce pomocí rozhraní API kolekce

    response = requests.post(
        f"{GEOCATALOG_URI}/stac/collections",
        json=collection,
        headers={"Authorization": "Bearer " + access_token.token},
        params={"api-version": API_VERSION},
    )
    
  6. Ověření výsledku odpovědi

    if response.status_code == 201:
        print("Collection created successfully")
        pprint(response.json())
    else:
        print(f"Failed to create ingestion: {response.text}")
    

Vytvoření připojení a spuštění pracovního postupu

V tomto posledním kroku používáme rozhraní API pro příjem dat k zahájení pracovního postupu hromadného příjmu dat.

  1. Import požadovaných modulů

    import os
    import requests
    import yaml
    from azure.identity import AzureCliCredential
    
  2. Nastavení požadovaných konstant podle vašeho prostředí

    MPCPRO_APP_ID = "https://geocatalog.spatio.azure.com"
    GEOCATALOG_URI = "<geocatalog uri>" # The URI for your GeoCatalog can be found in the Azure portal resource overview 
    API_VERSION = "2025-04-30-preview"
    
    COLLECTION_ID = "example-collection" #You can your own collection ID
    catalog_href = "<catalog_href>" #The blob storage location of the STAC Catalog JSON file
    
    skip_existing_items = False
    keep_original_assets = False
    timeout_seconds = 300
    
  3. Získání přístupového tokenu rozhraní API GeoCatalog

    # Obtain an access token
    credential = AzureCliCredential()
    access_token = credential.get_token(f"{MPCPRO_APP_ID}/.default")
    
  4. Vytvoření datové části POST pro rozhraní API hromadného příjmu dat

    url = f"{GEOCATALOG_URI}/inma/collections/{COLLECTION_ID}/ingestions"
    body = {
        "importType": "StaticCatalog",
        "sourceCatalogUrl": catalog_href,
        "skipExistingItems": skip_existing_items,
        "keepOriginalAssets": keep_original_assets,
    }
    
  5. Odešle datovou část do rozhraní API hromadného příjmu dat.

    ing_response = requests.post(
        url,
        json=body,
        timeout=timeout_seconds,
        headers={"Authorization": f"Bearer {access_token.token}"},
        params={"api-version": API_VERSION},
    )
    
  6. Ověřte odpověď.

    if ing_response.status_code == 201:
        print("Ingestion created successfully")
        ingestion_id = ing_response.json()["ingestionId"]
        print(f"Created ingestion with ID: {ingestion_id}")
    else:
        print(f"Failed to create ingestion: {ing_response.text}")
    
  7. Ověřte stav pracovního postupu příjmu dat.

    runs_endpoint = (
        f"{geocatalog_url}/inma/collections/{collection_id}/ingestions/{ingestion_id}/runs"
    )
    
    wf_response = requests.post(
        runs_endpoint,
        headers={"Authorization": f"Bearer {access_token.token}"},
        params={"api-version": API_VERSION},
    )
    
    if wf_response.status_code == 201:
        print("Workflow started successfully")
    else:
        print(f"Failed to create ingestion run: {wf_response.text}")
    
    

Po dokončení pracovního postupu můžete zadávat dotazy, načítat nebo vizualizovat geoprostorová data pomocí rozhraní STAC GeoCatalog nebo rozhraní API pro data nebo pomocí Průzkumníka dat. Pokud narazíte na problémy, projděte si průvodce odstraňováním potíží nebo seznam kódů chyb příjmu dat.

Vyčistěte zdroje

  • Odstranění zdroje příjmu dat

    del_is_endpoint = f"{GEOCATALOG_URI}/inma/ingestion-sources/{ingestion_source_id}"
    del_is_response = requests.delete(
        del_is_endpoint,
        headers={"Authorization": f"Bearer {access_token.token}"},
        params={"api-version": API_VERSION},
    )
    
    if del_is_response.status_code == 200:
        print("Ingestion source deleted successfully")
    else:
        print(f"Failed to delete ingestion source")
    

Další kroky

Teď, když jste přidali několik položek, byste měli nakonfigurovat data pro vizualizaci.