Changeset 1293 for pleiades.keytree

Show
Ignore:
Timestamp:
05/01/08 16:02:17 (5 months ago)
Author:
sgillies
Message:

line strings and polygons

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • pleiades.keytree/trunk/keytree/factory.py

    r1292 r1293  
    66from keytree.model import GEOM_TYPES 
    77 
    8 def feature(placemark_element): 
    9     kmlns = placemark_element.tag.split('}')[0][1:] 
     8def 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) 
    1013    for geom_type in GEOM_TYPES: 
    1114        tag = '{%s}%s' % (kmlns, geom_type) 
    12         geometry_element = placemark_element.find(tag) 
    13         if geometry_element is not None: 
    14             g = geometry(geometry_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
    1720 
    18 def geometry(geometry_element): 
    19     tp = geometry_element.tag.split('}') 
     21def geometry(element): 
     22    tp = element.tag.split('}') 
    2023    kmlns = tp[0][1:] 
    2124    geom_type = tp[1] 
    22     return geometry_factory[geom_type](geometry_element, kmlns) 
     25    return geometry_factory[geom_type](element, kmlns) 
    2326 
    24 def geometry_Point(geometry_element, kmlns): 
    25     t = geometry_element.findtext('{%s}coordinates' % kmlns) 
     27def geometry_Point(element, kmlns): 
     28    t = element.findtext('{%s}coordinates' % kmlns) 
    2629    tv = t.split(',') 
    2730    return Geometry('Point', tuple([float(v) for v in tv])) 
    2831 
     32def 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 
     41def 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 
    2964geometry_factory = { 
    3065    'Point': geometry_Point, 
     66    'LineString': geometry_LineString, 
     67    'Polygon': geometry_Polygon, 
    3168    } 
  • pleiades.keytree/trunk/keytree/model.py

    r1292 r1293  
    2424class Feature(object): 
    2525 
    26     def __init__(self, geometry): 
     26    def __init__(self, kid=None, geometry=None, properties=None, **kw): 
     27        self.id = kid 
    2728        self.geometry = geometry 
     29        self.properties = properties or {} 
     30        self.properties.update(kw) 
    2831 
    2932    @property 
    3033    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  
    22=========================================== 
    33 
    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 
    556    >>> 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')] 
    1059 
    1160    >>> from keytree import feature 
     
    1463    'Point' 
    1564    >>> print f.geometry.coordinates 
    16     (21.9725, 32.89629..., 0.0) 
     65    (-122.36438..., 37.82466..., 0.0) 
    1766    >>> gi = f.__geo_interface__ 
    1867    >>> gi['geometry']['type'] 
    1968    'Point' 
    2069    >>> 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' 
    2275 
     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), ...)