diff --git a/data/default.kmz b/data/default.kmz new file mode 100644 index 0000000..541863f Binary files /dev/null and b/data/default.kmz differ diff --git a/requirements.txt b/requirements.txt index 2f5b8d3..aba78b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pandas -openpyxl \ No newline at end of file +openpyxl +click \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..313f4f8 --- /dev/null +++ b/run.sh @@ -0,0 +1,8 @@ +source /home/gabriel/dev/Python/Environments/xlsx2kmz/bin/activate +python3 /home/gabriel/dev/Python/xlsx2kmz/src/__main__.py \ + -i data/housing.xlsx \ + -o testoutput.kml \ + -b data/Acoomodations.kmz \ + -n "Price,Who,Includes Bills" \ + -d "Url,Min Stay,Who,Price,Notes" \ + -l Location \ No newline at end of file diff --git a/src/__main__.py b/src/__main__.py index cf02b6b..df77161 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -1,3 +1,4 @@ +from calendar import prmonth import os import zipfile import numpy as np @@ -5,18 +6,40 @@ import pandas as pd from pathlib import Path import xml.etree.ElementTree as xmltree 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): - 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") + click.echo("Invalid file") return xml @@ -41,13 +64,11 @@ def append_placemarks_to_xml(xml, placemarks): 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]) + name = ' '.join([str(item[x]) for x in Config.name_columns]) + description = '\n'.join([str(item[x]) for x in Config.description_columns if item[x] is not np.nan]) + location = parse_location(item[Config.location_column]) items.append(dict(name=name, description=description, location=location)) return items @@ -74,24 +95,42 @@ def map_dict_element_to_placemark_xml(element: dict): return xml_element -def main(): - dict_elements = map_dit(load_xlsx('data/housing.xlsx')) +def process(xlsx_path, base_kmz_path, output_path): + dict_elements = map_dit(load_xlsx(xlsx_path)) 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 = 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: + with open (output_path, "w") as file: rough_string = xmltree.tostring(kmz_xml, 'utf-8') reparsed = minidom.parseString(rough_string) content = reparsed.toprettyxml(indent="\t") 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__': - main() \ No newline at end of file + convert_xlsx_to_kml()