gabriel becker
2 years ago
commit
deb228a91d
4 changed files with 99 additions and 0 deletions
@ -0,0 +1,97 @@
|
||||
import os |
||||
import zipfile |
||||
import numpy as np |
||||
import pandas as pd |
||||
from pathlib import Path |
||||
import xml.etree.ElementTree as xmltree |
||||
from xml.dom import minidom |
||||
|
||||
|
||||
def load_kmz(kmz_file_path): |
||||
print(Path(kmz_file_path).resolve()) |
||||
print(Path(kmz_file_path).resolve().exists()) |
||||
file_to_extract = 'doc.kml' |
||||
xml = None |
||||
try: |
||||
with zipfile.ZipFile(kmz_file_path) as z: |
||||
xml = xmltree.fromstring(z.read(file_to_extract)) |
||||
except: |
||||
print("Invalid file") |
||||
return xml |
||||
|
||||
|
||||
def load_xlsx(xlsx_file_path): |
||||
df = pd.read_excel(xlsx_file_path) |
||||
return df.to_dict('records') |
||||
|
||||
|
||||
def remove_all_current_placemarkers(xml): |
||||
doc_elements = xml.find('{http://www.opengis.net/kml/2.2}Document') |
||||
for stuff in doc_elements.findall('{http://www.opengis.net/kml/2.2}Placemark'): |
||||
doc_elements.remove(stuff) |
||||
return xml |
||||
|
||||
|
||||
def append_placemarks_to_xml(xml, placemarks): |
||||
doc = xml.find('{http://www.opengis.net/kml/2.2}Document') |
||||
for placemark in placemarks: |
||||
doc.append(placemark) |
||||
return xml |
||||
|
||||
|
||||
def map_dit(dict_list): |
||||
items = list() |
||||
name_columns = ['Price', 'Includes Bills'] |
||||
description_columns = ['Url', 'Min Satay', 'Notes'] |
||||
location_column = 'Location' |
||||
for item in dict_list: |
||||
name = ' '.join([str(item[x]) for x in name_columns]) |
||||
description = '\n'.join([str(item[x]) for x in description_columns if item[x] is not np.nan]) |
||||
location = parse_location(item[location_column]) |
||||
items.append(dict(name=name, description=description, location=location)) |
||||
return items |
||||
|
||||
|
||||
def parse_location(text_location): |
||||
location_coordinates = text_location.replace(' ', '').split(',') |
||||
location_coordinates = [location_coordinates[1] , location_coordinates[0]] |
||||
location_coordinates.append('0') |
||||
location = ','.join(location_coordinates) |
||||
return location |
||||
|
||||
|
||||
def map_dict_element_to_placemark_xml(element: dict): |
||||
xml_element = xmltree.Element('{http://www.opengis.net/kml/2.2}Placemark') |
||||
xml_name = xmltree.SubElement(xml_element, '{http://www.opengis.net/kml/2.2}name') |
||||
xml_name.text = element['name'] |
||||
xml_description = xmltree.SubElement(xml_element, '{http://www.opengis.net/kml/2.2}description') |
||||
xml_description.text = element['description'] |
||||
xml_style_url = xmltree.SubElement(xml_element, '{http://www.opengis.net/kml/2.2}styleUrl') |
||||
xml_style_url.text = '#icon-1603-E65100' |
||||
xml_point = xmltree.SubElement(xml_element, '{http://www.opengis.net/kml/2.2}Point') |
||||
xml_coordinates = xmltree.SubElement(xml_point, '{http://www.opengis.net/kml/2.2}coordinates') |
||||
xml_coordinates.text = element['location'] |
||||
return xml_element |
||||
|
||||
|
||||
def main(): |
||||
dict_elements = map_dit(load_xlsx('data/housing.xlsx')) |
||||
placemarks = [map_dict_element_to_placemark_xml(dict_element) for dict_element in dict_elements] |
||||
|
||||
kmz_xml = load_kmz('data/Acoomodations.kmz') |
||||
kmz_xml = remove_all_current_placemarkers(kmz_xml) |
||||
kmz_xml = append_placemarks_to_xml(kmz_xml, placemarks) |
||||
|
||||
xmltree.register_namespace("", 'http://www.opengis.net/kml/2.2') |
||||
tree = xmltree.ElementTree(kmz_xml) |
||||
|
||||
with open ('testoutput.kml', "w") as file: |
||||
rough_string = xmltree.tostring(kmz_xml, 'utf-8') |
||||
reparsed = minidom.parseString(rough_string) |
||||
content = reparsed.toprettyxml(indent="\t") |
||||
file.write(content) |
||||
|
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
main() |
Loading…
Reference in new issue