Source code for stactools.core.create

import datetime
import os.path
from typing import List, Optional

import rasterio
import shapely.geometry
import stactools.core.projection
from pystac import Asset, Item
from pystac.extensions.projection import ProjectionExtension

from .io import ReadHrefModifier


[docs] def item( href: str, *, asset_key: str = "data", roles: List[str] = ["data"], read_href_modifier: Optional[ReadHrefModifier] = None, ) -> Item: """Creates a STAC Item from the asset at the provided href. The ``read_href_modifer`` argument can be used to modify the href for the rasterio read, e.g. if you need to sign a url. This function is intentionally minimal in its signature and capabilities. If you need to customize your Item, do so after creation. Args: href (str): The href of the asset that will be used to create the item. asset_key (str): The unique key of the asset roles (List[str]): The semantic roles of the asset read_href_modifier (Optional[ReadHrefModifier]): An optional callable that will be used to modify the href before reading. Returns: pystac.Item: A PySTAC Item. """ id = os.path.splitext(os.path.basename(href))[0] if read_href_modifier: modified_href = read_href_modifier(href) else: modified_href = href with rasterio.open(modified_href) as dataset: crs = dataset.crs proj_bbox = dataset.bounds proj_transform = list(dataset.transform)[0:6] proj_shape = dataset.shape geom = stactools.core.projection.reproject_shape( crs, "EPSG:4326", shapely.geometry.box(*proj_bbox), precision=6 ) bbox = list(geom.bounds) geojson = shapely.geometry.mapping(geom) item = Item( id=id, geometry=geojson, bbox=bbox, datetime=datetime.datetime.now(), properties={}, ) projection = ProjectionExtension.ext(item, add_if_missing=True) epsg = crs.to_epsg() if epsg: projection.epsg = epsg else: projection.wkt2 = crs.to_wkt("WKT2") projection.transform = proj_transform projection.shape = proj_shape item.add_asset(asset_key, Asset(href=href, roles=roles)) return item