|
|
@ -1,3 +1,4 @@ |
|
|
|
|
|
|
|
from calendar import prmonth |
|
|
|
import os |
|
|
|
import os |
|
|
|
import zipfile |
|
|
|
import zipfile |
|
|
|
import numpy as np |
|
|
|
import numpy as np |
|
|
@ -5,18 +6,40 @@ import pandas as pd |
|
|
|
from pathlib import Path |
|
|
|
from pathlib import Path |
|
|
|
import xml.etree.ElementTree as xmltree |
|
|
|
import xml.etree.ElementTree as xmltree |
|
|
|
from xml.dom import minidom |
|
|
|
from xml.dom import minidom |
|
|
|
|
|
|
|
import click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Config: |
|
|
|
|
|
|
|
name_columns = ['Price', 'Includes Bills'] |
|
|
|
|
|
|
|
description_columns = ['Url', 'Min Stay', 'Notes'] |
|
|
|
|
|
|
|
location_column = 'Location' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
|
|
def set_name_columns(name_columns): |
|
|
|
|
|
|
|
if isinstance(name_columns, str): |
|
|
|
|
|
|
|
name_columns = name_columns.split(',') |
|
|
|
|
|
|
|
Config.name_columns = name_columns |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
|
|
def set_description_columns(description_columns): |
|
|
|
|
|
|
|
if isinstance(description_columns, str): |
|
|
|
|
|
|
|
description_columns = description_columns.split(',') |
|
|
|
|
|
|
|
Config.description_columns = description_columns |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
|
|
def set_location_column(location_column): |
|
|
|
|
|
|
|
assert isinstance(location_column, str) |
|
|
|
|
|
|
|
Config.location_column = location_column |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_kmz(kmz_file_path): |
|
|
|
def load_kmz(kmz_file_path): |
|
|
|
print(Path(kmz_file_path).resolve()) |
|
|
|
|
|
|
|
print(Path(kmz_file_path).resolve().exists()) |
|
|
|
|
|
|
|
file_to_extract = 'doc.kml' |
|
|
|
file_to_extract = 'doc.kml' |
|
|
|
xml = None |
|
|
|
xml = None |
|
|
|
try: |
|
|
|
try: |
|
|
|
with zipfile.ZipFile(kmz_file_path) as z: |
|
|
|
with zipfile.ZipFile(kmz_file_path) as z: |
|
|
|
xml = xmltree.fromstring(z.read(file_to_extract)) |
|
|
|
xml = xmltree.fromstring(z.read(file_to_extract)) |
|
|
|
except: |
|
|
|
except: |
|
|
|
print("Invalid file") |
|
|
|
click.echo("Invalid file") |
|
|
|
return xml |
|
|
|
return xml |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -41,13 +64,11 @@ def append_placemarks_to_xml(xml, placemarks): |
|
|
|
|
|
|
|
|
|
|
|
def map_dit(dict_list): |
|
|
|
def map_dit(dict_list): |
|
|
|
items = list() |
|
|
|
items = list() |
|
|
|
name_columns = ['Price', 'Includes Bills'] |
|
|
|
|
|
|
|
description_columns = ['Url', 'Min Satay', 'Notes'] |
|
|
|
|
|
|
|
location_column = 'Location' |
|
|
|
|
|
|
|
for item in dict_list: |
|
|
|
for item in dict_list: |
|
|
|
name = ' '.join([str(item[x]) for x in name_columns]) |
|
|
|
name = ' '.join([str(item[x]) for x in Config.name_columns]) |
|
|
|
description = '\n'.join([str(item[x]) for x in description_columns if item[x] is not np.nan]) |
|
|
|
description = '\n'.join([str(item[x]) for x in Config.description_columns if item[x] is not np.nan]) |
|
|
|
location = parse_location(item[location_column]) |
|
|
|
location = parse_location(item[Config.location_column]) |
|
|
|
items.append(dict(name=name, description=description, location=location)) |
|
|
|
items.append(dict(name=name, description=description, location=location)) |
|
|
|
return items |
|
|
|
return items |
|
|
|
|
|
|
|
|
|
|
@ -74,24 +95,42 @@ def map_dict_element_to_placemark_xml(element: dict): |
|
|
|
return xml_element |
|
|
|
return xml_element |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
|
def process(xlsx_path, base_kmz_path, output_path): |
|
|
|
dict_elements = map_dit(load_xlsx('data/housing.xlsx')) |
|
|
|
dict_elements = map_dit(load_xlsx(xlsx_path)) |
|
|
|
placemarks = [map_dict_element_to_placemark_xml(dict_element) for dict_element in dict_elements] |
|
|
|
placemarks = [map_dict_element_to_placemark_xml(dict_element) for dict_element in dict_elements] |
|
|
|
|
|
|
|
|
|
|
|
kmz_xml = load_kmz('data/Acoomodations.kmz') |
|
|
|
kmz_xml = load_kmz(base_kmz_path) |
|
|
|
kmz_xml = remove_all_current_placemarkers(kmz_xml) |
|
|
|
kmz_xml = remove_all_current_placemarkers(kmz_xml) |
|
|
|
kmz_xml = append_placemarks_to_xml(kmz_xml, placemarks) |
|
|
|
kmz_xml = append_placemarks_to_xml(kmz_xml, placemarks) |
|
|
|
|
|
|
|
|
|
|
|
xmltree.register_namespace("", 'http://www.opengis.net/kml/2.2') |
|
|
|
xmltree.register_namespace("", 'http://www.opengis.net/kml/2.2') |
|
|
|
tree = xmltree.ElementTree(kmz_xml) |
|
|
|
tree = xmltree.ElementTree(kmz_xml) |
|
|
|
|
|
|
|
|
|
|
|
with open ('testoutput.kml', "w") as file: |
|
|
|
with open (output_path, "w") as file: |
|
|
|
rough_string = xmltree.tostring(kmz_xml, 'utf-8') |
|
|
|
rough_string = xmltree.tostring(kmz_xml, 'utf-8') |
|
|
|
reparsed = minidom.parseString(rough_string) |
|
|
|
reparsed = minidom.parseString(rough_string) |
|
|
|
content = reparsed.toprettyxml(indent="\t") |
|
|
|
content = reparsed.toprettyxml(indent="\t") |
|
|
|
file.write(content) |
|
|
|
file.write(content) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import click |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@click.command() |
|
|
|
|
|
|
|
@click.option("-i", "--xlsx-path", prompt="XLSX containign data to convert to kml.") |
|
|
|
|
|
|
|
@click.option("-o", "--output-path", default='output.kml', prompt="Output fiel path.", help="Where to save output.") |
|
|
|
|
|
|
|
@click.option("-b", "--kmz-path", default='data/default.kmz', help="Base kmz file that provides templating.") |
|
|
|
|
|
|
|
@click.option("-n", "--name", default='name', prompt='Columns to be used as name.') |
|
|
|
|
|
|
|
@click.option("-d", "--description", default='description', prompt='Columns to be used as description.') |
|
|
|
|
|
|
|
@click.option("-l", "--location", default='locaiton', prompt='Columns to be used as location.') |
|
|
|
|
|
|
|
def convert_xlsx_to_kml(xlsx_path, kmz_path, output_path, name, description, location): |
|
|
|
|
|
|
|
Config.set_name_columns(name) |
|
|
|
|
|
|
|
Config.set_description_columns(description) |
|
|
|
|
|
|
|
Config.set_location_column(location) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
process( |
|
|
|
|
|
|
|
xlsx_path, kmz_path, output_path |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
if __name__ == '__main__': |
|
|
|
main() |
|
|
|
convert_xlsx_to_kml() |
|
|
|