DamonCooper/KMZ-Cleaner
0
1import streamlit as st2import zipfile3import xml.etree.ElementTree as ET4from datetime import datetime5import io6 7# Налаштування зовнішнього вигляду сторінки8st.set_page_config(page_title="KMZ Cleaner", page_icon="🌍")9 10st.title("🌍 KMZ Cleaner Pro")11st.markdown("---")12st.write("Завантажте файл, щоб видалити **'Райони проникнення'**.")13 14# Поле завантаження15uploaded_file = st.file_uploader("Виберіть KMZ файл", type=['kmz'])16 17if uploaded_file is not None:18 # Показуємо процес обробки19 with st.status("Працюю над файлом...", expanded=True) as status:20 st.write("📥 Читаю оригінальний файл...")21 22 input_zip_stream = io.BytesIO(uploaded_file.read())23 output_zip_stream = io.BytesIO()24 25 try:26 with zipfile.ZipFile(input_zip_stream, 'r') as zin:27 # Перевірка наявності головного KML файлу28 if 'doc.kml' not in zin.namelist():29 st.error("Помилка: файл не містить doc.kml!")30 status.update(label="Помилка структури", state="error")31 else:32 with zipfile.ZipFile(output_zip_stream, 'w', compression=zipfile.ZIP_DEFLATED) as zout:33 for item in zin.infolist():34 content = zin.read(item.filename)35 36 # Обробляємо тільки doc.kml37 if item.filename == 'doc.kml':38 st.write("🔍 Чищу зайві об'єкти...")39 ET.register_namespace('', "http://www.opengis.net/kml/2.2")40 root = ET.fromstring(content)41 namespace = {'kml': 'http://www.opengis.net/kml/2.2'}42 43 folders_removed = 044 # Пошук папок для видалення45 for parent in root.findall('.//kml:Folder/..', namespace):46 for folder in parent.findall('kml:Folder', namespace):47 desc = folder.find('kml:description', namespace)48 if desc is not None and desc.text == 'Район проникнення':49 parent.remove(folder)50 folders_removed += 151 52 st.write(f"🗑️ Видалено об'єктів: {folders_removed}")53 # Записуємо змінений KML назад54 new_kml = ET.tostring(root, encoding='utf-8', xml_declaration=True)55 zout.writestr(item.filename, new_kml)56 else:57 # Всі інші файли (картинки, стилі) копіюємо як є58 zout.writestr(item, content)59 60 # Формуємо нову назву файлу61 orig_name = uploaded_file.name.rsplit('.', 1)[0]62 final_name = f"{orig_name}-clean.kmz"63 64 status.update(label="Все готово!", state="complete")65 st.success(f"Файл '{final_name}' готовий до завантаження.")66 67 # Кнопка скачування68 st.download_button(69 label="📥 Завантажити результат",70 data=output_zip_stream.getvalue(),71 file_name=final_name,72 mime="application/vnd.google-earth.kmz"73 )74 75 except Exception as e:76 st.error(f"Сталася непередбачувана помилка: {e}")77 status.update(label="Збій", state="error")78 79st.markdown("---")80st.caption("Версія 1.1 | Збереження назви оригіналу")