#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Интерактивная карта учебных заведений Челябинска Отображает заведения среднего специального и высшего образования Использует 2GIS Maps API для создания интерактивной карты с фильтрацией """ import json import os import webbrowser from pathlib import Path from jinja2 import Template def load_institutions_data(): """Загружает данные об учебных заведениях из JSON файла (демо-данные или 2GIS API)""" current_dir = Path(__file__).parent # Сначала пробуем демо-данные demo_file = current_dir / "educational_institutions_demo.json" if demo_file.exists(): try: with open(demo_file, 'r', encoding='utf-8') as f: data = json.load(f) return data.get('institutions', []) except (FileNotFoundError, json.JSONDecodeError) as e: print(f"Ошибка при чтении демо-данных: {e}") # Пробуем данные от 2GIS API api_file = current_dir / "educational_institutions_2gis.json" if api_file.exists(): try: with open(api_file, 'r', encoding='utf-8') as f: data = json.load(f) return data.get('institutions', []) except (FileNotFoundError, json.JSONDecodeError) as e: print(f"Ошибка при чтении данных 2GIS API: {e}") # Пробуем старые данные (на случай отката) legacy_file = current_dir / "colleges_data.json" if legacy_file.exists(): try: with open(legacy_file, 'r', encoding='utf-8') as f: return json.load(f) except (FileNotFoundError, json.JSONDecodeError) as e: print(f"Ошибка при чтении устаревших данных: {e}") print("Файлы с данными об учебных заведениях не найдены!") return [] def generate_map_html(institutions_data): """Генерирует HTML файл с интерактивной картой учебных заведений (2GIS)""" current_dir = Path(__file__).parent template_file = current_dir / "map_template_2gis.html" try: with open(template_file, 'r', encoding='utf-8') as f: template_content = f.read() except FileNotFoundError: print(f"Шаблон HTML не найден: {template_file}") return None # Создаем шаблон Jinja2 template = Template(template_content) # Рендерим HTML с данными об учебных заведениях html_content = template.render( institutions=institutions_data, institutions_json=json.dumps(institutions_data, ensure_ascii=False) ) # Сохраняем HTML файл output_file = current_dir / "chelyabinsk_education_map_2gis.html" with open(output_file, 'w', encoding='utf-8') as f: f.write(html_content) return output_file def print_institutions_info(institutions_data): """Выводит информацию об учебных заведениях в консоль""" print("=" * 90) print("УЧЕБНЫЕ ЗАВЕДЕНИЯ ЧЕЛЯБИНСКА - СРЕДНЕЕ СПЕЦИАЛЬНОЕ И ВЫСШЕЕ ОБРАЗОВАНИЕ") print("=" * 90) # Группировка по категориям categories_stats = {} type_stats = {} for institution in institutions_data: categories = institution.get('categories', []) for category in categories: categories_stats[category] = categories_stats.get(category, 0) + 1 # Определяем тип по названию name = institution.get('name', '').lower() if 'университет' in name: inst_type = 'Университет' elif 'институт' in name: inst_type = 'Институт' elif 'колледж' in name: inst_type = 'Колледж' elif 'техникум' in name: inst_type = 'Техникум' elif 'академия' in name: inst_type = 'Академия' else: inst_type = 'Другое' type_stats[inst_type] = type_stats.get(inst_type, 0) + 1 print(f"\n📊 Статистика по типам учреждений:") for inst_type, count in sorted(type_stats.items(), key=lambda x: x[1], reverse=True): print(f" {inst_type}: {count}") print(f"\n📋 Статистика по категориям:") for category, count in sorted(categories_stats.items(), key=lambda x: x[1], reverse=True)[:10]: print(f" {category}: {count}") print(f"\n🎯 Всего учреждений: {len(institutions_data)}") print(f"\n📍 Список учебных заведений:") for i, institution in enumerate(institutions_data, 1): print(f"\n{i}. {institution['name']}") if institution.get('full_name') and institution['full_name'] != institution['name']: print(f" Полное название: {institution['full_name']}") print(f" Адрес: {institution.get('address', 'Не указан')}") lat = institution.get('latitude', 0) lon = institution.get('longitude', 0) if lat and lon: print(f" Координаты: {lat}, {lon}") categories = institution.get('categories', []) if categories: print(f" Категории: {', '.join(categories)}") phones = institution.get('phones', []) if phones: print(f" Телефоны: {', '.join(phones)}") source = institution.get('source', 'Не указан') print(f" Источник данных: {source}") print("-" * 90) def run_search_if_needed(): """Запускает поиск через 2GIS API или создает демо-данные, если данных нет""" current_dir = Path(__file__).parent demo_file = current_dir / "educational_institutions_demo.json" api_file = current_dir / "educational_institutions_2gis.json" if not demo_file.exists() and not api_file.exists(): print("Данные об учебных заведениях не найдены.") print("Создание демо-данных...") # Импортируем и запускаем создание демо-данных try: from demo_institutions_chelyabinsk import save_demo_data save_demo_data() except ImportError: print("Не удалось импортировать модуль создания демо-данных") return False return True return True def main(): """Основная функция программы""" print("Генерация карты учебных заведений Челябинска с использованием 2GIS Maps API...") print("Отображаются только заведения среднего специального и высшего образования") print("=" * 90) # Проверяем наличие данных, создаем если нужно if not run_search_if_needed(): print("Не удалось получить данные об учебных заведениях!") return # Загружаем данные об учебных заведениях institutions_data = load_institutions_data() if not institutions_data: print("Не удалось загрузить данные об учебных заведениях!") return print(f"Загружено {len(institutions_data)} учебных заведений") # Выводим информацию об учебных заведениях print_institutions_info(institutions_data) # Информация о 2GIS API print("\n" + "=" * 90) print("ИНФОРМАЦИЯ О 2GIS MAPS API") print("=" * 90) print("Карта использует 2GIS Maps API для отображения.") print("2GIS API предоставляется бесплатно для некоммерческого использования.") print("Для получения API ключа для коммерческого использования:") print("https://platform.2gis.com/") # Генерируем HTML файл с картой output_file = generate_map_html(institutions_data) if output_file: print(f"\n✅ Карта успешно создана: {output_file}") # Предлагаем открыть карту в браузере open_browser = input("\nОткрыть карту в браузере? (y/N): ").strip().lower() if open_browser in ['y', 'yes', 'да', 'д']: try: webbrowser.open(f'file://{output_file.absolute()}') print("Карта открыта в браузере!") except Exception as e: print(f"Не удалось открыть браузер: {e}") print(f"Откройте файл вручную: {output_file.absolute()}") else: print(f"Откройте файл в браузере: {output_file.absolute()}") print("\n🎓 Особенности карты:") print(" • Использует 2GIS Maps API вместо Yandex Maps") print(" • Показывает только среднее специальное и высшее образование") print(" • Фильтрация по типам учреждений") print(" • Цветные маркеры для разных типов") print(" • Подробная информация в всплывающих окнах") print(f"\n📍 На карте отмечены следующие учебные заведения:") # Группируем по типам для удобного отображения by_type = {} for institution in institutions_data: name = institution.get('name', '').lower() if 'университет' in name: inst_type = 'Университеты' elif 'институт' in name: inst_type = 'Институты' elif 'колледж' in name: inst_type = 'Колледжи' elif 'техникум' in name: inst_type = 'Техникумы' elif 'академия' in name: inst_type = 'Академии' else: inst_type = 'Другие' if inst_type not in by_type: by_type[inst_type] = [] by_type[inst_type].append(institution['name']) for inst_type, names in by_type.items(): print(f"\n {inst_type} ({len(names)}):") for name in names: print(f" • {name}") else: print("❌ Ошибка при создании карты!") if __name__ == "__main__": main()