PageRenderTime 22ms CodeModel.GetById 12ms app.highlight 6ms RepoModel.GetById 2ms app.codeStats 0ms

/django/contrib/gis/utils/wkt.py

https://code.google.com/p/mango-py/
Python | 55 lines | 42 code | 1 blank | 12 comment | 0 complexity | 22fb31b0d4d61e17904f7cd05be666f8 MD5 | raw file
 1"""
 2 Utilities for manipulating Geometry WKT.
 3"""
 4
 5def 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)])