1
0
mirror of https://github.com/django/django.git synced 2025-10-24 06:06:09 +00:00

Fixed #26510 -- Allowed dim/trim/precision as WKTWriter init arguments

Thanks Tim Graham for the review.
This commit is contained in:
Claude Paroz
2016-04-16 10:50:24 +02:00
parent 05d08367d7
commit 10c53385f8
4 changed files with 56 additions and 14 deletions

View File

@@ -408,7 +408,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
@property
def wkt(self):
"Returns the WKT (Well-Known Text) representation of this Geometry."
return wkt_w(3 if self.hasz else 2).write(self).decode()
return wkt_w(dim=3 if self.hasz else 2).write(self).decode()
@property
def hex(self):
@@ -419,7 +419,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
"""
# A possible faster, all-python, implementation:
# str(self.wkb).encode('hex')
return wkb_w(3 if self.hasz else 2).write_hex(self)
return wkb_w(dim=3 if self.hasz else 2).write_hex(self)
@property
def hexewkb(self):
@@ -428,7 +428,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
extension of the WKB specification that includes SRID value that are
a part of this geometry.
"""
return ewkb_w(3 if self.hasz else 2).write_hex(self)
return ewkb_w(dim=3 if self.hasz else 2).write_hex(self)
@property
def json(self):

View File

@@ -170,6 +170,14 @@ class WKTWriter(IOBase):
_trim = False
_precision = None
def __init__(self, dim=2, trim=False, precision=None):
super(WKTWriter, self).__init__()
if bool(trim) != self._trim:
self.trim = trim
if precision is not None:
self.precision = precision
self.outdim = dim
def write(self, geom):
"Returns the WKT representation of the given geometry."
return wkt_writer_write(self.ptr, geom.ptr)
@@ -212,6 +220,10 @@ class WKBWriter(IOBase):
_destructor = wkb_writer_destroy
ptr_type = WKB_WRITE_PTR
def __init__(self, dim=2):
super(WKBWriter, self).__init__()
self.outdim = dim
def write(self, geom):
"Returns the WKB representation of the given geometry."
return six.memoryview(wkb_writer_write(self.ptr, geom.ptr, byref(c_size_t())))
@@ -280,10 +292,13 @@ def wkt_r():
return thread_context.wkt_r
def wkt_w(dim=2):
def wkt_w(dim=2, trim=False, precision=None):
if not thread_context.wkt_w:
thread_context.wkt_w = WKTWriter()
thread_context.wkt_w.outdim = dim
thread_context.wkt_w = WKTWriter(dim=dim, trim=trim, precision=precision)
else:
thread_context.wkt_w.outdim = dim
thread_context.wkt_w.trim = trim
thread_context.wkt_w.precision = precision
return thread_context.wkt_w
@@ -295,14 +310,16 @@ def wkb_r():
def wkb_w(dim=2):
if not thread_context.wkb_w:
thread_context.wkb_w = WKBWriter()
thread_context.wkb_w.outdim = dim
thread_context.wkb_w = WKBWriter(dim=dim)
else:
thread_context.wkb_w.outdim = dim
return thread_context.wkb_w
def ewkb_w(dim=2):
if not thread_context.ewkb_w:
thread_context.ewkb_w = WKBWriter()
thread_context.ewkb_w = WKBWriter(dim=dim)
thread_context.ewkb_w.srid = True
thread_context.ewkb_w.outdim = dim
else:
thread_context.ewkb_w.outdim = dim
return thread_context.ewkb_w