Source code for pykml.helpers
"""pyKML Helpers Module
The pykml.helpers module contains 'helper' functions that operate on pyKML
document objects for accomplishing common tasks.
"""
from pykml.factory import KML_ElementMaker as K
from pykml.factory import GX_ElementMaker as GX
[docs]def separate_namespace(qname):
"Separates the namespace from the element"
import re
try:
namespace, element_name = re.search('^{(.+)}(.+)$', qname).groups()
except:
namespace = None
element_name = qname
return namespace, element_name
[docs]def set_max_decimal_places(doc, max_decimals):
"""Sets the maximum number of decimal places used by KML elements
This method facilitates reducing the file size of a KML document.
"""
def replace_delimited_string_member(
delimited_str,
separator,
index_no,
decimal_places):
"Modify the number of decimal places for a delimited string member"
values = delimited_str.split(separator)
values[index_no] = str(round(float(values[index_no]), decimal_places))
return separator.join(values)
if max_decimals.has_key('longitude'):
data_type = 'longitude'
index_no = 0 # longitude is in the first position
# modify <longitude>
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}longitude"):
new_val = round(float(el.text), max_decimals[data_type])
el.getparent().longitude = K.longitude(new_val)
# modify <coordinates> elements
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}coordinates"):
vertex_str_list = []
for vertex in el.text.strip().split(' '):
vertex_str_list.append(
replace_delimited_string_member(
delimited_str=vertex,
separator=',',
index_no=index_no,
decimal_places=max_decimals[data_type]
)
)
el_new = K.coordinates(' '.join(vertex_str_list).strip())
el.getparent().replace(el, el_new)
# modify <gx:coords> elements
for el in doc.findall(".//{http://www.google.com/kml/ext/2.2}coord"):
el._setText(
replace_delimited_string_member(
delimited_str=el.text,
separator=' ',
index_no=index_no,
decimal_places=max_decimals[data_type]
)
)
if max_decimals.has_key('latitude'):
data_type = 'latitude'
index_no = 1 # latitude is in the second position
# modify <latitude> elements
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}latitude"):
new_val = round(float(el.text), max_decimals[data_type])
el.getparent().latitude = K.latitude(new_val)
# modify <coordinates> elements
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}coordinates"):
vertex_str_list = []
for vertex in el.text.strip().split(' '):
vertex_str_list.append(
replace_delimited_string_member(
delimited_str=vertex,
separator=',',
index_no=index_no,
decimal_places=max_decimals[data_type]
)
)
el_new = K.coordinates(' '.join(vertex_str_list).strip())
el.getparent().replace(el, el_new)
# modify <gx:coords> elements
for el in doc.findall(".//{http://www.google.com/kml/ext/2.2}coord"):
el._setText(
replace_delimited_string_member(
delimited_str=el.text,
separator=' ',
index_no=index_no,
decimal_places=max_decimals[data_type]
)
)
if max_decimals.has_key('altitude'):
data_type = 'altitude'
index_no = 2 # altitude is in the third position
# modify <altitude> elements
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}altitude"):
new_val = round(float(el.text), max_decimals[data_type])
el.getparent().altitude = K.altitude(new_val)
# modify <coordinates> elements
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}coordinates"):
vertex_str_list = []
for vertex in el.text.strip().split(' '):
vertex_str_list.append(
replace_delimited_string_member(
delimited_str=vertex,
separator=',',
index_no=index_no,
decimal_places=max_decimals[data_type]
)
)
el_new = K.coordinates(' '.join(vertex_str_list).strip())
el.getparent().replace(el, el_new)
# modify <gx:coords> elements
for el in doc.findall(".//{http://www.google.com/kml/ext/2.2}coord"):
el._setText(
replace_delimited_string_member(
delimited_str=el.text,
separator=' ',
index_no=index_no,
decimal_places=max_decimals[data_type]
)
)
if max_decimals.has_key('heading'):
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}heading"):
new_val = round(float(el.text), max_decimals['heading'])
el.getparent().heading = K.heading(new_val)
if max_decimals.has_key('tilt'):
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}tilt"):
new_val = round(float(el.text), max_decimals['tilt'])
el.getparent().tilt = K.tilt(new_val)
if max_decimals.has_key('range'):
for el in doc.findall(".//{http://www.opengis.net/kml/2.2}range"):
new_val = round(float(el.text), max_decimals['range'])
el.getparent().range = K.range(new_val)