Aufnehmen von Daten in GeoCatalog mithilfe der Massenimport-API

In diesem Artikel wird gezeigt, wie Sie mithilfe der Massenaufnahme-API viele geospatiale Datenressourcen gleichzeitig in einem GeoCatalog aufnehmen. Zunächst erstellen und konfigurieren wir eine GeoCatalog-Aufnahmequelle. Das Erstellen einer Aufnahmequelle stellt eine sichere Verbindung zwischen einer GeoCatalog-Ressource und dem Speicherort für Ihre vorhandenen geospatialen Daten her. Als Nächstes erstellen wir eine SpatioTemporal Access Catalog (STAC)-Auflistung in Ihrer GeoCatalog-Ressource, um die erfassten Daten zu speichern. Schließlich verwenden wir die Massenerfassungs-API, um den Erfassungsworkflow zu initiieren. Wenn Sie diese Schritte abgeschlossen haben, werden Ihre Geospatialdaten von den GeoCatalog-UIs und APIs erfasst und zugänglich.

Diagramm, das den statischen Katalogimportprozess für GeoCatalog veranschaulicht und den Datenfluss von Speicher zu GeoCatalog über die Massenaufnahme-API zeigt.

Voraussetzungen

In Ihrem Azure-Abonnement:

Ein Geospatial-Dataset in Ihrem Speicherkonto-BLOB-Container:

  • Geospatialdatenressourcen (z. B. GeoTIFF-Dateien)
  • Die zugehörigen STAC-Elemente erstellen STAC-Elemente für diese Objekte.
  • Ein STAC-Sammlungs-JSON, das auf alle STAC-Elemente und geospatialen Datenressourcen verweist.

In Ihrer lokalen/Entwicklungsumgebung:

Microsoft Planetary Computer Pro muss Zugriff auf den Azure Blob Storage-Container haben. In diesem Artikel erstellen und verwenden wir eine temporäre SAS-Token-Anmeldeinformation, um auf diesen Zugriff zuzugreifen. Alternativ können Sie diese Leitfäden verwenden, um verwaltete Identitäten oder hartcodierte SAS-Token einzurichten.

Erstellen der Erfassungsquelle

Beim Erstellen einer Aufnahmequelle wird für GeoCatalog definiert, aus welcher Quelle Geospatialdaten aufgenommen werden sollen, und welcher Anmeldeinformationsmechanismus im Aufnahmeworkflow verwendet werden soll.

  1. Installieren der erforderlichen Python-Module mit Pip

    pip install pystac-client azure-identity requests azure-storage-blob pyyaml
    
  2. Importieren der erforderlichen Python-Module

    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. Festlegen der erforderlichen Konstanten gemäß Ihrer Umgebung

    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. Erstellen des SAS-Tokens

    # 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. Abrufen des GeoCatalog-API-Zugriffstokens

    # Obtain an access token
    credential = AzureCliCredential()
    access_token = credential.get_token(f"{MPCPRO_APP_ID}/.default")
    
  6. Erstellen der POST-Nutzlast für die Erfassungsquell-API

    # Payload for the POST request
    payload = {
        "Kind": "SasToken",
        "connectionInfo": {
            "containerUrl": CONTAINER_URI,
            "sasToken": sas_token,
        },
    }
    
  7. Erstellen Sie die Erfassungsquelle, indem Sie die POST-Nutzlast an den Erfassungsquellendpunkt senden

    # 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. Überprüfen der Antwort

    # 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}")
    

Hinweis

Wenn Sie diese Schritte mehrmals ausführen, führt dies zu einer 409-Antwort:

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

Mit der Aufnahmequell-API können Sie nicht mehr als eine Aufnahmequelle für dieselbe Container-URL erstellen. Um Konflikte zu vermeiden, stellen Sie sicher, dass Sie vorhandene Aufnahmequellen bereinigen, bevor Sie eine neue erstellen. Weitere Informationen finden Sie unter Bereinigen von Ressourcen.

Sammlung erstellen

Eine STAC-Auflistung ist der übergeordnete Container für STAC-Elemente und deren zugeordnete geospatiale Objekte. In diesem Abschnitt erstellen wir eine STAC-Sammlung in unserem GeoCatalog, um die geospatialen Daten zu enthalten, die wir im nächsten Abschnitt aufnehmen.

  1. Importieren der erforderlichen Module

    import os
    import requests
    import yaml
    from pprint import pprint
    from azure.identity import AzureCliCredential
    
  2. Festlegen der erforderlichen Konstanten gemäß Ihrer Umgebung

    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. Abrufen des GeoCatalog-API-Zugriffstokens

    # Obtain an access token
    credential = AzureCliCredential()
    access_token = credential.get_token(f"{MPCPRO_APP_ID}/.default")
    
  4. Erstellen einer grundlegenden STAC-Sammlungsspezifikation

    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",
    }
    

    Hinweis

    Diese Spezifikation einer Beispielsammlung ist ein Beispiel für eine Sammlung. Weitere Informationen zu STAC-Sammlungen und dem offenen STAC-Standard finden Sie in der STAC-Übersicht. Weitere Informationen zum Erstellen einer vollständigen STAC-Auflistung finden Sie unter Create STAC Collection.

  5. Erstellen der neuen Sammlung mit der Sammlungs-API

    response = requests.post(
        f"{GEOCATALOG_URI}/stac/collections",
        json=collection,
        headers={"Authorization": "Bearer " + access_token.token},
        params={"api-version": API_VERSION},
    )
    
  6. Überprüfen des Antwortergebnisses

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

Erstellung von Verbindung und Ausführung des Workflows

In diesem letzten Schritt verwenden wir die Erfassungs-API, um einen Massenerfassungsworkflow zu initiieren.

  1. Importieren erforderlicher Module

    import os
    import requests
    import yaml
    from azure.identity import AzureCliCredential
    
  2. Festlegen der erforderlichen Konstanten gemäß Ihrer Umgebung

    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. Abrufen des GeoCatalog-API-Zugriffstokens

    # Obtain an access token
    credential = AzureCliCredential()
    access_token = credential.get_token(f"{MPCPRO_APP_ID}/.default")
    
  4. Erstellen der POST-Nutzlast für die Massenerfassungs-API

    url = f"{GEOCATALOG_URI}/inma/collections/{COLLECTION_ID}/ingestions"
    body = {
        "importType": "StaticCatalog",
        "sourceCatalogUrl": catalog_href,
        "skipExistingItems": skip_existing_items,
        "keepOriginalAssets": keep_original_assets,
    }
    
  5. Senden Sie die Nutzlast an die Massenerfassungs-API.

    ing_response = requests.post(
        url,
        json=body,
        timeout=timeout_seconds,
        headers={"Authorization": f"Bearer {access_token.token}"},
        params={"api-version": API_VERSION},
    )
    
  6. Überprüfen Sie die Antwort.

    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. Überprüfen Sie den Status des Datenaufnahme-Workflows.

    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}")
    
    

Sobald der Workflow abgeschlossen ist, können Sie Ihre geospatialen Daten mithilfe der GeoCatalog STAC- oder Daten-APIs oder mit dem Daten-Explorer abfragen, abrufen oder visualisieren. Wenn Probleme auftreten, lesen Sie das Handbuch zur Problembehebung oder die Liste der Fehlercodes für Erfassungsprobleme.

Bereinigen von Ressourcen

  • Aufnahmequelle löschen

    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")
    

Nächste Schritte

Nachdem Sie nun einige Elemente hinzugefügt haben, sollten Sie die Daten für die Visualisierung konfigurieren.