xaxaxax
This commit is contained in:
265
main_2gis.py
Normal file
265
main_2gis.py
Normal file
@@ -0,0 +1,265 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user