Ignore:
Timestamp:
01/02/08 15:24:40 (12 years ago)
Author:
mkochan
Message:

Made other prototypes use KMLDocument-encapsulated functionality. Tested using these prototypes.

File:
1 edited

Legend:

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

    r3290 r3291  
    33class KMLDocument: 
    44 
    5     def __init__(self, name, basicKMLStyle = None): 
     5    def __init__(self, name, styles): 
    66 
    77        self.name = name 
    8  
    9         self.documentElement = Element('Document') 
    10         SubElement(self.documentElement, 'name').text = name 
    11         SubElement(self.documentElement, 'open').text = '0' 
    12  
    13         if basicKMLStyle: 
    14             self.styles = [basicKMLStyle] 
    15         else: 
    16             self.styles = [] 
    17         for style in self.styles: 
    18             self.documentElement.append(style.build()) 
    19  
    20     def appendElement(self, element): 
    21         '''Append directly to the <Document> element''' 
    22         self.documentElement.append(element) 
     8        self.styles = styles 
     9        self.elements = [] 
    2310 
    2411    def save(self, outputFilename): 
     
    4027                    elem.tail = i 
    4128 
     29        # Create an element to hold the document 
     30        self.documentElement = Element('Document') 
     31        SubElement(self.documentElement, 'name').text = self.name 
     32        SubElement(self.documentElement, 'open').text = '0' 
     33 
     34        # Build the associated styles 
     35        for style in self.styles: 
     36            self.documentElement.append( style.build() ) 
     37 
     38        # Build the sub-elements 
     39        for element in self.elements: 
     40            self.documentElement.append( element.build() ) 
     41 
    4242        # Attach the Document element as a subelement of a root 'kml' element 
    43         kmlElement=Element('kml', xmlns='http://earth.google.com/kml/2.2') 
    44         kmlElement.append(self.documentElement) 
    45         _indentXML(kmlElement) 
     43        rootElement=Element('kml', xmlns='http://earth.google.com/kml/2.2') 
     44        rootElement.append(self.documentElement) 
     45        _indentXML(rootElement) 
    4646 
    4747        # Write the KML document to a file 
    48         t = ElementTree(kmlElement)        
    49         f = open(outputFilename, 'w') 
    50         t.write(f) 
    51         f.close() 
     48        elementTree = ElementTree(rootElement)        
     49        kmlFile = open(outputFilename, 'w') 
     50        elementTree.write(kmlFile) 
     51        kmlFile.close() 
    5252 
    5353# Abstract class 
     
    5858class KMLStyle(KMLElement): 
    5959 
    60     def __init__(self, id, iconURL, balloonTemplate): 
     60    def __init__(self, id, iconURL = None, balloonTemplate = None, listItemType = None): 
    6161        self.id = id 
    6262        self.iconURL = iconURL 
    6363        self.balloonTemplate = balloonTemplate 
     64        if listItemType: 
     65            allowedValues =  ['check', 'checkOffOnly', 'checkHideChildren', 'radioFolder'] 
     66            if not listItemType in allowedValues: 
     67                raise ValueError('listItemType not among allowed values: ' + str(allowedValues)) 
     68        self.listItemType = listItemType 
    6469 
    6570    def build(self): 
     
    6873        styleElement.set('id', self.id) 
    6974 
    70         # Build the IconStyle element (for assigning an icon to station placemarks) 
    71         iconStyleElement = SubElement(styleElement, 'IconStyle') 
    72         SubElement(iconStyleElement, 'scale').text = '1.2' 
    73         iconElement = SubElement(iconStyleElement, 'Icon') 
    74         SubElement(iconElement, 'href').text = self.iconURL 
     75        # If specified, build the IconStyle element -- for assigning an icon to station placemarks 
     76        if self.iconURL: 
     77            iconStyleElement = SubElement(styleElement, 'IconStyle') 
     78            SubElement(iconStyleElement, 'scale').text = '1.2' 
     79            iconElement = SubElement(iconStyleElement, 'Icon') 
     80            SubElement(iconElement, 'href').text = self.iconURL 
    7581 
    76         # Build the BalloonStyle element -- an HTML template for the balloons 
    77         ballonStyleElement = SubElement(styleElement, 'BalloonStyle') 
    78         SubElement(ballonStyleElement, 'text').text = self.balloonTemplate 
     82        # If specified, build the BalloonStyle sub-element -- an HTML template for the balloons 
     83        if self.balloonTemplate: 
     84            balloonStyleElement = SubElement(styleElement, 'BalloonStyle') 
     85            SubElement(balloonStyleElement, 'text').text = self.balloonTemplate 
    7986 
     87        # If specified, build the ListStyle sub-element -- which determines how the associated lists 
     88        # in the left-hand side of the Google Earth screen are going to display/behave 
     89        if self.listItemType: 
     90            listStyleElement = SubElement(styleElement, 'ListStyle') 
     91            SubElement(listStyleElement, 'listItemType').text = self.listItemType 
     92         
    8093        return styleElement 
    8194 
    82 def getBasicKMLStyle(basicBalloonTemplate = ''): 
    83     basicIcon = 'http://maps.google.com/mapfiles/kml/shapes/target.png' 
    84     return KMLStyle('basic_style', basicIcon, basicBalloonTemplate) 
     95# Defined for convenience 
     96def createDefaultPlacemarKMLStyle(id = 'default_placemark_style', 
     97                                  iconURL = 'http://maps.google.com/mapfiles/kml/shapes/target.png', 
     98                                  balloonTemplate = ''): 
     99    return KMLStyle(id, iconURL, balloonTemplate) 
    85100 
    86101class KMLPlacemark(KMLElement): 
    87102     
    88     def __init__(self, id, name, lon, lat, style='basic_style', data=None): 
     103    def __init__(self, id, name, lon, lat, styleID = None, data=None): 
    89104        self.id = id 
    90105        self.name = name 
    91106        self.lon = lon 
    92107        self.lat = lat 
    93         self.style = style 
     108        self.styleID = styleID 
    94109        self.data = data 
    95110 
     
    98113        SubElement(placemarkElement, 'name').text = self.name 
    99114        SubElement(placemarkElement, 'open').text = '0' 
    100         SubElement(placemarkElement, 'visibility').text = '0' 
    101         SubElement(placemarkElement, 'styleUrl').text = '#' + self.style 
     115        if self.styleID: 
     116            SubElement(placemarkElement, 'styleUrl').text = '#' + self.styleID 
    102117 
    103118        lookAtElement = SubElement(placemarkElement, 'LookAt') 
     
    127142class KMLFolder(KMLElement): 
    128143 
    129     def __init__(self, name, children): 
     144    def __init__(self, name, children, styleID = None, region = None): 
    130145        self.name = name 
    131146        self.children = children 
    132          
     147        self.styleID = styleID 
     148        self.region = region 
     149 
    133150    def build(self): 
    134151        folderElement = Element('Folder') 
    135         SubElement(folderElement, 'name').text = name 
    136         for child in children: 
     152        if self.styleID: 
     153            SubElement(folderElement, 'styleUrl').text = '#' + self.styleID 
     154        SubElement(folderElement, 'name').text = self.name 
     155        if self.region: 
     156            if not isinstance(self.region, KMLRegion): 
     157                raise TypeError('Region not a KMLRegion') 
     158            folderElement.append( self.region.build() ) 
     159        for child in self.children: 
    137160            if not isinstance(child, KMLElement): 
    138                 raise TypeError('KMLFolder child does not have a KMLElement base class') 
     161                raise TypeError('Child does not have a KMLElement base class') 
    139162            folderElement.append( child.build() ) 
    140163        return folderElement 
     
    147170        self.east = east 
    148171        self.north = north 
    149         self.minLodPixels = minLodPixel 
    150         self.maxLodPixels = maxLodPixel 
     172        self.minLodPixels = minLodPixels 
     173        self.maxLodPixels = maxLodPixels 
    151174 
    152175    def build(self): 
    153176 
    154177        llabElement = Element('LatLonAltBox') 
    155         SubElement(llabElement, 'west').text = self.west 
    156         SubElement(llabElement, 'south').text = self.south 
    157         SubElement(llabElement, 'east').text = self.east 
    158         SubElement(llabElement, 'north').text = self.north 
     178        SubElement(llabElement, 'west').text = str(self.west) 
     179        SubElement(llabElement, 'south').text = str(self.south) 
     180        SubElement(llabElement, 'east').text = str(self.east) 
     181        SubElement(llabElement, 'north').text = str(self.north) 
    159182 
    160183        lodElement = Element('Lod') 
    161         SubElement(lodElement, 'minLodPixels').text = self.minLodPixels 
    162         SubElement(lodElement, 'maxLodPixels').text = self.maxLodPixels 
     184        SubElement(lodElement, 'minLodPixels').text = str(self.minLodPixels) 
     185        SubElement(lodElement, 'maxLodPixels').text = str(self.maxLodPixels) 
    163186 
    164187        regionElement = Element('Region') 
Note: See TracChangeset for help on using the changeset viewer.