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:
- Una suscripción de Azure (cree una cuenta gratuita).
- recurso de Azure FarmBeats: instalación de FarmBeats
- 3.6 o posterior: instalación de Python
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.
Azure SDK for Python