generate_kmlfile_from_gpxdata.py
|
# ------------------------------------------------------------------------------#
import xml.etree.ElementTree as ET;
from string import Template;
from typing import Dict,Tuple;
# ------------------------------------------------------------------------------#
from pyfiles.extract_kmldata_outof_gpxfile import TypeCoords;
# ------------------------------------------------------------------------------#
def findKmlFolder(fromElem: ET.Element,
withName: str,ns: Dict) -> ET.Element:
for fd in fromElem.findall('KML:Folder',ns):
if withName==fd.find('KML:name',ns).text: return fd;
# end for
# end def findKmlFolder
# ------------------------------------------------------------------------------#
WaypointTemplate='''
<Placemark>
<name>*PlacemarkName*</name>
<styleUrl>#waypoint</styleUrl>
<Point>
<coordinates>*CoordinatesString*</coordinates>
</Point>
</Placemark>
'''
# ------------------------------------------------------------------------------#
TypeWaypointsData=Dict[str,TypeCoords];
TypeTrackpathData=Tuple[str,str];
TypeDocData=Tuple[str,str];
def generateKmlFile(templateFilePath: str,
docData: TypeDocData,
waypointsData: TypeWaypointsData,
trackpathData: TypeTrackpathData,
outputFilePath: str) -> None:
#
ns={'KML':'http://www.opengis.net/kml/2.2'};
with open(templateFilePath,mode='r',encoding='utf-8') as fReader:
etree=ET.parse(fReader);
root=etree.getroot();
doc=root.find('KML:Document',ns);
# --------------------------------------------------------------------------#
(fileName,crInfo)=docData;
# Set document name
tpl=Template("![CDATA[$name]]");
docName=doc.find('KML:name',ns);
docName.text=tpl.substitute(name=fileName);
# Set creation information
snippet=doc.find('KML:snippet',ns);
snippet.text=crInfo;
# --------------------------------------------------------------------------#
# Set names and coordinates of waypoints
waypointsFolder=findKmlFolder(doc,'Waypoints',ns);
ix=0;
for (name,coords) in waypointsData.items():
ix+=1;
plmElem=ET.fromstring(WaypointTemplate);
plmElem[0].text=name;
plmElem[2][0].text=coords;
waypointsFolder.insert(ix,plmElem);
# end for
# --------------------------------------------------------------------------#
(trackName,pathCoords)=trackpathData;
# Set name and path coordinates of the track
outerTrackFolder=findKmlFolder(doc,'Tracks',ns);
outerTrackFolder[1][0].text=trackName;
pathPlacemark=outerTrackFolder[1][1];
pathPlacemark[2][1].text=pathCoords;
# --------------------------------------------------------------------------#
# Write kml-file
ET.register_namespace('',ns['KML']);
etree.write(outputFilePath,
encoding='utf-8',
xml_declaration=True);
# --------------------------------------------------------------------------#
# end def generateKmlFile
# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#
if __name__=='__main__':
print('\n# Beginning TEST generate_kmlfile_from_gpxdata.py ...\n');
# --------------------------------------------------------------------------#
# --------------------------------------------------------------------------#
print('\n# Finished TEST generate_kmlfile_from_gpxdata.py.\n');
# end if main
# ------------------------------------------------------------------------------#
# ------------------------------------------------------------------------------#