Make it a cli app with parameters.

This commit is contained in:
gabriel becker 2022-09-08 12:44:48 -03:00
parent deb228a91d
commit c84d7b6684
4 changed files with 63 additions and 15 deletions

BIN
data/default.kmz Normal file

Binary file not shown.

View File

@ -1,2 +1,3 @@
pandas pandas
openpyxl openpyxl
click

8
run.sh Normal file
View File

@ -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

View File

@ -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()