root/pleiades.keytree/trunk/keytree/factory.py

Revision 1293, 2.1 kB (checked in by sgillies, 8 months ago)

line strings and polygons

Line 
1 """
2 Feature classes
3 """
4
5 from keytree.model import Geometry, Feature
6 from keytree.model import GEOM_TYPES
7
8 def feature(element):
9     kmlns = element.tag.split('}')[0][1:]
10     kid = element.attrib.get('id')
11     name = element.findtext('{%s}name' % kmlns)
12     description = element.findtext('{%s}description' % kmlns)
13     for geom_type in GEOM_TYPES:
14         tag = '{%s}%s' % (kmlns, geom_type)
15         geom_element = element.find(tag)
16         if geom_element is not None:
17             g = geometry(geom_element)
18             return Feature(kid, g, name=name, description=description)
19     return Feature(kid, None, name=name, description=description)
20
21 def geometry(element):
22     tp = element.tag.split('}')
23     kmlns = tp[0][1:]
24     geom_type = tp[1]
25     return geometry_factory[geom_type](element, kmlns)
26
27 def geometry_Point(element, kmlns):
28     t = element.findtext('{%s}coordinates' % kmlns)
29     tv = t.split(',')
30     return Geometry('Point', tuple([float(v) for v in tv]))
31
32 def geometry_LineString(element, kmlns):
33     text = element.findtext('{%s}coordinates' % kmlns)
34     ts = text.split()
35     coords = []
36     for t in ts:
37         tv = t.split(',')
38         coords.append(tuple([float(v) for v in tv]))
39     return Geometry('LineString', tuple(coords))
40
41 def geometry_Polygon(element, kmlns):
42     shell = element.find('{%s}outerBoundaryIs' % kmlns)
43     text = shell.findtext('*/{%s}coordinates' % kmlns)
44     ts = text.split()
45     shell_coords = []
46     for t in ts:
47         tv = t.split(',')
48         shell_coords.append(tuple([float(v) for v in tv]))
49     poly_coords = []
50     poly_coords.append(tuple(shell_coords))
51
52     holes = element.findall('{%s}innerBoundaryIs' % kmlns)
53     for hole in holes:
54         text = hole.findtext('*/{%s}coordinates' % kmlns)
55         ts = text.split()
56         hole_coords = []
57         for t in ts:
58             tv = t.split(',')
59             hole_coords.append(tuple([float(v) for v in tv]))
60         poly_coords.append(tuple(hole_coords))
61
62     return Geometry('Polygon', tuple(poly_coords))
63
64 geometry_factory = {
65     'Point': geometry_Point,
66     'LineString': geometry_LineString,
67     'Polygon': geometry_Polygon,
68     }
Note: See TracBrowser for help on using the browser.