Changeset 3258 for DPPP/kml


Ignore:
Timestamp:
22/01/08 16:28:36 (12 years ago)
Author:
mkochan
Message:

Updated quadrize_stations.py to generate KML with a hierarchy using <Folder>s (with associated <Region>s) and <Placemarks>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • DPPP/kml/csml2kml/python/prototypes/quadrize_stations.py

    r3256 r3258  
    11from random import random 
     2from cElementTree import ElementTree, Element, SubElement 
    23 
    34class Tree: 
     
    1213 
    1314class LocLeaf(Leaf): 
    14     def __init__(self, locations): 
     15    def __init__(self, locations, bbox): 
     16        self.bbox = bbox 
    1517        if not locations: 
    1618            raise ValueError('Empty location list passed') 
     
    1921        s = '' 
    2022        for loc in self.locations: s = s + repr(loc) + ',' 
    21         return '[' + s + ']' 
     23        return '[' + s + '] in ' + repr(self.bbox) 
    2224 
    2325class Node(Tree): 
    24     def __init__(self, children): 
     26    def __init__(self, children, bbox): 
     27        self.bbox = bbox 
    2528        if not children: 
    2629            raise ValueError('Empty child list passed') 
     30        if len(children) > 4: 
     31            raise ValueError('More than 4 children passed') 
    2732        self.children = children 
    2833    def __repr__(self): 
    2934        s = '' 
    3035        for c in self.children: s = s + repr(c) + ',' 
    31         return '[' + s + ']' 
     36        return '[' + s + '] in ' + repr(self.bbox) 
    3237 
    3338# Must use the lon in (-180,180), lat in (-90,90) bounds 
     
    5257 
    5358def f(l,bbox): 
    54     #!print 'Region ' + repr(bbox) + ' contains:' 
    5559    if len(l) == 0: 
    56         #!print 'Nothing.' 
    5760        return NilLeaf() 
    5861    elif len(l) <= max_per_region: 
    59         #!print 'Locations: ' + repr(l) 
    60         return LocLeaf(l) 
     62        return LocLeaf(l,bbox) 
    6163    else: 
    6264        (l1, l2, l3, l4) = ([], [], [], []) 
     
    7779        t3 = f(l3, bbox.nw()) 
    7880        t4 = f(l4, bbox.ne()) 
    79         #!print 'Regions:' 
    80         return Node([t1, t2, t3, t4]) 
     81        return Node([t1, t2, t3, t4],bbox) 
     82 
     83def g(t): 
     84    if isinstance(t, NilLeaf):                      # Do nothing 
     85        pass 
     86    elif isinstance(t, LocLeaf):                    # Create a <Folder> with embedded <Region> and <Placemark>s 
     87        folderElement = Element('Folder') 
     88        SubElement(folderElement, 'name').text = repr(t.bbox) 
     89        folderElement.append(buildRegionElement(t.bbox)) 
     90        for loc in t.locations: 
     91            folderElement.append(buildPlacemarkElement(loc)) 
     92        return folderElement 
     93    elif isinstance(t, Node):                       # Create a <Folder> containing nested elements 
     94        folderElement = Element('Folder') 
     95        SubElement(folderElement, 'name').text = repr(t.bbox) 
     96        folderElement.append(buildRegionElement(t.bbox)) 
     97        for i in t.children: 
     98            childElement = g(i)  # could be None 
     99            if childElement: 
     100                folderElement.append(childElement) 
     101        return folderElement 
     102 
     103def buildRegionElement(bbox): 
     104 
     105    llabElement = Element('LatLonAltBox') 
     106    SubElement(llabElement, 'west').text = str(bbox.west) 
     107    SubElement(llabElement, 'south').text = str(bbox.south) 
     108    SubElement(llabElement, 'east').text = str(bbox.east) 
     109    SubElement(llabElement, 'north').text = str(bbox.north) 
     110 
     111    lodElement = Element('Lod') 
     112    SubElement(lodElement, 'minLodPixels').text = '64' 
     113    SubElement(lodElement, 'maxLodPixels').text = '-1' 
     114    SubElement(lodElement, 'minFadeExtent').text = '128' 
     115 
     116    regionElement = Element('Region') 
     117    regionElement.append(llabElement) 
     118    regionElement.append(lodElement) 
     119    return regionElement 
     120 
     121def buildPlacemarkElement(loc): 
     122 
     123    pointElement = Element('Point') 
     124    (lon,lat) = loc 
     125    SubElement(pointElement, 'coordinates').text = '%f,%f,%f' % (lon,lat,0) 
     126 
     127    placemarkElement = Element('Placemark') 
     128    SubElement(placemarkElement, 'name').text = repr(loc) 
     129    placemarkElement.append(pointElement) 
     130    return placemarkElement 
     131 
     132def wrapRootFolderElement(rootFolderElement): 
     133 
     134    # Auxiliary function, indents XML 
     135    def indentXML(elem, level=0): 
     136        i = "\n" + level * "  " 
     137        if len(elem): 
     138            if not elem.text or not elem.text.strip(): 
     139                elem.text = i + "  " 
     140            for child in elem: 
     141                indentXML(child, level+1) 
     142            if not child.tail or not child.tail.strip(): 
     143                child.tail = i 
     144            if not elem.tail or not elem.tail.strip(): 
     145                elem.tail = i 
     146        else: 
     147            if level and (not elem.tail or not elem.tail.strip()): 
     148                elem.tail = i 
     149     
     150    kmlDocumentElement=Element('Document') 
     151    SubElement(kmlDocumentElement, 'name').text='Example quadrization run' 
     152    SubElement(kmlDocumentElement, 'open').text='1' 
     153    kmlDocumentElement.append(rootFolderElement) 
     154 
     155    kmlRootElement=Element('kml', xmlns='http://earth.google.com/kml/2.2') 
     156    kmlRootElement.append(kmlDocumentElement) 
     157    indentXML(kmlRootElement, 0) 
     158    return kmlRootElement 
    81159 
    82160bbox = BBox(0.,0.,100.,100.) 
    83161max_per_region = 10 
    84162l = [] 
    85 for i in range(1000): 
     163for i in range(10000): 
    86164    location = (100. * random(), 100. * random()) 
    87     print location 
    88165    l.append(location) 
    89 print f(l, bbox) 
     166t = f(l, bbox) 
     167rootFolderElement = g(t) 
     168kmlRootElement = wrapRootFolderElement(rootFolderElement) 
     169 
     170# Write the KML document to a file 
     171kmlTree = ElementTree(kmlRootElement)        
     172kmlFile = open('../../output/quadrize.kml', 'w') 
     173kmlTree.write(kmlFile) 
     174kmlFile.close() 
Note: See TracChangeset for help on using the changeset viewer.