443 lines
34 KiB
HTML
443 lines
34 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Карта учебных заведений Челябинска - Среднее специальное и высшее образование</title>
|
||
<script src="https://maps.api.2gis.ru/2.0/loader.js?pkg=full&key=f61cfc4b-55b7-4937-8625-c00932bee844"></script>
|
||
<style>
|
||
body {
|
||
margin: 0;
|
||
padding: 0;
|
||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||
background-color: #f5f5f5;
|
||
}
|
||
|
||
.header {
|
||
background: linear-gradient(135deg, #2c5aa0 0%, #764ba2 100%);
|
||
color: white;
|
||
padding: 20px;
|
||
text-align: center;
|
||
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
||
}
|
||
|
||
.header h1 {
|
||
margin: 0;
|
||
font-size: 2.2em;
|
||
font-weight: 300;
|
||
}
|
||
|
||
.header p {
|
||
margin: 10px 0 0 0;
|
||
opacity: 0.9;
|
||
font-size: 1.1em;
|
||
}
|
||
|
||
.controls {
|
||
background: white;
|
||
padding: 15px;
|
||
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 10px;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
|
||
.filter-btn {
|
||
padding: 8px 16px;
|
||
border: 2px solid #2c5aa0;
|
||
background: white;
|
||
color: #2c5aa0;
|
||
border-radius: 25px;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
font-size: 14px;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.filter-btn:hover {
|
||
background: #2c5aa0;
|
||
color: white;
|
||
transform: translateY(-2px);
|
||
box-shadow: 0 4px 8px rgba(44, 90, 160, 0.3);
|
||
}
|
||
|
||
.filter-btn.active {
|
||
background: #2c5aa0;
|
||
color: white;
|
||
}
|
||
|
||
.stats {
|
||
text-align: center;
|
||
color: #666;
|
||
font-size: 14px;
|
||
margin-left: 20px;
|
||
}
|
||
|
||
#map {
|
||
width: 100%;
|
||
height: calc(100vh - 180px);
|
||
}
|
||
|
||
.balloon-content {
|
||
max-width: 300px;
|
||
}
|
||
|
||
.balloon-title {
|
||
font-weight: bold;
|
||
color: #333;
|
||
margin-bottom: 8px;
|
||
font-size: 16px;
|
||
}
|
||
|
||
.balloon-address {
|
||
color: #666;
|
||
margin-bottom: 8px;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.balloon-categories {
|
||
margin-bottom: 8px;
|
||
}
|
||
|
||
.category-tag {
|
||
display: inline-block;
|
||
background: #e8f2ff;
|
||
color: #0066cc;
|
||
padding: 2px 8px;
|
||
border-radius: 12px;
|
||
font-size: 12px;
|
||
margin: 2px;
|
||
border: 1px solid #cce7ff;
|
||
}
|
||
|
||
.balloon-contacts {
|
||
margin-top: 10px;
|
||
font-size: 13px;
|
||
}
|
||
|
||
.balloon-contacts a {
|
||
color: #2c5aa0;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.balloon-contacts a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
.powered-by {
|
||
position: fixed;
|
||
bottom: 10px;
|
||
right: 10px;
|
||
background: rgba(255, 255, 255, 0.9);
|
||
padding: 5px 10px;
|
||
border-radius: 5px;
|
||
font-size: 12px;
|
||
color: #666;
|
||
z-index: 1000;
|
||
}
|
||
|
||
@media (max-width: 768px) {
|
||
.header h1 {
|
||
font-size: 1.8em;
|
||
}
|
||
|
||
.controls {
|
||
padding: 10px;
|
||
}
|
||
|
||
.filter-btn {
|
||
font-size: 12px;
|
||
padding: 6px 12px;
|
||
}
|
||
|
||
.stats {
|
||
margin-left: 0;
|
||
margin-top: 10px;
|
||
width: 100%;
|
||
}
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="header">
|
||
<h1>🎓 Карта учебных заведений Челябинска</h1>
|
||
<p>Среднее специальное и высшее образование: университеты, института, колледжи, техникумы</p>
|
||
</div>
|
||
|
||
<div class="controls">
|
||
<button class="filter-btn active" onclick="filterByCategory('all')">🏛️ Все</button>
|
||
<button class="filter-btn" onclick="filterByCategory('университет')">🎓 Университеты</button>
|
||
<button class="filter-btn" onclick="filterByCategory('институт')">🏛️ Институты</button>
|
||
<button class="filter-btn" onclick="filterByCategory('колледж')">📚 Колледжи</button>
|
||
<button class="filter-btn" onclick="filterByCategory('техникум')">🔧 Техникумы</button>
|
||
<button class="filter-btn" onclick="filterByCategory('медицинский')">🏥 Медицинские</button>
|
||
<button class="filter-btn" onclick="filterByCategory('педагогический')">👨🏫 Педагогические</button>
|
||
<button class="filter-btn" onclick="filterByCategory('технический')">⚙️ Технические</button>
|
||
<button class="filter-btn" onclick="filterByCategory('экономический')">💼 Экономические</button>
|
||
<div class="stats">
|
||
<span id="showing-count">30</span> из 30 учреждений
|
||
</div>
|
||
</div>
|
||
|
||
<div id="map"></div>
|
||
<div class="powered-by">Powered by 2GIS Maps API</div>
|
||
|
||
<script>
|
||
let myMap;
|
||
let markers = [];
|
||
let institutions = [{"id": "demo_1", "name": "Южно-Уральский государственный университет", "full_name": "ФГАОУ ВО «Южно-Уральский государственный университет (национальный исследовательский университет)»", "address": "проспект Ленина, 76, Челябинск", "latitude": 55.1549, "longitude": 61.4289, "phones": ["+7 (351) 267-90-90"], "categories": ["Университет", "Высшее образование"], "source": "Демо-данные"}, {"id": "demo_2", "name": "Челябинский государственный университет", "full_name": "ФГБОУ ВО «Челябинский государственный университет»", "address": "ул. Братьев Кашириных, 129, Челябинск", "latitude": 55.1605, "longitude": 61.4025, "phones": ["+7 (351) 799-70-02"], "categories": ["Университет", "Высшее образование"], "source": "Демо-данные"}, {"id": "demo_3", "name": "Челябинский государственный педагогический университет", "full_name": "ФГБОУ ВО «Южно-Уральский государственный гуманитарно-педагогический университет»", "address": "проспект Ленина, 69, Челябинск", "latitude": 55.1545, "longitude": 61.4267, "phones": ["+7 (351) 216-56-01"], "categories": ["Университет", "Педагогическое образование"], "source": "Демо-данные"}, {"id": "demo_4", "name": "Уральский государственный университет физической культуры", "full_name": "ФГБОУ ВО «Уральский государственный университет физической культуры»", "address": "ул. Орджоникидзе, 1, Челябинск", "latitude": 55.1674, "longitude": 61.3988, "phones": ["+7 (351) 237-04-54"], "categories": ["Университет", "Физическая культура"], "source": "Демо-данные"}, {"id": "demo_5", "name": "Челябинский институт экономики и права", "full_name": "АНО ВО «Челябинский институт экономики и права им. М.В. Ладошина»", "address": "ул. Свободы, 155, Челябинск", "latitude": 55.189, "longitude": 61.3176, "phones": ["+7 (351) 217-18-18"], "categories": ["Институт", "Экономика и право"], "source": "Демо-данные"}, {"id": "demo_6", "name": "Челябинский филиал РАНХиГС", "full_name": "Челябинский филиал Российской академии народного хозяйства и государственной службы", "address": "ул. Комарова, 26, Челябинск", "latitude": 55.1823, "longitude": 61.3895, "phones": ["+7 (351) 220-11-91"], "categories": ["Филиал института", "Государственная служба"], "source": "Демо-данные"}, {"id": "demo_7", "name": "Челябинский техникум промышленности и городского хозяйства", "full_name": "ГБПОУ «Челябинский техникум промышленности и городского хозяйства имени Я.П. Осадчего»", "address": "ул. Энтузиастов, 15, Челябинск", "latitude": 55.1456, "longitude": 61.3789, "phones": ["+7 (351) 256-56-82"], "categories": ["Техникум", "Промышленность"], "source": "Демо-данные"}, {"id": "demo_8", "name": "Челябинский медицинский колледж", "full_name": "ГБПОУ «Челябинский базовый медицинский колледж»", "address": "ул. Свободы, 159а, Челябинск", "latitude": 55.1901, "longitude": 61.3164, "phones": ["+7 (351) 232-72-01"], "categories": ["Медицинский колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_9", "name": "Челябинский государственный колледж индустрии питания и торговли", "full_name": "ГБПОУ «Челябинский государственный колледж индустрии питания и торговли»", "address": "ул. Энтузиастов, 21, Челябинск", "latitude": 55.1444, "longitude": 61.3812, "phones": ["+7 (351) 256-71-90"], "categories": ["Колледж", "Торговля и питание"], "source": "Демо-данные"}, {"id": "demo_10", "name": "Челябинский педагогический колледж №1", "full_name": "ГБПОУ «Челябинский педагогический колледж № 1»", "address": "ул. Красная, 305, Челябинск", "latitude": 55.1733, "longitude": 61.3456, "phones": ["+7 (351) 263-89-50"], "categories": ["Педагогический колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_11", "name": "Челябинский технологический колледж", "full_name": "ГБПОУ «Челябинский технологический колледж»", "address": "ул. Машиностроителей, 23, Челябинск", "latitude": 55.1267, "longitude": 61.4567, "phones": ["+7 (351) 729-99-60"], "categories": ["Технологический колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_12", "name": "Челябинский юридический колледж", "full_name": "ЧОУ СПО «Челябинский юридический колледж»", "address": "ул. Цвиллинга, 60, Челябинск", "latitude": 55.1645, "longitude": 61.4156, "phones": ["+7 (351) 266-55-20"], "categories": ["Юридический колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_13", "name": "Южно-Уральский государственный технический колледж", "full_name": "ГБПОУ «Южно-Уральский государственный технический колледж»", "address": "ул. Воровского, 16, Челябинск", "latitude": 55.1598, "longitude": 61.4034, "phones": ["+7 (351) 263-44-36"], "categories": ["Технический колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_14", "name": "Челябинский экономический колледж", "full_name": "ЧОУ СПО «Челябинский экономический колледж»", "address": "ул. Кирова, 159, Челябинск", "latitude": 55.1534, "longitude": 61.3789, "phones": ["+7 (351) 263-78-05"], "categories": ["Экономический колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_15", "name": "Челябинский автотранспортный техникум", "full_name": "ГБПОУ «Челябинский автотранспортный техникум»", "address": "ул. Монакова, 33, Челябинск", "latitude": 55.1123, "longitude": 61.4234, "phones": ["+7 (351) 721-81-67"], "categories": ["Автотранспортный техникум", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_16", "name": "Челябинский государственный институт культуры", "full_name": "ФГБОУ ВО «Челябинский государственный институт культуры»", "address": "ул. Орджоникидзе, 36а, Челябинск", "latitude": 55.1699, "longitude": 61.4018, "phones": ["+7 (351) 263-83-18"], "categories": ["Институт культуры", "Высшее образование"], "source": "Демо-данные"}, {"id": "demo_17", "name": "Магнитогорский государственный технический университет (филиал)", "full_name": "Челябинский филиал ФГБОУ ВО «МГТУ им. Г.И. Носова»", "address": "ул. 250-летия Челябинска, 17, Челябинск", "latitude": 55.1589, "longitude": 61.3756, "phones": ["+7 (351) 799-74-45"], "categories": ["Филиал университета", "Техническое образование"], "source": "Демо-данные"}, {"id": "demo_18", "name": "Российский государственный профессионально-педагогический университет (филиал)", "full_name": "Челябинский филиал ФГАОУ ВО «РГППУ»", "address": "ул. Машиностроителей, 11, Челябинск", "latitude": 55.1298, "longitude": 61.4523, "phones": ["+7 (351) 729-99-10"], "categories": ["Филиал университета", "Педагогическое образование"], "source": "Демо-данные"}, {"id": "demo_19", "name": "Челябинский государственный промышленно-гуманитарный техникум", "full_name": "ГБПОУ «Челябинский государственный промышленно-гуманитарный техникум им. А.В. Яковлева»", "address": "ул. Красноармейская, 88, Челябинск", "latitude": 55.1678, "longitude": 61.4125, "phones": ["+7 (351) 263-22-89"], "categories": ["Промышленно-гуманитарный техникум", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_20", "name": "Челябинский радиотехнический техникум", "full_name": "ГБПОУ «Челябинский радиотехнический техникум»", "address": "ул. Цвиллинга, 38, Челябинск", "latitude": 55.1634, "longitude": 61.4089, "phones": ["+7 (351) 232-08-71"], "categories": ["Радиотехнический техникум", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_21", "name": "Челябинский механико-технологический техникум", "full_name": "ГБПОУ «Челябинский механико-технологический техникум»", "address": "ул. Агалакова, 102, Челябинск", "latitude": 55.1445, "longitude": 61.3756, "phones": ["+7 (351) 256-78-34"], "categories": ["Механико-технологический техникум", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_22", "name": "Челябинский строительный колледж", "full_name": "ГБПОУ «Челябинский строительный колледж»", "address": "ул. Электростальская, 12, Челябинск", "latitude": 55.1234, "longitude": 61.4567, "phones": ["+7 (351) 729-88-90"], "categories": ["Строительный колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_23", "name": "Челябинский энергетический колледж", "full_name": "ГБПОУ «Челябинский энергетический колледж им. С.М. Кирова»", "address": "ул. Энергетиков, 44, Челябинск", "latitude": 55.1345, "longitude": 61.4234, "phones": ["+7 (351) 721-17-17"], "categories": ["Энергетический колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_24", "name": "Южно-Уральский многопрофильный колледж", "full_name": "ГБПОУ «Южно-Уральский многопрофильный колледж»", "address": "ул. Доватора, 16а, Челябинск", "latitude": 55.1456, "longitude": 61.3987, "phones": ["+7 (351) 263-44-78"], "categories": ["Многопрофильный колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_25", "name": "Челябинский колледж физической культуры", "full_name": "ГБПОУ «Челябинский колледж физической культуры»", "address": "ул. Российская, 258, Челябинск", "latitude": 55.1567, "longitude": 61.3456, "phones": ["+7 (351) 237-25-25"], "categories": ["Колледж физической культуры", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_26", "name": "Челябинский социально-профессиональный колледж", "full_name": "ГБПОУ «Челябинский социально-профессиональный колледж «Сфера»", "address": "ул. Чичерина, 38, Челябинск", "latitude": 55.1678, "longitude": 61.3234, "phones": ["+7 (351) 264-65-65"], "categories": ["Социально-профессиональный колледж", "Среднее специальное образование"], "source": "Демо-данные"}, {"id": "demo_27", "name": "Международный институт дизайна и сервиса", "full_name": "ЧОУ ВО «Международный институт дизайна и сервиса»", "address": "ул. Воровского, 36, Челябинск", "latitude": 55.1589, "longitude": 61.4012, "phones": ["+7 (351) 265-35-35"], "categories": ["Частный институт", "Дизайн и сервис"], "source": "Демо-данные"}, {"id": "demo_28", "name": "Челябинский институт путей сообщения", "full_name": "Челябинский институт путей сообщения (филиал УрГУПС)", "address": "ул. Жукова, 99, Челябинск", "latitude": 55.1234, "longitude": 61.3789, "phones": ["+7 (351) 263-88-88"], "categories": ["Институт путей сообщения", "Транспорт"], "source": "Демо-данные"}, {"id": "demo_29", "name": "Уральский социально-экономический institut", "full_name": "ЧОУ ВО «Уральский социально-экономический институт»", "address": "ул. Ленина, 77, Челябинск", "latitude": 55.1545, "longitude": 61.4278, "phones": ["+7 (351) 200-33-33"], "categories": ["Частный институт", "Социально-экономическое образование"], "source": "Демо-данные"}, {"id": "demo_30", "name": "Челябинский колледж индустрии красоты", "full_name": "ЧОУ СПО «Челябинский колледж индустрии красоты»", "address": "ул. Труда, 179, Челябинск", "latitude": 55.1723, "longitude": 61.3567, "phones": ["+7 (351) 700-44-44"], "categories": ["Колледж красоты", "Среднее специальное образование"], "source": "Демо-данные"}];
|
||
|
||
DG.then(function () {
|
||
console.log('2GIS API загружен успешно');
|
||
init();
|
||
}).catch(function(error) {
|
||
console.error('Ошибка загрузки 2GIS API:', error);
|
||
document.getElementById('map').innerHTML = '<div style="padding: 50px; text-align: center; color: red; background: #ffe6e6; border: 1px solid #ff9999; border-radius: 5px;">❌ Не удалось загрузить 2GIS Maps API<br><small>Проверьте подключение к интернету</small></div>';
|
||
});
|
||
|
||
// Проверяем, что DG доступен
|
||
if (typeof DG === 'undefined') {
|
||
console.error('2GIS API не загружен');
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
document.getElementById('map').innerHTML = '<div style="padding: 50px; text-align: center; color: red; background: #ffe6e6; border: 1px solid #ff9999; border-radius: 5px;">❌ 2GIS Maps API недоступен<br><small>Проверьте подключение к интернету</small></div>';
|
||
});
|
||
}
|
||
|
||
function init() {
|
||
console.log('Инициализация карты 2GIS...');
|
||
console.log('Всего учебных заведений:', institutions.length);
|
||
|
||
try {
|
||
myMap = DG.map('map', {
|
||
center: [55.1644, 61.4291], // Центр Челябинска
|
||
zoom: 11
|
||
});
|
||
|
||
console.log('Карта создана успешно');
|
||
|
||
// Добавляем маркеры для всех учебных заведений
|
||
institutions.forEach(function(institution, index) {
|
||
console.log('Добавляем маркер для:', institution.name);
|
||
addMarker(institution, index);
|
||
});
|
||
|
||
console.log('Добавлено маркеров:', markers.length);
|
||
|
||
// Подгоняем границы карты под все маркеры
|
||
if (markers.length > 0) {
|
||
setTimeout(function() {
|
||
fitMapToBounds();
|
||
}, 1000);
|
||
}
|
||
} catch (error) {
|
||
console.error('Ошибка при инициализации карты:', error);
|
||
document.getElementById('map').innerHTML = '<div style="padding: 50px; text-align: center; color: red;">Ошибка загрузки карты 2GIS: ' + error.message + '</div>';
|
||
}
|
||
}
|
||
|
||
function addMarker(institution, index) {
|
||
// Определяем иконку в зависимости от типа учреждения
|
||
let iconColor = getIconColor(institution);
|
||
|
||
let marker = DG.marker([institution.latitude, institution.longitude], {
|
||
icon: DG.icon({
|
||
iconUrl: getIconUrl(institution),
|
||
iconSize: [32, 32],
|
||
iconAnchor: [16, 32]
|
||
})
|
||
}).addTo(myMap);
|
||
|
||
// Создаем содержимое всплывающего окна
|
||
let popupContent = createPopupContent(institution);
|
||
marker.bindPopup(popupContent);
|
||
|
||
// Сохраняем данные учреждения в маркере для фильтрации
|
||
marker.institution = institution;
|
||
marker.institutionIndex = index;
|
||
|
||
markers.push(marker);
|
||
}
|
||
|
||
function getIconColor(institution) {
|
||
let name = institution.name.toLowerCase();
|
||
let categories = institution.categories.join(' ').toLowerCase();
|
||
|
||
if (name.includes('университет') || categories.includes('университет')) return 'blue';
|
||
if (name.includes('институт') || categories.includes('институт')) return 'green';
|
||
if (name.includes('колледж') || categories.includes('колледж')) return 'orange';
|
||
if (name.includes('техникум') || categories.includes('техникум')) return 'red';
|
||
return 'gray';
|
||
}
|
||
|
||
function getIconUrl(institution) {
|
||
// Используем стандартные иконки 2GIS или создаем собственные
|
||
let name = institution.name.toLowerCase();
|
||
let categories = institution.categories.join(' ').toLowerCase();
|
||
|
||
// Для демонстрации используем простые цветные маркеры
|
||
if (name.includes('университет') || categories.includes('университет')) {
|
||
return 'data:image/svg+xml;base64,' + btoa(`
|
||
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
||
<circle cx="16" cy="16" r="12" fill="#2c5aa0" stroke="white" stroke-width="2"/>
|
||
<text x="16" y="20" text-anchor="middle" fill="white" font-size="16">🎓</text>
|
||
</svg>
|
||
`);
|
||
}
|
||
if (name.includes('институт') || categories.includes('институт')) {
|
||
return 'data:image/svg+xml;base64,' + btoa(`
|
||
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
||
<circle cx="16" cy="16" r="12" fill="#28a745" stroke="white" stroke-width="2"/>
|
||
<text x="16" y="20" text-anchor="middle" fill="white" font-size="16">🏛️</text>
|
||
</svg>
|
||
`);
|
||
}
|
||
if (name.includes('колледж') || categories.includes('колледж')) {
|
||
return 'data:image/svg+xml;base64,' + btoa(`
|
||
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
||
<circle cx="16" cy="16" r="12" fill="#fd7e14" stroke="white" stroke-width="2"/>
|
||
<text x="16" y="20" text-anchor="middle" fill="white" font-size="16">📚</text>
|
||
</svg>
|
||
`);
|
||
}
|
||
if (name.includes('техникум') || categories.includes('техникум')) {
|
||
return 'data:image/svg+xml;base64,' + btoa(`
|
||
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
||
<circle cx="16" cy="16" r="12" fill="#dc3545" stroke="white" stroke-width="2"/>
|
||
<text x="16" y="20" text-anchor="middle" fill="white" font-size="16">🔧</text>
|
||
</svg>
|
||
`);
|
||
}
|
||
|
||
// По умолчанию
|
||
return 'data:image/svg+xml;base64,' + btoa(`
|
||
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
||
<circle cx="16" cy="16" r="12" fill="#6c757d" stroke="white" stroke-width="2"/>
|
||
<text x="16" y="20" text-anchor="middle" fill="white" font-size="16">🏫</text>
|
||
</svg>
|
||
`);
|
||
}
|
||
|
||
function createPopupContent(institution) {
|
||
let content = '<div class="balloon-content">';
|
||
|
||
content += '<div class="balloon-title">' + institution.name + '</div>';
|
||
|
||
if (institution.full_name && institution.full_name !== institution.name) {
|
||
content += '<div style="font-size: 13px; color: #888; margin-bottom: 8px;">' + institution.full_name + '</div>';
|
||
}
|
||
|
||
if (institution.address) {
|
||
content += '<div class="balloon-address">📍 ' + institution.address + '</div>';
|
||
}
|
||
|
||
if (institution.categories && institution.categories.length > 0) {
|
||
content += '<div class="balloon-categories">';
|
||
content += '<strong>📋 Категории:</strong><br>';
|
||
institution.categories.forEach(function(category) {
|
||
content += '<span class="category-tag">' + category + '</span>';
|
||
});
|
||
content += '</div>';
|
||
}
|
||
|
||
let contacts = [];
|
||
if (institution.phones && institution.phones.length > 0) {
|
||
institution.phones.forEach(function(phone) {
|
||
contacts.push('📞 <a href="tel:' + phone + '">' + phone + '</a>');
|
||
});
|
||
}
|
||
|
||
if (contacts.length > 0) {
|
||
content += '<div class="balloon-contacts">' + contacts.join('<br>') + '</div>';
|
||
}
|
||
|
||
// Источник данных
|
||
if (institution.source) {
|
||
content += '<div style="margin-top: 10px; font-size: 11px; color: #999;">Источник: ' + institution.source + '</div>';
|
||
}
|
||
|
||
content += '</div>';
|
||
return content;
|
||
}
|
||
|
||
function filterByCategory(category) {
|
||
// Обновляем активную кнопку
|
||
document.querySelectorAll('.filter-btn').forEach(btn => btn.classList.remove('active'));
|
||
event.target.classList.add('active');
|
||
|
||
let visibleCount = 0;
|
||
|
||
markers.forEach(function(marker) {
|
||
let institution = marker.institution;
|
||
let shouldShow = false;
|
||
|
||
if (category === 'all') {
|
||
shouldShow = true;
|
||
} else {
|
||
// Проверяем название и категории учреждения
|
||
let searchText = (institution.name + ' ' + institution.categories.join(' ') + ' ' + institution.full_name).toLowerCase();
|
||
shouldShow = searchText.includes(category.toLowerCase());
|
||
}
|
||
|
||
if (shouldShow) {
|
||
if (!myMap.hasLayer(marker)) {
|
||
myMap.addLayer(marker);
|
||
}
|
||
visibleCount++;
|
||
} else {
|
||
if (myMap.hasLayer(marker)) {
|
||
myMap.removeLayer(marker);
|
||
}
|
||
}
|
||
});
|
||
|
||
// Обновляем счетчик
|
||
document.getElementById('showing-count').textContent = visibleCount;
|
||
|
||
// Подгоняем карту под видимые маркеры
|
||
if (visibleCount > 0) {
|
||
fitMapToBounds();
|
||
}
|
||
}
|
||
|
||
function fitMapToBounds() {
|
||
let visibleMarkers = markers.filter(marker => myMap.hasLayer(marker));
|
||
if (visibleMarkers.length === 0) return;
|
||
|
||
if (visibleMarkers.length === 1) {
|
||
// Если только один маркер, центрируем на него
|
||
let coords = visibleMarkers[0].getLatLng();
|
||
myMap.setView([coords.lat, coords.lng], 14);
|
||
} else {
|
||
// Если несколько маркеров, подгоняем границы
|
||
let bounds = [];
|
||
visibleMarkers.forEach(marker => {
|
||
let coords = marker.getLatLng();
|
||
bounds.push([coords.lat, coords.lng]);
|
||
});
|
||
|
||
// Вычисляем границы
|
||
let minLat = Math.min(...bounds.map(b => b[0]));
|
||
let maxLat = Math.max(...bounds.map(b => b[0]));
|
||
let minLng = Math.min(...bounds.map(b => b[1]));
|
||
let maxLng = Math.max(...bounds.map(b => b[1]));
|
||
|
||
// Добавляем отступы
|
||
let padding = 0.01;
|
||
myMap.fitBounds([
|
||
[minLat - padding, minLng - padding],
|
||
[maxLat + padding, maxLng + padding]
|
||
]);
|
||
}
|
||
}
|
||
|
||
// Добавляем обработчик изменения размера окна
|
||
window.addEventListener('resize', function() {
|
||
if (myMap) {
|
||
myMap.invalidateSize();
|
||
}
|
||
});
|
||
</script>
|
||
</body>
|
||
</html> |