diff -r 000000000000 -r 0d40e90630ef web/lib/django/contrib/gis/geos/io.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/gis/geos/io.py Wed Jan 20 00:34:04 2010 +0100 @@ -0,0 +1,123 @@ +""" +Module that holds classes for performing I/O operations on GEOS geometry +objects. Specifically, this has Python implementations of WKB/WKT +reader and writer classes. +""" +from ctypes import byref, c_size_t +from django.contrib.gis.geos.base import GEOSBase +from django.contrib.gis.geos.error import GEOSException +from django.contrib.gis.geos.geometry import GEOSGeometry +from django.contrib.gis.geos.libgeos import GEOM_PTR +from django.contrib.gis.geos.prototypes import io as capi + +class IOBase(GEOSBase): + "Base class for GEOS I/O objects." + def __init__(self): + # Getting the pointer with the constructor. + self.ptr = self.constructor() + + def __del__(self): + # Cleaning up with the appropriate destructor. + if self._ptr: self.destructor(self._ptr) + +### WKT Reading and Writing objects ### + +# Non-public class for internal use because its `read` method returns +# _pointers_ instead of a GEOSGeometry object. +class _WKTReader(IOBase): + constructor = capi.wkt_reader_create + destructor = capi.wkt_reader_destroy + ptr_type = capi.WKT_READ_PTR + + def read(self, wkt): + if not isinstance(wkt, basestring): raise TypeError + return capi.wkt_reader_read(self.ptr, wkt) + +class WKTReader(_WKTReader): + def read(self, wkt): + "Returns a GEOSGeometry for the given WKT string." + return GEOSGeometry(super(WKTReader, self).read(wkt)) + +class WKTWriter(IOBase): + constructor = capi.wkt_writer_create + destructor = capi.wkt_writer_destroy + ptr_type = capi.WKT_WRITE_PTR + + def write(self, geom): + "Returns the WKT representation of the given geometry." + return capi.wkt_writer_write(self.ptr, geom.ptr) + +### WKB Reading and Writing objects ### + +# Non-public class for the same reason as _WKTReader above. +class _WKBReader(IOBase): + constructor = capi.wkb_reader_create + destructor = capi.wkb_reader_destroy + ptr_type = capi.WKB_READ_PTR + + def read(self, wkb): + "Returns a _pointer_ to C GEOS Geometry object from the given WKB." + if isinstance(wkb, buffer): + wkb_s = str(wkb) + return capi.wkb_reader_read(self.ptr, wkb_s, len(wkb_s)) + elif isinstance(wkb, basestring): + return capi.wkb_reader_read_hex(self.ptr, wkb, len(wkb)) + else: + raise TypeError + +class WKBReader(_WKBReader): + def read(self, wkb): + "Returns a GEOSGeometry for the given WKB buffer." + return GEOSGeometry(super(WKBReader, self).read(wkb)) + +class WKBWriter(IOBase): + constructor = capi.wkb_writer_create + destructor = capi.wkb_writer_destroy + ptr_type = capi.WKB_WRITE_PTR + + def write(self, geom): + "Returns the WKB representation of the given geometry." + return buffer(capi.wkb_writer_write(self.ptr, geom.ptr, byref(c_size_t()))) + + def write_hex(self, geom): + "Returns the HEXEWKB representation of the given geometry." + return capi.wkb_writer_write_hex(self.ptr, geom.ptr, byref(c_size_t())) + + ### WKBWriter Properties ### + + # Property for getting/setting the byteorder. + def _get_byteorder(self): + return capi.wkb_writer_get_byteorder(self.ptr) + + def _set_byteorder(self, order): + if not order in (0, 1): raise ValueError('Byte order parameter must be 0 (Big Endian) or 1 (Little Endian).') + capi.wkb_writer_set_byteorder(self.ptr, order) + + byteorder = property(_get_byteorder, _set_byteorder) + + # Property for getting/setting the output dimension. + def _get_outdim(self): + return capi.wkb_writer_get_outdim(self.ptr) + + def _set_outdim(self, new_dim): + if not new_dim in (2, 3): raise ValueError('WKB output dimension must be 2 or 3') + capi.wkb_writer_set_outdim(self.ptr, new_dim) + + outdim = property(_get_outdim, _set_outdim) + + # Property for getting/setting the include srid flag. + def _get_include_srid(self): + return bool(ord(capi.wkb_writer_get_include_srid(self.ptr))) + + def _set_include_srid(self, include): + if bool(include): flag = chr(1) + else: flag = chr(0) + capi.wkb_writer_set_include_srid(self.ptr, flag) + + srid = property(_get_include_srid, _set_include_srid) + +# Instances of the WKT and WKB reader/writer objects. +wkt_r = _WKTReader() +wkt_w = WKTWriter() +wkb_r = _WKBReader() +wkb_w = WKBWriter()