bibliothèque cliente Azure FarmBeats pour Python - version 1.0.0b2

FarmBeats est une offre PaaS B2B de Microsoft qui permet aux entreprises agroalimentaires de créer facilement des solutions d’agriculture numérique intelligentes sur Azure. FarmBeats permet aux utilisateurs d’acquérir, d’agréger et de traiter des données agricoles provenant de diverses sources (équipement agricole, météo, satellite) sans avoir à investir dans des ressources d’ingénierie des données approfondies.  Les clients peuvent créer des solutions SaaS sur FarmBeats et tirer parti d’une prise en charge de première classe pour la génération de modèles pour générer des insights à grande échelle.

Utilisez la bibliothèque cliente FarmBeats pour Python pour effectuer les opérations suivantes.

  • Créez & des parties de mise à jour, des batteries de serveurs, des champs, des champs saisonniers et des limites.
  • Ingérer des données satellites et météorologiques pour les zones d’intérêt.
  • Ingérer des données d’exploitation agricole couvrant le labourage, la plantation, la récolte et l’application d’intrants agricoles.

| Code sourcePackage (PyPi) | Documentation de référence sur les | API | Documentation produitChangelog

Prise en main

Prérequis

Pour utiliser ce package, vous devez disposer des éléments suivants :

Installer le package

Installez la bibliothèque cliente Azure FarmBeats pour Python avec pip :

pip install azure-agrifood-farming

Authentifier le client

Pour utiliser des informations d’identification de jeton Azure Active Directory (AAD), fournissez une instance du type d’informations d’identification souhaité obtenue à partir de la bibliothèque azure-identity .

Pour vous authentifier auprès d’AAD, vous devez d’abord installer azure-identity et activer l’authentification AAD sur votre ressource FarmBeats. Si vous avez suivi les documents d’installation lors de la création de la ressource FarmBeats, cela est déjà couvert.

Après l’installation, vous pouvez choisir le type d’informations d’identification d’azure.identity à utiliser. Par exemple, DefaultAzureCredential peut être utilisé pour authentifier le client :

Définissez les valeurs de l’ID client, de l’ID de locataire et de la clé secrète client de l’application AAD en tant que variables d’environnement : AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET

Utilisez les informations d’identification de jeton retournées pour authentifier le client :

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)

Concepts clés

La compréhension de base des termes ci-dessous vous aidera à démarrer avec la bibliothèque cliente FarmBeats.

Hiérarchie de batterie de serveurs

La hiérarchie de batterie est une collection d’entités ci-dessous.

  • Partie - est le dépositaire de toutes les données agronomiques.
  • Batterie de serveurs : collection logique de champs et/ou de champs saisonniers. Ils n’ont aucune zone associée à eux.
  • Champ : est une zone à plusieurs polygones. On s’attend à ce que ce soit stable au fil des saisons.
  • Champ saisonnier : est une zone à plusieurs polygones. Pour définir une limite saisonnière, nous avons besoin des détails de la zone (limite), de l’heure (saison) et de la culture. On s’attend à ce que de nouveaux champs saisonniers soient créés pour chaque saison de croissance.
  • Limite : est la zone multi polygonale réelle exprimée sous forme de géométrie (dans geojson). Il est normalement associé à un champ ou à un champ saisonnier. Les données satellites, météorologiques et agricoles sont liées à une limite.
  • Suppression en cascade : les données agronomiques sont stockées hiérarchiquement avec partie comme racine. La hiérarchie inclut Party -> Batteries de serveurs -> Champs - Champs -> Champs saisonniers -> Limites -> Données associées (satellite, météo, exploitations agricoles). La suppression en cascade fait référence au processus de suppression d’un nœud et de sa sous-arborescence.

Scènes

Les scènes font référence aux images normalement ingérées à l’aide d’API satellite. Cela inclut les bandes brutes et les bandes dérivées (ex : NDVI). Les scènes peuvent également inclure des sorties spatiales d’un modèle d’inférence ou d’IA/ML (ex : LAI).

Exploitations de la batterie de serveurs

Les opérations de fam comprennent des détails relatifs au labourage, à la plantation, à l’application de pesticides & nutritifs et à la récolte. Cela peut être envoyé manuellement dans FarmBeats à l’aide d’API ou les mêmes informations peuvent être extraites de fournisseurs de services d’équipement agricole comme John Deere.

Exemples

Créer une partie

Une fois que vous avez authentifié et créé l’objet client comme indiqué dans la section Authentifier le client , vous pouvez créer une partie dans la ressource FarmBeats comme suit :

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

Créer une batterie de serveurs

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

Créer une saison

Création d’un objet Season, d’avril à août 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
        }
    )

Créer une limite

Création d’une limite pour le champ saisonnier créé dans l’exemple précédent.

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

Ingérer des images satellites

Déclenchement d’un travail d’ingestion de données satellites pour la limite créée ci-dessus, afin d’ingérer des données d’index de zone feuille pour le mois de janvier 2020. Il s’agit d’une opération de longue durée (également appelée « travail »), qui retourne un objet Poller. L’appel de la .result() méthode sur l’objet poller attend que l’opération se termine et retourne l’état final.

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

Obtenir des scènes satellites ingérées

Interrogation des scènes créées par le travail dans l’exemple précédent.

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

Dépannage

Général

Le client FarmBeats déclenche des exceptions définies dans [Azure Core][azure_core] si vous appelez .raise_for_status() vos réponses.

Journalisation

Cette bibliothèque utilise la bibliothèque de journalisation standard pour la journalisation. Les informations de base sur les sessions HTTP (URL, en-têtes, etc.) sont enregistrées au niveau INFO.

La journalisation détaillée de niveau DEBUG, comprenant le corps de la demande et/ou de la réponse et les en-têtes non rédigés, peut être activée sur un client à l’aide de l’argument de mot clé logging_enable :

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)

De même, logging_enable peut activer la journalisation détaillée pour un seul appel, même si elle n’est pas activée pour le client :

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

Étapes suivantes

Documentation complémentaire

Pour obtenir une documentation plus complète sur les FarmBeats, consultez la documentation FarmBeats sur docs.microsoft.com.

Contribution

Ce projet accepte les contributions et les suggestions. La plupart des contributions vous demandent d’accepter un contrat de licence de contribution (CLA) déclarant que vous avez le droit de nous accorder, et que vous nous accordez réellement, les droits d’utilisation de votre contribution. Pour plus d’informations, consultez cla.microsoft.com.

Quand vous envoyez une demande de tirage (pull request), un bot CLA détermine automatiquement si vous devez fournir un contrat CLA et agrémenter la demande de tirage de façon appropriée (par exemple, avec une étiquette ou un commentaire). Suivez simplement les instructions fournies par le bot. Vous ne devez effectuer cette opération qu’une seule fois sur tous les dépôts utilisant notre contrat CLA.

Ce projet a adopté le Code de conduite Open Source de Microsoft. Pour plus d’informations, consultez les Questions fréquentes (FAQ) sur le code de conduite ou envoyez vos questions ou vos commentaires à opencode@microsoft.com.