Files
map_yandex/main_2gis.py
2025-09-23 20:13:51 +05:00

265 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()