Changeset 1293
- Timestamp:
- 05/01/08 16:02:17 (7 months ago)
- Files:
-
- pleiades.keytree/trunk/keytree/factory.py (modified) (1 diff)
- pleiades.keytree/trunk/keytree/model.py (modified) (1 diff)
- pleiades.keytree/trunk/keytree/tests/features.txt (modified) (2 diffs)
- pleiades.keytree/trunk/keytree/tests/pleiades-kml.txt (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pleiades.keytree/trunk/keytree/factory.py
r1292 r1293 6 6 from keytree.model import GEOM_TYPES 7 7 8 def feature(placemark_element): 9 kmlns = placemark_element.tag.split('}')[0][1:] 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) 10 13 for geom_type in GEOM_TYPES: 11 14 tag = '{%s}%s' % (kmlns, geom_type) 12 geom etry_element = placemark_element.find(tag)13 if geom etry_element is not None:14 g = geometry(geom etry_element)15 return Feature( g)16 return Feature( None)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) 17 20 18 def geometry( geometry_element):19 tp = geometry_element.tag.split('}')21 def geometry(element): 22 tp = element.tag.split('}') 20 23 kmlns = tp[0][1:] 21 24 geom_type = tp[1] 22 return geometry_factory[geom_type]( geometry_element, kmlns)25 return geometry_factory[geom_type](element, kmlns) 23 26 24 def geometry_Point( geometry_element, kmlns):25 t = geometry_element.findtext('{%s}coordinates' % kmlns)27 def geometry_Point(element, kmlns): 28 t = element.findtext('{%s}coordinates' % kmlns) 26 29 tv = t.split(',') 27 30 return Geometry('Point', tuple([float(v) for v in tv])) 28 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 29 64 geometry_factory = { 30 65 'Point': geometry_Point, 66 'LineString': geometry_LineString, 67 'Polygon': geometry_Polygon, 31 68 } pleiades.keytree/trunk/keytree/model.py
r1292 r1293 24 24 class Feature(object): 25 25 26 def __init__(self, geometry): 26 def __init__(self, kid=None, geometry=None, properties=None, **kw): 27 self.id = kid 27 28 self.geometry = geometry 29 self.properties = properties or {} 30 self.properties.update(kw) 28 31 29 32 @property 30 33 def __geo_interface__(self): 31 return dict(geometry=self.geometry.__geo_interface__) 34 return dict( 35 id=self.id, 36 geometry=self.geometry.__geo_interface__, 37 properties=dict(self.properties) 38 ) pleiades.keytree/trunk/keytree/tests/features.txt
r1292 r1293 2 2 =========================================== 3 3 4 >>> kmlfile = open_file('archaic.kml') 4 >>> kml = """<?xml version="1.0" encoding="UTF-8"?> 5 ... <kml xmlns="http://www.opengis.net/kml/2.2"> 6 ... <Document> 7 ... <Placemark> 8 ... <name>point</name> 9 ... <description>Point test</description> 10 ... <Point> 11 ... <coordinates> 12 ... -122.364383,37.824664,0 13 ... </coordinates> 14 ... </Point> 15 ... </Placemark> 16 ... <Placemark> 17 ... <name>line string</name> 18 ... <description>LineString test</description> 19 ... <LineString> 20 ... <coordinates> 21 ... -122.364383,37.824664,0 -122.364152,37.824322,0 22 ... </coordinates> 23 ... </LineString> 24 ... </Placemark> 25 ... <Placemark> 26 ... <name>polygon</name> 27 ... <description>Polygon test</description> 28 ... <Polygon> 29 ... <outerBoundaryIs> 30 ... <LinearRing> 31 ... <coordinates> 32 ... -122.366278,37.818844,30 33 ... -122.365248,37.819267,30 34 ... -122.365640,37.819861,30 35 ... -122.366669,37.819429,30 36 ... -122.366278,37.818844,30 37 ... </coordinates> 38 ... </LinearRing> 39 ... </outerBoundaryIs> 40 ... <innerBoundaryIs> 41 ... <LinearRing> 42 ... <coordinates> 43 ... -122.366212,37.818977,30 44 ... -122.365424,37.819294,30 45 ... -122.365704,37.819731,30 46 ... -122.366488,37.819402,30 47 ... -122.366212,37.818977,30 48 ... </coordinates> 49 ... </LinearRing> 50 ... </innerBoundaryIs> 51 ... </Polygon> 52 ... </Placemark> 53 ... </Document> 54 ... </kml>""" 55 5 56 >>> from elementtree import ElementTree as etree 6 >>> kmltree = etree.parse(kmlfile) 7 >>> placemarks = [p for p in kmltree.findall('*/{http://earth.google.com/kml/2.1}Placemark')] 8 >>> len(placemarks) 9 11 57 >>> kmltree = etree.fromstring(kml) 58 >>> placemarks = [p for p in kmltree.findall('*/{http://www.opengis.net/kml/2.2}Placemark')] 10 59 11 60 >>> from keytree import feature … … 14 63 'Point' 15 64 >>> print f.geometry.coordinates 16 ( 21.9725, 32.89629..., 0.0)65 (-122.36438..., 37.82466..., 0.0) 17 66 >>> gi = f.__geo_interface__ 18 67 >>> gi['geometry']['type'] 19 68 'Point' 20 69 >>> print gi['geometry']['coordinates'] 21 (21.9725, 32.89629..., 0.0) 70 (-122.36438..., 37.82466..., 0.0) 71 >>> gi['properties']['name'] 72 'point' 73 >>> gi['properties']['description'] 74 'Point test' 22 75 76 >>> f = feature(placemarks[1]) 77 >>> f.geometry.type 78 'LineString' 79 >>> print f.geometry.coordinates 80 ((-122.36438..., 37.82466..., 0.0), (-122.36415..., 37.82432..., 0.0)) 81 >>> gi = f.__geo_interface__ 82 >>> gi['geometry']['type'] 83 'LineString' 84 >>> print gi['geometry']['coordinates'] 85 ((-122.36438..., 37.82466..., 0.0), (-122.36415..., 37.82432..., 0.0)) 86 >>> gi['properties']['name'] 87 'line string' 88 >>> gi['properties']['description'] 89 'LineString test' 90 91 >>> f = feature(placemarks[2]) 92 >>> f.geometry.type 93 'Polygon' 94 >>> shell, hole = f.geometry.coordinates 95 >>> print shell 96 ((-122.36627..., 37.81884..., 30.0), ...) 97 >>> print hole 98 ((-122.366212, 37.81897..., 30.0), ...)
