web/lib/django/contrib/gis/geos/io.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
--- a/web/lib/django/contrib/gis/geos/io.py	Wed May 19 17:43:59 2010 +0200
+++ b/web/lib/django/contrib/gis/geos/io.py	Tue May 25 02:43:45 2010 +0200
@@ -3,121 +3,18 @@
 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()
+from django.contrib.gis.geos.prototypes.io import _WKTReader, _WKBReader, WKBWriter, WKTWriter
 
-    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)
+# Public classes for (WKB|WKT)Reader, which return GEOSGeometry
+class WKBReader(_WKBReader):
+    def read(self, wkb):
+        "Returns a GEOSGeometry for the given WKB buffer."
+        return GEOSGeometry(super(WKBReader, self).read(wkb))
 
 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()