Django

Code

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

Revision 7547, 1.8 kB (checked in by jbronn, 6 months ago)

gis: Added the precision_wkt utility; add_postgis_srs may now take WKT/PROJ.4 strings and integer SRIDs.

Line 
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)])
Note: See TracBrowser for help on using the browser.