Landing pages & conformance¶
OGC API Common building blocks: the landing page (
GET /) and the conformance declaration (GET /conformance).
Landing page¶
LandingPage is the OGC API Common root document (GET /): a title, a
description, and a links list (deferred Links, like everywhere). It allows
extras for profile-specific members. This is the plain model; if your landing
page mirrors your router tree, the FastAPI glue can
generate a hierarchical one for you
instead of your building it by hand.
from gazebo.link import Link
from gazebo.ogc import LandingPage
from gazebo.rels import Rel
page = LandingPage(
title='Gazebo Gardens',
description='A plant catalog',
links=[
Link.self_link(),
Link.to_route('conformance', rel=Rel.CONFORMANCE),
],
)
Conformance¶
A service advertises which OGC conformance classes it implements at
GET /conformance. The Conformance registry collects the class URIs —
construct it with some, .add() more — and .declaration() produces a
ConformanceDeclaration that serializes as conformsTo. Common Common-spec URIs
are bundled as constants (Conformance.CORE, LANDING_PAGE, JSON, OAS30,
HTML).
from gazebo.ogc import Conformance
conformance = Conformance(Conformance.CORE, Conformance.JSON)
conformance.add(Conformance.LANDING_PAGE)
declaration = conformance.declaration()
Collections & extents¶
Right after the landing page, the OGC API Common endpoints are /collections
(a list) and /collections/{id} (one collection's metadata). Collection
describes a dataset — id, title, description, an extent, an itemType
(serialized as itemType), the crs list (defaulting to
CRS84), and links. Extent carries an optional
SpatialExtent (one or more bounding boxes in a CRS) and TemporalExtent (one or
more [start, end] intervals in a temporal RS, null meaning open). Collections
is the /collections envelope — a LinkedCollection whose items
serialize under collections:
from datetime import datetime, UTC
from gazebo.ogc import Collection, Collections, Extent, SpatialExtent, TemporalExtent
beds = Collection(
id='beds',
title='Garden Beds',
extent=Extent(
spatial=SpatialExtent(bbox=[[-123.0, 35.0, 140.0, 49.0]]),
# null on either side of an interval means open/unbounded
temporal=TemporalExtent(interval=[[datetime(2020, 1, 1, tzinfo=UTC), None]]),
),
)
# `/collections` is the envelope around the collection list.
catalog = Collections(items=[beds], links=[Link.self_link()])
For the actual feature items of a collection, see GeoJSON.
Reference¶
See gazebo.ogc.