Share via


Azure FarmBeats biblioteca de cliente para Python - versão 1.0.0b2

O FarmBeats é uma oferta de PaaS B2B da Microsoft que facilita a criação de soluções de agricultura digital inteligentes no Azure para empresas AgriFood. O FarmBeats permite que os utilizadores adquiram, agregam e processem dados agrícolas de várias origens (equipamentos agrícolas, meteorologia, satélite) sem a necessidade de investir em recursos de engenharia de dados profundos.  Os clientes podem criar soluções SaaS em cima do FarmBeats e tirar partido do suporte de primeira classe para a criação de modelos para gerar informações em escala.

Utilize a biblioteca de cliente FarmBeats para Python para fazer o seguinte.

  • Crie & entidades de atualização, farms, campos, campos sazonais e limites.
  • Ingerir dados de satélite e meteorologia para áreas de interesse.
  • Ingerir dados de operações do farm que abrangem o cultivo, a plantação, a colheita e a aplicação de entradas de farm.

Código fonte | Pacote (PyPi) | Documentação | de referência da APIDocumentação do | produto Registo de alterações

Introdução

Pré-requisitos

Para utilizar este pacote, tem de ter:

Instalar o pacote

Instale a biblioteca de cliente Azure FarmBeats para Python com pip:

pip install azure-agrifood-farming

Autenticar o cliente

Para utilizar uma credencial de token do Azure Active Directory (AAD), forneça uma instância do tipo de credencial pretendido obtido a partir da biblioteca de identidades do azure .

Para se autenticar com o AAD, primeiro tem de instalar azure-identity o pip e ativar a autenticação do AAD no recurso FarmBeats. Se seguiu os documentos de instalação ao criar o recurso FarmBeats, este já está abrangido.

Após a configuração, pode escolher o tipo de credencial a partir de azure.identity a utilizar. Por exemplo, DefaultAzureCredential pode ser utilizado para autenticar o cliente:

Defina os valores do ID do cliente, do ID do inquilino e do segredo do cliente da aplicação do AAD como variáveis de ambiente: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET

Utilize a credencial do token devolvido para autenticar o 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)

Conceitos-chave

A compreensão básica dos termos abaixo ajudará a começar a utilizar a biblioteca de cliente FarmBeats.

Hierarquia do Farm

A hierarquia do farm é uma coleção de entidades abaixo.

  • Party - é o guardião de todos os dados agrónomos.
  • Farm - é uma coleção lógica de campos e/ou campos sazonais. Não têm nenhuma área associada.
  • Field - é uma área multi-polígono. Espera-se que seja estável ao longo das estações.
  • Campo sazonal - é uma área multi-polígono. Para definir um limite sazonal, precisamos dos detalhes da área (limite), hora (estação) e recorte. Espera-se que sejam criados novos campos sazonais para cada estação em crescimento.
  • Boundary - é a área multi-polígono real expressa como geometria (em geojson). Normalmente, está associado a um campo ou a um campo sazonal. Os dados de operações de satélite, meteorologia e farm estão ligados a um limite.
  • Eliminação em cascata – os dados agrónomos são armazenados hierárquicos com parte como raiz. A hierarquia inclui Party - Farms -> Fields ->> Campos Sazonais -> Limites -> Dados associados (satélite, meteorologia, operações agrícolas). Eliminação em cascata refere-se ao processo de eliminação de qualquer nó e respetiva subárvore.

Cenas

Cenas referem-se a imagens normalmente ingeridas com APIs de satélite. Isto inclui bandas cruas e bandas derivadas (Ex: NDVI). As cenas também podem incluir saídas espaciais de um modelo de inferência ou IA/ML (Ex: LAI).

Operações do Farm

As operações de Fam incluem detalhes relativos ao tilling, plantação, aplicação de nutrientes de pesticidas & e colheita. Isto pode ser enviado manualmente para o FarmBeats com APIs ou as mesmas informações podem ser obtidas a partir de fornecedores de serviços de equipamentos agrícolas, como o John Deere.

Exemplos

Criar uma Festa

Depois de autenticar e criar o objeto de cliente conforme mostrado na secção Autenticar o cliente , pode criar uma parte no recurso FarmBeats da seguinte forma:

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

Criar um Farm

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

Criar uma Estação

Criar um objeto Temporada, que se estende 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
        }
    )

Criar um Limite

Criar um Limite para o Campo Sazonal criado no exemplo 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>"
    }
)

Ingerir Imagens de Satélite

Acionar uma tarefa de Ingestão de Dados por Satélite para o limite criado acima, para ingerir dados do Índice de Área de Folha para o mês de janeiro de 2020. Esta é uma Operação de Execução Prolongada (também denominada "Tarefa") e devolve um objeto Poller. Chamar o .result() método no objeto do poller aguarda que a operação termine e devolve o 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()

Obter Cenas de Satélite Ingeridas

Consultar as cenas criadas pela tarefa no exemplo 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}")

Resolução de problemas

Geral

O cliente FarmBeats irá gerar exceções definidas em [Azure Core][azure_core] se chamar .raise_for_status() as suas respostas.

Registo

Esta biblioteca utiliza a biblioteca de registos padrão para registos. As informações básicas sobre as sessões HTTP (URLs, cabeçalhos, etc.) são registadas ao nível da INFO.

O registo ao nível de DEBUG detalhado, incluindo corpos de pedido/resposta e cabeçalhos não retotados, pode ser ativado num cliente com o logging_enable argumento palavra-chave:

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)

Da mesma forma, logging_enable pode ativar o registo detalhado de uma única chamada, mesmo quando não está ativada para o cliente:

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

Passos seguintes

Documentação adicional

Para obter documentação mais extensa sobre o FarmBeats, veja a documentação do FarmBeats sobre docs.microsoft.com.

Contribuir

Agradecemos todas as contribuições e sugestões para este projeto. A maioria das contribuições requerem que celebre um Contrato de Licença de Contribuição (CLA) no qual se declare que tem o direito de conceder e que, na verdade, concede-nos os direitos para utilizar a sua contribuição. Para obter detalhes, visite cla.microsoft.com.

Quando submete um pedido Pull, um bot do CLA determina automaticamente se tem de fornecer um CLA e decorar o PR de forma adequada (por exemplo, etiqueta, comentário). Só tem de seguir as instruções fornecidas pelo bot. Apenas terá de fazer isto uma vez em todos os repositórios com o nosso CLA.

Este projeto adotou o Microsoft Open Source Code of Conduct (Código de Conduta do Microsoft Open Source). Para obter mais informações, consulte as FAQ do Código de Conduta ou o contacto opencode@microsoft.com com quaisquer perguntas ou comentários adicionais.