source: DPPP/kml/csml2kml/python/prototypes/KMLDocument.py @ 3289

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/DPPP/kml/csml2kml/python/prototypes/KMLDocument.py@3289
Revision 3289, 4.5 KB checked in by mkochan, 12 years ago (diff)

Moved code for building placemarks into KMLDocument.py

Line 
1from cElementTree import ElementTree, Element, SubElement, XML
2
3class KMLDocument:
4
5    def __init__(self, name, basicKMLStyle = None):
6
7        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)
23
24    def save(self, outputFilename):
25
26        # Auxiliary function, indents XML
27        def _indentXML(elem, level=0):
28            i = "\n" + level * "  "
29            if len(elem):
30                if not elem.text or not elem.text.strip():
31                    elem.text = i + "  "
32                for child in elem:
33                    _indentXML(child, level+1)
34                if not child.tail or not child.tail.strip():
35                    child.tail = i
36                if not elem.tail or not elem.tail.strip():
37                    elem.tail = i
38            else:
39                if level and (not elem.tail or not elem.tail.strip()):
40                    elem.tail = i
41
42        # 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)
46
47        # Write the KML document to a file
48        t = ElementTree(kmlElement)       
49        f = open(outputFilename, 'w')
50        t.write(f)
51        f.close()
52
53class KMLStyle:
54
55    def __init__(self, id, iconURL, balloonTemplate):
56        self.id = id
57        self.iconURL = iconURL
58        self.balloonTemplate = balloonTemplate
59
60    def build(self):
61
62        styleElement = Element('Style')
63        styleElement.set('id', self.id)
64
65        # Build the IconStyle element (for assigning an icon to station placemarks)
66        iconStyleElement = SubElement(styleElement, 'IconStyle')
67        SubElement(iconStyleElement, 'scale').text = '1.2'
68        iconElement = SubElement(iconStyleElement, 'Icon')
69        SubElement(iconElement, 'href').text = self.iconURL
70
71        # Build the BalloonStyle element -- an HTML template for the balloons
72        ballonStyleElement = SubElement(styleElement, 'BalloonStyle')
73        SubElement(ballonStyleElement, 'text').text = self.balloonTemplate
74
75        return styleElement
76
77def getBasicKMLStyle(basicBalloonTemplate = ''):
78    basicIcon = 'http://maps.google.com/mapfiles/kml/shapes/target.png'
79    return KMLStyle('basic_style', basicIcon, basicBalloonTemplate)
80
81class KMLPlacemark:
82   
83    def __init__(self, id, name, lon, lat, style='basic_style', data=None):
84        self.id = id
85        self.name = name
86        self.lon = lon
87        self.lat = lat
88        self.style = style
89        self.data = data
90
91    def build(self):
92        placemarkElement = Element('Placemark')
93        SubElement(placemarkElement, 'name').text = self.name
94        SubElement(placemarkElement, 'open').text = '0'
95        SubElement(placemarkElement, 'visibility').text = '0'
96        SubElement(placemarkElement, 'styleUrl').text = '#' + self.style
97
98        lookAtElement = SubElement(placemarkElement, 'LookAt')
99        SubElement(lookAtElement, 'longitude').text = str(self.lon)
100        SubElement(lookAtElement, 'latitude').text = str(self.lat)
101
102        pointElement = SubElement(placemarkElement, 'Point')
103        SubElement(pointElement, 'coordinates').text = '%f,%f,%f' % (self.lon, self.lat, 0.)
104
105        # If the "data" dictionary is provided, create the additional <ExtendedData> element,
106        # which contains specific data items, which will be automatically substituted
107        # for placemarks in the balloon template when the user views the document in Google Earth.
108        if self.data:
109            extendedDataElement = SubElement(placemarkElement, 'ExtendedData')
110            for key in self.data:
111                dataElement = SubElement(extendedDataElement, 'Data')
112                dataElement.set('name', key)
113                value = self.data[key]
114                value = value.replace('#ID#', self.id)
115                value = value.replace('#NAME#', self.name)
116                value = value.replace('#LON#', str(self.lon))
117                value = value.replace('#LAT#', str(self.lat))
118                SubElement(dataElement, 'value').text = value
119
120        return placemarkElement
Note: See TracBrowser for help on using the repository browser.