Compartir a través de


Azure FarmBeats biblioteca cliente para Python: versión 1.0.0b2

FarmBeats es una oferta de PaaS B2B de Microsoft que facilita a las empresas AgriFood crear soluciones inteligentes de agricultura digital en Azure. FarmBeats permite a los usuarios adquirir, agregar y procesar datos agrícolas de diversos orígenes (equipo de granja, clima, satélite) sin necesidad de invertir en recursos de ingeniería de datos profundos.  Los clientes pueden crear soluciones SaaS sobre FarmBeats y aprovechar la compatibilidad de primera clase con la creación de modelos para generar información a escala.

Use la biblioteca cliente de FarmBeats para Python para hacer lo siguiente.

  • Crear & entidades de actualización, granjas, campos, campos estacionales y límites.
  • Ingesta de datos satélite y meteorológicos para áreas de interés.
  • Ingiera datos de operaciones de granja que abarcan el cultivo, la plantación, la recolección y la aplicación de entradas de granja.

Código | fuente Paquete (PyPi) | Documentación | de referencia de APIDocumentación | del producto Changelog

Introducción

Requisitos previos

Para usar este paquete, debe tener:

Instalar el paquete

Instale la biblioteca cliente de Azure FarmBeats para Python con pip:

pip install azure-agrifood-farming

Autenticar el cliente

Para usar una credencial de token de Azure Active Directory (AAD), proporcione una instancia del tipo de credencial deseado obtenido de la biblioteca azure-identity .

Para autenticarse con AAD, primero debe instalarazure-identity pip y habilitar la autenticación de AAD en el recurso de FarmBeats. Si ha seguido los documentos de instalación al crear el recurso FarmBeats, esto ya está cubierto.

Después de la instalación, puede elegir el tipo de credencial de azure.identity que se va a usar. Por ejemplo, Se puede usar DefaultAzureCredential para autenticar al cliente:

Establezca los valores del identificador de cliente, el identificador de inquilino y el secreto de cliente de la aplicación de AAD como variables de entorno: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET

Use la credencial de token devuelta para autenticar al cliente:

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)

Conceptos clave

La comprensión básica de los términos siguientes le ayudará a empezar a trabajar con la biblioteca cliente de FarmBeats.

Jerarquía de granjas de servidores

La jerarquía de granjas de servidores es una colección de entidades siguientes.

  • Parte : es el custodio de todos los datos agronómicos.
  • Granja de servidores: es una colección lógica de campos o campos estacionales. No tienen ninguna área asociada a ellos.
  • Campo: es un área de varios polígonos. Esto se espera que sea estable a lo largo de las temporadas.
  • Campo estacional: es un área de varios polígonos. Para definir un límite estacional, necesitamos los detalles del área (límite), el tiempo (temporada) y el recorte. Se espera que se creen nuevos campos estacionales para cada temporada de crecimiento.
  • Límite: es el área multi polígono real expresada como una geometría (en geojson). Normalmente está asociado a un campo o a un campo estacional. Los datos de operaciones satélite, meteorológica y de granja están vinculados a un límite.
  • Eliminación en cascada: los datos agronómicos se almacenan jerárquicamente con una entidad como raíz. La jerarquía incluye Party - Farms -> Fields ->> Seasonal Fields -> Boundaries -> Associated data (satélite, weather, farm operations). La eliminación en cascada hace referencia al proceso de eliminar cualquier nodo y su subárbol.

Escenas

Las escenas hacen referencia a imágenes ingeridas normalmente mediante las API satélite. Esto incluye bandas sin procesar y bandas derivadas (por ejemplo: NDVI). Las escenas también pueden incluir salidas espaciales de una inferencia o un modelo de IA/ML (por ejemplo, LAI).

Operaciones de granja de servidores

Las operaciones de Fam incluyen detalles relativos al cultivo, plantación, aplicación de nutrientes & de pesticidas y cosecha. Esto puede insertarse manualmente en FarmBeats mediante API o la misma información se puede extraer de proveedores de servicios de equipos de granja como John Deere.

Ejemplos

Crear una entidad

Una vez que haya autenticado y creado el objeto de cliente como se muestra en la sección Autenticar el cliente , puede crear una entidad dentro del recurso farmBeats de la siguiente manera:

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

Crear una granja de servidores

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

Crear una temporada

Creación de un objeto Season, que abarca de abril a agosto de 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
        }
    )

Crear un límite

Crear un límite para el campo estacional creado en el ejemplo anterior.

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

Ingesta de imágenes satélite

Desencadenar un trabajo de ingesta de datos satélite para el límite creado anteriormente, para ingerir datos del índice de área hoja durante el mes de enero de 2020. Se trata de una operación de larga duración (también denominada "Trabajo" ) y devuelve un objeto Poller. La llamada al .result() método en el objeto de sondeo espera a que finalice la operación y devuelve el estado 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()

Obtener escenas satélite ingeridas

Consulta de las escenas creadas por el trabajo en el ejemplo anterior.

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

Solución de problemas

General

El cliente de FarmBeats generará excepciones definidas en [Azure Core][azure_core] si llama a .raise_for_status() en las respuestas.

Registro

Esta biblioteca usa la biblioteca de registro estándar para el registro. La información básica sobre las sesiones HTTP (direcciones URL, encabezados, etc.) se registra en el nivel INFO.

El registro detallado del nivel de depuración, incluidos los cuerpos de solicitud y respuesta, y los encabezados no redactados, se puede habilitar en un cliente con el argumento de palabra clave 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)

Del mismo modo, logging_enable puede habilitar el registro detallado para una sola llamada, incluso cuando no está habilitado para el cliente:

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

Pasos siguientes

Documentación adicional

Para obtener documentación más extensa sobre FarmBeats, consulte la documentación de FarmBeats sobre docs.microsoft.com.

Contribuciones

Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución. Para obtener más información, visite cla.microsoft.com.

Cuando se envía una solicitud de incorporación de cambios, un bot de CLA determinará de forma automática si tiene que aportar un CLA y completar la PR adecuadamente (por ejemplo, la etiqueta, el comentario). Solo siga las instrucciones que le dará el bot. Solo será necesario que lo haga una vez en todos los repositorios con nuestro CLA.

Este proyecto ha adoptado el Código de conducta de Microsoft Open Source. Para más información, consulte las preguntas más frecuentes del código de conducta o póngase en contacto con opencode@microsoft.com si tiene cualquier otra pregunta o comentario.