app/django/contrib/gis/utils/wkt.py
changeset 323 ff1a9aa48cfd
equal deleted inserted replaced
322:6641e941ef1e 323:ff1a9aa48cfd
       
     1 """
       
     2  Utilities for manipulating Geometry WKT.
       
     3 """
       
     4 
       
     5 def precision_wkt(geom, prec):
       
     6     """
       
     7     Returns WKT text of the geometry according to the given precision (an 
       
     8     integer or a string).  If the precision is an integer, then the decimal
       
     9     places of coordinates WKT will be truncated to that number:
       
    10 
       
    11      >>> pnt = Point(5, 23)
       
    12      >>> pnt.wkt
       
    13      'POINT (5.0000000000000000 23.0000000000000000)'
       
    14      >>> precision(geom, 1)
       
    15      'POINT (5.0 23.0)'
       
    16 
       
    17     If the precision is a string, it must be valid Python format string 
       
    18     (e.g., '%20.7f') -- thus, you should know what you're doing.
       
    19     """
       
    20     if isinstance(prec, int):
       
    21         num_fmt = '%%.%df' % prec
       
    22     elif isinstance(prec, basestring):
       
    23         num_fmt = prec
       
    24     else:
       
    25         raise TypeError
       
    26 
       
    27     # TODO: Support 3D geometries.
       
    28     coord_fmt = ' '.join([num_fmt, num_fmt])
       
    29 
       
    30     def formatted_coords(coords):
       
    31         return ','.join([coord_fmt % c[:2] for c in coords])
       
    32 
       
    33     def formatted_poly(poly):
       
    34         return ','.join(['(%s)' % formatted_coords(r) for r in poly])
       
    35 
       
    36     def formatted_geom(g):
       
    37         gtype = str(g.geom_type).upper()
       
    38         yield '%s(' % gtype
       
    39         if gtype == 'POINT':
       
    40             yield formatted_coords((g.coords,))
       
    41         elif gtype in ('LINESTRING', 'LINEARRING'):
       
    42             yield formatted_coords(g.coords)
       
    43         elif gtype in ('POLYGON', 'MULTILINESTRING'):
       
    44             yield formatted_poly(g)
       
    45         elif gtype == 'MULTIPOINT':
       
    46             yield formatted_coords(g.coords)
       
    47         elif gtype == 'MULTIPOLYGON':
       
    48             yield ','.join(['(%s)' % formatted_poly(p) for p in g])
       
    49         elif gtype == 'GEOMETRYCOLLECTION':
       
    50             yield ','.join([''.join([wkt for wkt in formatted_geom(child)]) for child in g])
       
    51         else:
       
    52             raise TypeError
       
    53         yield ')'
       
    54 
       
    55     return ''.join([wkt for wkt in formatted_geom(geom)])