Source code for buzzard._a_source

import sys

from osgeo import osr

from buzzard import _tools

[docs]class ASource(object): """Base abstract class defining the common behavior of all sources opened in the Dataset. Features Defined ---------------- - Has a `stored` spatial reference - Has a `virtual` spatial reference that is influenced by the Dataset's opening mode - Can be closed """ def __init__(self, ds, back): self._ds = ds self._back = back @property def wkt_stored(self): """The spatial reference that can be found in the metadata of a source, in wkt format. string or None """ return self._back.wkt_stored @property def proj4_stored(self): """The spatial reference that can be found in the metadata of a source, in proj4 format. string or None """ return self._back.proj4_stored @property def wkt_virtual(self): """The spatial reference considered to be written in the metadata of a source, in wkt format. string or None """ return self._back.wkt_virtual @property def proj4_virtual(self): """The spatial reference considered to be written in the metadata of a source, in proj4 format. string or None """ return self._back.proj4_virtual
[docs] def get_keys(self): """Get the list of keys under which this source is registered to in the Dataset""" return list(self._ds._keys_of_source[self])
@property def close(self): """Close a source with a call or a context management. The `close` attribute returns an object that can be both called and used in a with statement Examples -------- >>> ds.dem.close() >>> with ds.dem.close: # code... >>> with ds.acreate_raster('result.tif', fp, float, 1).close as result: # code... >>> with ds.acreate_vector('results.shp', 'linestring').close as roofs: # code... """ def _close(): self._back.close() self._ds._unregister(self) del self._ds del self._back return _CloseRoutine(self, _close)
[docs] def __del__(self): if hasattr(self, '_ds'): self.close()
# Deprecation wkt_origin = _tools.deprecation_pool.wrap_property( 'wkt_virtual', '0.4.4' ) proj4_origin = _tools.deprecation_pool.wrap_property( 'proj4_virtual', '0.4.4' )
class ABackSource(object): """Implementation of ASource's specifications""" def __init__(self, back_ds, wkt_stored, rect, **kwargs): wkt_virtual = back_ds.virtual_of_stored_given_mode( wkt_stored, back_ds.wkt_work, back_ds.wkt_fallback, back_ds.wkt_forced, ) if wkt_virtual is not None: sr_virtual = osr.SpatialReference(wkt_virtual) else: sr_virtual = None to_work, to_virtual = back_ds.get_transforms(sr_virtual, rect) self.back_ds = back_ds self.wkt_stored = wkt_stored self.wkt_virtual = wkt_virtual self.to_work = to_work self.to_virtual = to_virtual super().__init__(**kwargs) def close(self): """Virtual method: - May be overriden - Should always be called """ del self.back_ds @property def proj4_virtual(self): if self.wkt_virtual is None: return None # pragma: no cover return osr.SpatialReference(self.wkt_virtual).ExportToProj4() @property def proj4_stored(self): if self.wkt_stored is None: return None # pragma: no cover return osr.SpatialReference(self.wkt_stored).ExportToProj4() _CloseRoutine = type('_CloseRoutine', (_tools.CallOrContext,), { '__doc__': ASource.close.__doc__, }) if sys.version_info < (3, 6): # https://www.python.org/dev/peps/pep-0487/ for k, v in ASource.__dict__.items(): if hasattr(v, '__set_name__'): v.__set_name__(ASource, k)