Create a Sentinel-2 Item

Install the package, then run this complete example with synthetic metadata:

from datetime import datetime, timezone

import pystac
from pystac.extensions.sentinel2 import Sentinel2Extension

acquisition_datetime = datetime(2023, 2, 1, tzinfo=timezone.utc)
item = pystac.Item(
    id="example-sentinel-2",
    geometry=None,
    bbox=None,
    datetime=acquisition_datetime,
    properties={},
)
sentinel2 = Sentinel2Extension.ext(item, add_if_missing=True)
sentinel2.apply(
    tile_id="S2B_OPER_MSI_L2A_TL_SGS__20230201T120000_A030000_T32TQM_N05.09",
    datatake_id="GS2B_20230201T103029_030000_N05.09",
    datatake_type="INS-NOBS",
    reflectance_conversion_factor=1.032,
)
serialized = item.to_dict()
assert Sentinel2Extension.get_schema_uri() in serialized["stac_extensions"]
assert serialized["properties"]["s2:datatake_type"] == "INS-NOBS"
restored = Sentinel2Extension.ext(pystac.Item.from_dict(serialized))
assert restored.tile_id == sentinel2.tile_id
assert restored.reflectance_conversion_factor == sentinel2.reflectance_conversion_factor

At least one of tile_id, datatake_id, product_uri, datastrip_id, datatake_type, or reflectance_conversion_factor is required for schema validation. Calling apply() without arguments clears all supported fields, so the resulting empty extension fails validation.

to_dict() serializes without running JSON Schema validation. With the pystac[validation] extra installed and schemas accessible, validate the complete Item:

item.validate()

See validation boundaries for details.