Sdílet prostřednictvím


Azure FarmBeats klientské knihovny pro Python – verze 1.0.0b2

FarmBeats je nabídka B2B PaaS od Microsoftu, která společnosti AgriFood usnadňuje vytváření inteligentních digitálních zemědělských řešení v Azure. FarmBeats umožňuje uživatelům získávat, agregovat a zpracovávat zemědělská data z různých zdrojů (vybavení farmy, počasí, satelity), aniž by museli investovat do hlubokých zdrojů přípravy dat.  Zákazníci můžou vytvářet řešení SaaS nad farmbeats a využívat prvotřídní podporu pro vytváření modelů ke generování přehledů ve velkém měřítku.

Pomocí klientské knihovny FarmBeats pro Python postupujte následovně.

  • Vytváření & aktualizačních akcí, farem, polí, sezónních polí a hranic
  • Ingestování satelitních dat a dat o počasí pro oblasti zájmu.
  • Ingestují se údaje o operacích zemědělských podniků, které se týkají obdělávání, výsadby, sklizně a uplatňování vstupů do zemědělských podniků.

Zdrojový kód | Balíček (PyPi) | Referenční dokumentace k | rozhraní API Dokumentace k | produktu Changelog

Začínáme

Požadavky

Pokud chcete tento balíček použít, musíte mít:

Instalace balíčku

Nainstalujte klientskou knihovnu Azure FarmBeats pro Python pomocí pip:

pip install azure-agrifood-farming

Ověření klienta

Pokud chcete použít přihlašovací údaje tokenu Azure Active Directory (AAD), zadejte instanci požadovaného typu přihlašovacích údajů získané z knihovny azure-identity .

Pokud se chcete ověřit pomocí AAD, musíte nejprve nainstalovatazure-identity a povolit ověřování AAD ve vašem prostředku FarmBeats. Pokud jste postupovali podle dokumentace k instalaci při vytváření prostředku FarmBeats, je to již popsáno.

Po nastavení můžete zvolit, jaký typ přihlašovacích údajů z azure.identity chcete použít. Například DefaultAzureCredential se dá použít k ověření klienta:

Nastavte hodnoty ID klienta, ID tenanta a tajného klíče klienta aplikace AAD jako proměnné prostředí: AZURE_CLIENT_ID, AZURE_TENANT_ID AZURE_CLIENT_SECRET

K ověření klienta použijte vrácené přihlašovací údaje tokenu:

from azure.agrifood.farming import FarmBeatsClient
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
client = FarmBeatsClient(endpoint="https://<my-account-name>.farmbeats.azure.net", credential=credential)

Klíčové koncepty

Základní znalost následujících termínů vám pomůže začít s klientskou knihovnou FarmBeats.

Hierarchie farmy

Hierarchie farmy je kolekce níže uvedených entit.

  • Strana - je správcem všech agronomických dat.
  • Farma – je logická kolekce polí a/nebo sezónních polí. Nemají s nimi spojenou žádnou oblast.
  • Pole – je oblast s více mnohoúhelníkem. Očekává se, že bude stabilní v různých ročních obdobích.
  • Sezónní pole – oblast s více mnohoúhelníkem. K definování sezónní hranice potřebujeme podrobnosti o ploše (hranici), času (ročním období) a plodině. Očekává se, že pro každé rostoucí období budou vytvořena nová sezónní pole.
  • Hranice – je skutečná oblast s více polygony vyjádřená geometrií (v geojsonu). Obvykle se přidružuje k poli nebo sezónnímu poli. Satelitní data, data o počasí a provozu farmy jsou propojená s hranicí.
  • Kaskádové odstranění – Agronomická data se ukládají hierarchicky se stranou jako kořenem. Hierarchie zahrnuje Party -> Farmy -> Pole -> Sezónní pole -> Hranice -> Přidružená data (satelitní, počasí, provoz farmy). Kaskádové odstranění označuje proces odstranění libovolného uzlu a jeho podstromu.

Scény

Scény odkazují na obrázky, které se obvykle ingestují pomocí satelitních rozhraní API. To zahrnuje nezpracovaná pásma a odvozená pásma (např. NDVI). Scény mohou také obsahovat prostorové výstupy odvození nebo modelu AI/ML (např. LAI).

Operace farmy

Fam operace zahrnují podrobnosti týkající se obdělávání, výsadby, aplikace pesticidů & živin a sklizně. To můžete buď ručně vložit do FarmBeats pomocí rozhraní API, nebo můžete získat stejné informace od poskytovatelů služeb pro vybavení farmy, jako je John Deere.

Příklady

Vytvořit večírek

Po ověření a vytvoření objektu klienta, jak je znázorněno v části Ověření klienta , můžete vytvořit stranu v rámci prostředku FarmBeats takto:

from azure.identity import DefaultAzureCredential
from azure.agrifood.farming import FarmBeatsClient

credential = DefaultAzureCredential()
client = FarmBeatsClient(endpoint="https://<my-account-name>.farmbeats.azure.net", credential=credential)

party_id = "party-1"

party = client.parties.create_or_update(
    party_id=party_id,
    party={
        "name": party_name,
        "description": party_description
    }
)

Vytvoření farmy

from azure.identity import DefaultAzureCredential
from azure.agrifood.farming import FarmBeatsClient

credential = DefaultAzureCredential()
client = FarmBeatsClient(endpoint="https://<my-account-name>.farmbeats.azure.net", credential=credential)

party_id = "party-1" # Using party from previous example

farm = client.farms.create_or_update(
    party_id=party_id,
    farm_id="farm-1",
    farm={
        "name": farm_name,
        "description": farm_description
    }
)

Vytvořit sezónu

Vytvoření objektu Season od dubna do srpna 2021

from azure.identity import DefaultAzureCredential
from azure.agrifood.farming import FarmBeatsClient

credential = DefaultAzureCredential()
client = FarmBeatsClient(endpoint="https://<my-account-name>.farmbeats.azure.net", credential=credential)

season_id = "contoso-season"
season_name = "contoso-season-name"
season_description = "contoso-season-description"
year = "2021"
start_date_time = "2021-01-01T20:08:10.137Z"
end_date_time = "2021-06-06T20:08:10.137Z"

season = client.seasons.create_or_update(
        season_id=season_id,
        season={
            "name": season_name,
            "year": year,
            "startDateTime": start_date_time,
            "endDateTime": end_date_time,
            "description": season_description
        }
    )

Vytvoření hranice

Vytvoření hranice pro sezónní pole vytvořené v předchozím příkladu

from azure.identity import DefaultAzureCredential
from azure.agrifood.farming import FarmBeatsClient

credential = DefaultAzureCredential()
client = FarmBeatsClient(endpoint="https://<my-account-name>.farmbeats.azure.net", credential=credential)

party_id = "party-1"
boundary_id = "boundary-1"

boundary = client.boundaries.create_or_update(
    party_id=party_id,
    boundary_id=boundary_id,
    boundary={
        "geometry": {
            "type": "Polygon",
            "coordinates":
                [
                    [
                        [73.70457172393799, 20.545385304358106],
                        [73.70457172393799, 20.545385304358106],
                        [73.70448589324951, 20.542411534243367],
                        [73.70877742767334, 20.541688176010233],
                        [73.71023654937744, 20.545083911372505],
                        [73.70663166046143, 20.546992723579137],
                        [73.70457172393799, 20.545385304358106],
                    ]
                ]
        },
        "status": "<string>",
        "name": "<string>",
        "description": "<string>"
    }
)

Ingestování satelitních snímků

Aktivace úlohy satelitního příjmu dat pro hranici vytvořenou výše, která ingestuje data indexu listové oblasti pro měsíc leden 2020. Jedná se o dlouhotrvající operaci (označovanou také jako úloha) a vrací objekt Poller. .result() Volání metody na objektu poller čeká na ukončení operace a vrátí konečný stav.

from azure.identity import DefaultAzureCredential
from azure.agrifood.farming import FarmBeatsClient

from isodate.tzinfo import Utc
from datetime import datetime

credential = DefaultAzureCredential()
client = FarmBeatsClient(endpoint="https://<my-account-name>.farmbeats.azure.net", credential=credential)

party_id = "party-1"
boundary_id = "westlake-boundary-1"
start_date_time = "2021-01-01T20:08:10.137Z"
end_date_time = "2021-06-06T20:08:10.137Z"

# Queue the job
satellite_job_poller = client.scenes.begin_create_satellite_data_ingestion_job(
    job_id=job_id,
    job={
        "boundaryId": boundary_id,
        "endDateTime": end_date_time,
        "partyId": party_id,
        "startDateTime": start_date_time,
        "provider": "Microsoft",
        "source": "Sentinel_2_L2A",
        "data": {
            "imageNames": [
                "NDVI"
            ],
            "imageFormats": [
                "TIF"
            ],
            "imageResolution": [10]
        },
        "name": "<string>",
        "description": "<string>"
    }
)

# Wait for the job to terminate
satellite_job = satellite_job_poller.result()
job_status = satellite_job_poller.status()

Získání ingestované satelitní scény

Dotazování na scény vytvořené úlohou v předchozím příkladu

from azure.identity import DefaultAzureCredential
from azure.agrifood.farming import FarmBeatsClient

from datetime import datetime

credential = DefaultAzureCredential()
client = FarmBeatsClient(endpoint="https://<my-account-name>.farmbeats.azure.net", credential=credential)

party_id = "party-1"
boundary_id = "boundary-1"

scenes = client.scenes.list(
    party_id=party_id,
    boundary_id=boundary_id,
    start_date_time=start_date_time,
    end_date_time=end_date_time,
    provider="Microsoft",
    source="Sentinel_2_L2A"
)

for scene in scenes:
    bands = [image_file["name"] for image_file in scene["imageFiles"]]
    bands_str = ", ".join(bands)
    print(f"Scene has the bands {bands_str}")

Řešení potíží

Obecné

Klient FarmBeats vyvolá výjimky definované v [Azure Core][azure_core] při volání .raise_for_status() odpovědí.

protokolování

Tato knihovna používá k protokolování standardní knihovnu protokolování . Základní informace o relacích HTTP (adresy URL, hlavičky atd.) se protokolují na úrovni INFO.

Podrobné protokolování úrovně DEBUG, včetně těl požadavků/odpovědí a nezopravovaných hlaviček, je možné povolit v klientovi s argumentem klíčového logging_enable slova:

import sys
import logging
from azure.identity import DefaultAzureCredential
from azure.agrifood.farming import FarmBeatsClient
# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)
# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
endpoint = "https://<my-account-name>.farmbeats.azure.net"
credential = DefaultAzureCredential()
# This client will log detailed information about its HTTP sessions, at DEBUG level
client = FarmBeatsClient(endpoint=endpoint, credential=credential, logging_enable=True)

Podobně logging_enable může povolit podrobné protokolování pro jedno volání, i když není povolené pro klienta:

client.crops.get(crop_id="crop_id", logging_enable=True)

Další kroky

Další dokumentace

Rozsáhlejší dokumentaci k FarmBeats najdete v dokumentaci FarmBeats na docs.microsoft.com.

Přispívání

Tento projekt vítá příspěvky a návrhy. Většina příspěvků vyžaduje souhlas s licenční smlouvou s přispěvatelem (CLA), která stanoví, že máte právo udělit nám práva k používání vašeho příspěvku a skutečně tak činíte. Podrobnosti najdete v cla.microsoft.com.

Při odesílání žádosti o přijetí změn robot CLA automaticky určí, jestli je potřeba poskytnout smlouvu CLA, a příslušným způsobem žádost o přijetí změn upraví (např. přidáním jmenovky nebo komentáře). Stačí postupovat podle pokynů robota. Pro všechna úložiště používající naši smlouvu CLA to stačí udělat jenom jednou.

Tento projekt přijal pravidla chování pro Microsoft Open Source. Další informace najdete v nejčastějších dotazech k pravidlům chování nebo kontaktujte s opencode@microsoft.com případnými dalšími dotazy nebo připomínkami.