def from_id(cls, scene_id, metadata_client=None): """ Return the metadata for a Descartes Labs scene ID as a Scene object. Also returns a :class:`~descarteslabs.scenes.geocontext.GeoContext` for loading the Scene's original, unwarped data. Parameters ---------- scene_id: str Descartes Labs scene ID, e.g. "landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1" metadata_client : Metadata, optional Unneeded in general use; lets you use a specific client instance with non-default auth and parameters. Returns ------- scene: Scene Scene instance with metadata loaded from the Descartes Labs catalog ctx: AOI A :class:`~descarteslabs.scenes.geocontext.GeoContext`for loading this Scene's original data. The defaults used are described in `Scene.default_ctx`. Example ------- >>> import descarteslabs as dl >>> scene, ctx = dl.scenes.Scene.from_id("landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1") # doctest: +SKIP >>> ctx # doctest: +SKIP AOI(geometry=None, resolution=15.0, crs='EPSG:32615', align_pixels=False, bounds=(348592.5, 4345567.5, 581632.5, 4582807.5), bounds_crs='EPSG:32615', shape=None) >>> scene.properties.date # doctest: +SKIP datetime.datetime(2016, 7, 15, 16, 53, 59, 495435) Raises ------ NotFoundError If the ``scene_id`` cannot be found in the Descartes Labs catalog """ if metadata_client is None: metadata_client = Metadata() metadata = metadata_client.get(scene_id) metadata = { "type": "Feature", "geometry": metadata.pop("geometry"), "id": metadata.pop("id"), "key": metadata.pop("key"), "properties": metadata } bands = metadata_client.get_bands_by_id(scene_id) scene = cls(metadata, bands) return scene, scene.default_ctx()
def from_id(cls, scene_id, metadata_client=None): """ Return the metadata for a Descartes Labs scene ID as a Scene object. Also returns a GeoContext with reasonable defaults to use when loading the Scene's ndarray. Parameters ---------- scene_id: str Descartes Labs scene ID, e.g. "landsat:LC08:PRE:TOAR:meta_LC80270312016188_v1" metadata_client : Metadata, optional Unneeded in general use; lets you use a specific client instance with non-default auth and parameters. Returns ------- scene: Scene Scene instance with metadata loaded from the Descartes Labs catalog ctx: AOI A default GeoContext useful for loading this Scene. These defaults are used: * bounds: bounds of the Scene's geometry * resolution: the finest resolution of any band in the scene * crs: native CRS of the Scene (generally, a UTM CRS) * align_pixels: True Example ------- >>> import descarteslabs as dl >>> scene, ctx = dl.scenes.Scene.from_id("landsat:LC08:PRE:TOAR:meta_LC80260322016197_v1") >>> ctx AOI(geometry=None, resolution=15, crs='EPSG:32615', align_pixels=True, bounds=(-94.724166, 39.2784859, -92.0686956, 41.3717716), shape=None) >>> scene.properties.date datetime.datetime(2016, 7, 15, 16, 53, 59, 495435) Raises ------ NotFoundError If the ``scene_id`` cannot be found in the Descartes Labs catalog """ if metadata_client is None: metadata_client = Metadata() metadata = metadata_client.get(scene_id) metadata = { "type": "Feature", "geometry": metadata.pop("geometry"), "id": metadata.pop("id"), "key": metadata.pop("key"), "properties": metadata } bands = metadata_client.get_bands_by_id(scene_id) scene = cls(metadata, bands) # TODO: not sure what default res should be try: default_resolution = min( filter(None, [b.get("resolution") for b in six.itervalues(bands)])) except ValueError: default_resolution = 100 # QUESTION: default bounds will now be in WGS84, not UTM # indeed, there's no way to give bounds in UTM besides with a DLTile, # which means you could get off-by-one issues with loading an entire scene # at native resolution, where the WGS84 bounds result in a slightly differently # sized raster than native UTM bounds would with reprojection errors try: bounds = scene.geometry.bounds except AttributeError: xs, ys = zip(*scene.geometry["coordinates"][0]) bounds = (min(xs), min(ys), max(xs), max(ys)) default_ctx = geocontext.AOI(bounds=bounds, resolution=default_resolution, crs=scene.properties["crs"]) return scene, default_ctx