Source code for pystac.extensions.single_file_stac

from pystac.catalog import Catalog

import pystac
from pystac import (STACError, Extensions)
from pystac.collection import Collection
from pystac.extensions.base import (CatalogExtension, ExtensionDefinition, ExtendedObject)


[docs]def create_single_file_stac(catalog): """Creates a Single File STAC from a STAC catalog. This method will recursively collect any collections and items in the catalog and return a new catalog with the same properties as the old one, with cleared links and the 'collections' and 'features' property of the Single File STAC holding each of the respective collected STAC objects. Collections will be filtered to only those referenced by items via the collection_id. All links in the items and collections will be cleared in the Single File STAC. Args: catalog (Catalog): Catalog to walk while constructin the Single File STAC """ collections = {} items = [] for root, _, cat_items in catalog.walk(): if issubclass(type(root), Collection): new_collection = root.clone() new_collection.clear_links() collections[root.id] = new_collection for item in cat_items: new_item = item.clone() new_item.clear_links() items.append(new_item) filtered_collections = [] for item in items: if item.collection_id in collections: filtered_collections.append(collections[item.collection_id]) collections.pop(item.collection_id) result = catalog.clone() result.clear_links() result.ext.enable(Extensions.SINGLE_FILE_STAC) result.ext[Extensions.SINGLE_FILE_STAC].apply(features=items, collections=filtered_collections) return result
[docs]class SingleFileSTACCatalogExt(CatalogExtension): """An extension of Catalog that provides a set of Collections and Items as a single file catalog. A SingleFileSTAC is a self contained catalog that contains everything that would normally be in a linked set of STAC files. Args: catalog (Catalog): The catalog to be extended. Attributes: catalog (Catalog): The catalog that is being extended. Note: Using SingleFileSTACCatalogExt to directly wrap a Catalog will add the 'proj' extension ID to the catalog's stac_extensions. """ def __init__(self, catalog): if catalog.stac_extensions is None: catalog.stac_extensions = [Extensions.SINGLE_FILE_STAC] elif Extensions.SINGLE_FILE_STAC not in catalog.stac_extensions: catalog.stac_extensions.append(Extensions.SINGLE_FILE_STAC) self.catalog = catalog
[docs] def apply(self, features, collections=None): """ Args: features (List[Item]): List of items contained by this SingleFileSTAC. collections (List[Collection]): Optional list of collections that are used by any of the Items in the catalog. """ self.features = features self.collections = collections
[docs] @classmethod def enable_extension(cls, catalog): # Ensure the 'type' property is correct so that the Catalog is valid GeoJSON. catalog.extra_fields['type'] = 'FeatureCollection'
@property def features(self): """Get or sets a list of :class:`~pystac.Item` contained in this Single File STAC. Returns: List[Item] """ features = self.catalog.extra_fields.get('features') if features is None: raise STACError('Invalid Single File STAC: does not have "features" property.') return [pystac.read_dict(feature) for feature in features] @features.setter def features(self, v): self.catalog.extra_fields['features'] = [item.to_dict() for item in v] @property def collections(self): """Get or sets a list of :class:`~pystac.Collection` objects contained in this Single File STAC. Returns: List[Band] """ collections = self.catalog.extra_fields.get('collections') if collections is not None: collections = [pystac.read_dict(col) for col in collections] return collections @collections.setter def collections(self, v): if v is not None: self.catalog.extra_fields['collections'] = [col.to_dict() for col in v] else: self.catalog.extra_fields.pop('collections', None) @classmethod def _object_links(cls): return []
[docs] @classmethod def from_catalog(cls, catalog): return SingleFileSTACCatalogExt(catalog)
SFS_EXTENSION_DEFINITION = ExtensionDefinition(Extensions.SINGLE_FILE_STAC, [ExtendedObject(Catalog, SingleFileSTACCatalogExt)])