PyGeoApi: YIPEEO

Connect to PyGeoApi service

The YIPEEO vector data is exposed as OGC API - Features accessible via EODC’s PyGeoApi.

Available YIPEEO collections

Data set ID

Description

Access Level

pub_yipeeo_yield_fl

Yield estimation and prediction at field level.

Public

pub_yipeeo_yield_nuts2

Yield estimation and prediction at NUTS2 level.

Public

prv_yipeeo_yield_field

Yield estimation and prediction at field level.

Protected

prv_yipeeo_yield_nuts1

Yield estimation and prediction at NUTS1 level.

Protected

prv_yipeeo_yield_nuts2

Yield estimation and prediction at NUTS2 level.

Protected

prv_yipeeo_yield_nuts3

Yield estimation and prediction at NUTS3 level.

Protected

prv_yipeeo_yield_nuts4

Yield estimation and prediction at NUTS4 level.

Protected

prv_yipeeo_fertilize

Data on fertilizer use at field level.

Protected

prv_yipeeo_irrigate

Data on irrigation use at field level.

Protected

The protected collections are only accessible using an EODC account. This tutorial demonstates the use of the OGC API - Features making use to the owslib Python client and the EODC SDK for authentication.

import geopandas as gpd
import contextily as cx
from rich.console import Console

# EODC SDK
from eodc.auth import DaskOIDC

# OWSLIB
from owslib.ogcapi.features import Features

# EODC OGC API URL
EODC_OGCAPI_URL = 'https://features.services.eodc.eu/'

console = Console()

Without Authentication

Without Authentication, we can still list all available feature collections, as well as all features from collections which are not protected. But we are not able to read features from protected collections.

# create eodc_ogcapi object without authentication header
eodc_ogcapi = Features(EODC_OGCAPI_URL)
feature_collections = eodc_ogcapi.feature_collections()
console.print(feature_collections)

Try to get items of a protected collection.

collection_id = 'prv_yipeeo_yield_field'

# This will fail with an '401 Authorization required' error code
items = eodc_ogcapi.collection_items(collection_id)

With Authentication

To read features from protected collections, you need to authenticate with your EODC credentials. Enter your username, typically the email address you used to sign up at EODC. A password prompt will be opened automatically.

After sucessful authentication, the access token will be used as HTTP header for all future requests using OWSLIB.

# Enter your username, typically the
# email address you used to sign up at EODC
username = "firstname.lastname@eodc.eu" 

conn = DaskOIDC(username)

headers = {
    "Authorization": f"Bearer {conn.token['access_token']}"
}

# add HTTP headers to eodc_ogcapi object
eodc_ogcapi = Features(EODC_OGCAPI_URL, headers=headers)

Print properties of the first item of the given feature collection

items = eodc_ogcapi.collection_items(collection_id)
console.print(items['features'][0]['properties'])

Run a query to extract certain features

Query collection prv_yipeeo_yield_field for

  • common winter wheat (C1111)

  • winter barley (C1310), and

  • for a given bounding box near Brno

and we only want to have a subset of all attributes (properties)

bbox = [16.229703926693578,48.713318232352485,17.472665146572798,49.4680057323523]

selected_props = "crop_type,crop_id,yield,c_year"

cql_filter = "crop_type='common winter wheat' OR crop_type='winter barley'"

# get all items in the yipeeo_yield_fl collection
field_items = eodc_ogcapi.collection_items(
    collection_id=collection_id,
    bbox=bbox,
    limit=2000,
    properties=selected_props,
    filter=cql_filter,
)
console.print(f"We found {len(field_items['features'])} items matching the query criteria.")

Convert features into Geopandas DataFrame

df = gpd.GeoDataFrame.from_features(field_items["features"], crs="EPSG:4326")
df 

Plot geometries

ax = df[["geometry"]].plot(
    facecolor="none", figsize=(12, 6)
)
cx.add_basemap(ax, crs=df.crs.to_string(), source=cx.providers.OpenStreetMap.Mapnik)