/
VerP404
/
MosaicMap
Обзор
Документация
Войти
/
VerP404
/
MosaicMap
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
dash_app/components/map_component.py
143 строки
6 KB
Rodionov Dmitriy
feat: запуск проекта.
17 дек 2025, 18:06
17 дек 2025, 18:06
add2b2f
Код
Авторство
О чём код?
""" Компонент карты только для ПРОСМОТРА корпусов, участков и адресов. Никакого рисования и редактирования на этой вкладке нет. """ from dash import html, dcc, Input, Output import dash_leaflet as dl from models import Building, District, Address # Координаты центра Воронежа VORONEZH_CENTER = [51.675, 39.205] layout = html.Div([ # Панель управления html.Div([ html.Div([ html.H4("🗺️ Карта (только просмотр)", className="mb-3"), # Фильтры отображения html.Div([ html.Label("Показывать:", className="form-label"), dcc.Checklist( id='display-filters', options=[ {'label': '🏢 Корпуса', 'value': 'buildings'}, {'label': '🗺️ Участки', 'value': 'districts'}, {'label': '🏠 Адреса без участка', 'value': 'addresses'}, ], value=['buildings', 'districts'], className="mb-3" ) ]), # Кнопка обновления слоёв html.Button("🔄 Обновить слои", id='refresh-map-btn', className="btn btn-outline-secondary btn-sm") ], className="card-body"), ], className="col-md-3"), # Карта html.Div([ dl.Map( id="map", center=VORONEZH_CENTER, zoom=13, style={'height': '600px', 'width': '100%'}, children=[ dl.TileLayer(), # Слой для корпусов dl.LayerGroup(id="buildings-layer"), # Слой для участков dl.LayerGroup(id="districts-layer"), # Слой для адресов dl.LayerGroup(id="addresses-layer"), ], ) ], className="col-md-9") ], className="row") def register_callbacks(app): """Регистрация callback'ов для компонента карты (только просмотр).""" # Callback для обновления слоев карты @app.callback( [Output("buildings-layer", "children"), Output("districts-layer", "children"), Output("addresses-layer", "children")], [Input("display-filters", "value"), Input("refresh-map-btn", "n_clicks")] ) def update_map_layers(display_filters, refresh_clicks): buildings_layer = [] districts_layer = [] addresses_layer = [] # Корпуса if 'buildings' in display_filters: buildings = Building.query.all() for building in buildings: buildings_layer.append( dl.Marker( position=[building.latitude, building.longitude], children=[ dl.Popup([ html.H5(building.name), html.P(f"Адрес: {building.address}"), html.P(f"Вместимость: {building.capacity} чел."), html.P(building.description or "") ]) ] ) ) # Участки if 'districts' in display_filters: districts = District.query.all() for district in districts: if district.polygon: districts_layer.append( dl.Polygon( positions=district.polygon, color=district.color, fillColor=district.color, fillOpacity=0.3, weight=2, children=[ html.Div([ html.H5(district.name), html.P(f"Население: {district.population} чел."), html.P(f"Площадь: {district.area_sq_km} км²"), html.P(f"Корпусов: {district.building_count}"), html.P(f"Вместимость: {district.total_capacity} чел.") ]) ] ) ) # Адреса (только те, что не прикреплены к корпусам) if 'addresses' in display_filters: addresses = Address.query.filter(Address.building_id.is_(None)).limit(1000).all() for address in addresses: addresses_layer.append( dl.Circle( center=[address.latitude, address.longitude], radius=5, color='blue', fillColor='blue', fillOpacity=0.6, children=[ dl.Popup([ html.P(f"{address.street} {address.housenumber}"), html.P(f"OSM ID: {address.osm_id}") ]) ] ) ) return buildings_layer, districts_layer, addresses_layer