""" وحدة الخرائط المتكاملة """ import streamlit as st import folium from streamlit_folium import folium_static import pandas as pd import random class MapsApp: """ وحدة الخرائط المتكاملة للنظام """ def __init__(self): """ تهيئة وحدة الخرائط """ # تهيئة حالة الجلسة الخاصة بالخرائط إذا لم تكن موجودة if 'map_projects' not in st.session_state: # إنشاء بيانات تجريبية للمشاريع st.session_state.map_projects = self._generate_sample_projects() def run(self): """ تشغيل وحدة الخرائط """ st.markdown("

وحدة الخرائط المتكاملة

", unsafe_allow_html=True) # إنشاء تبويبات للخرائط المختلفة tabs = st.tabs(["خريطة المشاريع", "خريطة المناقصات", "تحليل المناطق"]) with tabs[0]: self._render_projects_map() with tabs[1]: self._render_tenders_map() with tabs[2]: self._render_region_analysis() def _render_projects_map(self): """ عرض خريطة المشاريع """ st.markdown("### خريطة المشاريع النشطة") st.markdown("عرض جميع المشاريع النشطة على الخريطة مع معلومات تفصيلية") # إنشاء خريطة مركزها المملكة العربية السعودية m = folium.Map(location=[24.7136, 46.6753], zoom_start=5) # إضافة المشاريع إلى الخريطة for project in st.session_state.map_projects: popup_html = f"""

{project['name']}

العميل: {project['client']}

القيمة: {project['value']} ريال

الحالة: {project['status']}

""" # تحديد لون المؤشر بناءً على حالة المشروع icon_color = 'green' if project['status'] == 'نشط' else 'orange' if project['status'] == 'قيد التنفيذ' else 'red' folium.Marker( location=[project['lat'], project['lng']], popup=folium.Popup(popup_html, max_width=300), tooltip=project['name'], icon=folium.Icon(color=icon_color, icon='info-sign') ).add_to(m) # عرض الخريطة folium_static(m, width=800, height=500) # عرض جدول المشاريع st.markdown("### قائمة المشاريع") # تحويل البيانات إلى DataFrame df = pd.DataFrame(st.session_state.map_projects) df = df[['name', 'client', 'city', 'value', 'status']] df.columns = ['اسم المشروع', 'العميل', 'المدينة', 'القيمة (ريال)', 'الحالة'] # عرض الجدول st.dataframe(df, use_container_width=True) def _render_tenders_map(self): """ عرض خريطة المناقصات """ st.markdown("### خريطة المناقصات المتاحة") st.markdown("عرض المناقصات المتاحة حالياً على الخريطة مع تحليل التوزيع الجغرافي") # إنشاء خريطة مركزها المملكة العربية السعودية m = folium.Map(location=[24.7136, 46.6753], zoom_start=5) # إضافة طبقة الكثافة الحرارية للمناقصات heat_data = [[p['lat'], p['lng']] for p in st.session_state.map_projects] # إضافة المناقصات إلى الخريطة for project in st.session_state.map_projects: if project['status'] == 'مناقصة': popup_html = f"""

{project['name']}

العميل: {project['client']}

القيمة التقديرية: {project['value']} ريال

تاريخ الإغلاق: {project.get('closing_date', '2025-05-15')}

""" folium.Marker( location=[project['lat'], project['lng']], popup=folium.Popup(popup_html, max_width=300), tooltip=project['name'], icon=folium.Icon(color='blue', icon='info-sign') ).add_to(m) # عرض الخريطة folium_static(m, width=800, height=500) # عرض إحصائيات المناقصات حسب المنطقة st.markdown("### توزيع المناقصات حسب المنطقة") # تحليل بسيط للمناقصات حسب المدينة tenders = [p for p in st.session_state.map_projects if p['status'] == 'مناقصة'] city_counts = {} for tender in tenders: city = tender['city'] if city in city_counts: city_counts[city] += 1 else: city_counts[city] = 1 # تحويل البيانات إلى DataFrame df = pd.DataFrame(list(city_counts.items()), columns=['المدينة', 'عدد المناقصات']) # عرض الرسم البياني st.bar_chart(df.set_index('المدينة')) def _render_region_analysis(self): """ عرض تحليل المناطق """ st.markdown("### تحليل المناطق الجغرافية") st.markdown("تحليل توزيع المشاريع والمناقصات حسب المناطق مع مؤشرات الأداء") # إنشاء بيانات تحليلية للمناطق regions = { 'الرياض': {'projects': 12, 'tenders': 8, 'success_rate': 75}, 'مكة المكرمة': {'projects': 8, 'tenders': 5, 'success_rate': 60}, 'المدينة المنورة': {'projects': 5, 'tenders': 3, 'success_rate': 65}, 'القصيم': {'projects': 4, 'tenders': 2, 'success_rate': 50}, 'المنطقة الشرقية': {'projects': 10, 'tenders': 7, 'success_rate': 70}, 'عسير': {'projects': 6, 'tenders': 4, 'success_rate': 55}, 'تبوك': {'projects': 3, 'tenders': 2, 'success_rate': 80}, 'حائل': {'projects': 2, 'tenders': 1, 'success_rate': 45}, 'الحدود الشمالية': {'projects': 1, 'tenders': 1, 'success_rate': 40}, 'جازان': {'projects': 3, 'tenders': 2, 'success_rate': 60}, 'نجران': {'projects': 2, 'tenders': 1, 'success_rate': 50}, 'الباحة': {'projects': 1, 'tenders': 1, 'success_rate': 55}, 'الجوف': {'projects': 2, 'tenders': 1, 'success_rate': 60} } # تحويل البيانات إلى DataFrame df = pd.DataFrame({ 'المنطقة': list(regions.keys()), 'المشاريع النشطة': [r['projects'] for r in regions.values()], 'المناقصات الحالية': [r['tenders'] for r in regions.values()], 'نسبة النجاح (%)': [r['success_rate'] for r in regions.values()] }) # عرض الجدول st.dataframe(df, use_container_width=True) # عرض الرسم البياني للمشاريع والمناقصات st.markdown("### توزيع المشاريع والمناقصات حسب المنطقة") chart_data = pd.DataFrame({ 'المنطقة': list(regions.keys()), 'المشاريع النشطة': [r['projects'] for r in regions.values()], 'المناقصات الحالية': [r['tenders'] for r in regions.values()] }) st.bar_chart(chart_data.set_index('المنطقة')) # عرض خريطة المملكة مع تلوين المناطق حسب نسبة النجاح st.markdown("### خريطة نسب النجاح حسب المناطق") st.markdown("*قريباً: سيتم إضافة خريطة تفاعلية للمملكة مع تلوين المناطق حسب نسب النجاح*") def _generate_sample_projects(self): """ إنشاء بيانات تجريبية للمشاريع """ # قائمة المدن السعودية مع إحداثياتها cities = { 'الرياض': {'lat': 24.7136, 'lng': 46.6753}, 'جدة': {'lat': 21.4858, 'lng': 39.1925}, 'مكة المكرمة': {'lat': 21.3891, 'lng': 39.8579}, 'المدينة المنورة': {'lat': 24.5247, 'lng': 39.5692}, 'الدمام': {'lat': 26.4207, 'lng': 50.0888}, 'الخبر': {'lat': 26.2172, 'lng': 50.1971}, 'تبوك': {'lat': 28.3998, 'lng': 36.5715}, 'أبها': {'lat': 18.2164, 'lng': 42.5053}, 'بريدة': {'lat': 26.3292, 'lng': 43.9708}, 'جازان': {'lat': 16.8892, 'lng': 42.5611} } # قائمة العملاء clients = [ 'وزارة النقل', 'وزارة الإسكان', 'وزارة التعليم', 'وزارة الصحة', 'أمانة منطقة الرياض', 'أمانة محافظة جدة', 'الهيئة الملكية لمدينة الرياض', 'شركة أرامكو السعودية', 'شركة سابك', 'الهيئة السعودية للمدن الصناعية' ] # قائمة حالات المشاريع statuses = ['نشط', 'قيد التنفيذ', 'مناقصة', 'مكتمل'] # إنشاء قائمة المشاريع projects = [] for i in range(30): city_name = random.choice(list(cities.keys())) city_data = cities[city_name] # إضافة تغيير طفيف للإحداثيات لتجنب تراكب المؤشرات lat_offset = random.uniform(-0.1, 0.1) lng_offset = random.uniform(-0.1, 0.1) project = { 'id': i + 1, 'name': f'مشروع {i + 1}', 'client': random.choice(clients), 'city': city_name, 'lat': city_data['lat'] + lat_offset, 'lng': city_data['lng'] + lng_offset, 'value': random.randint(1000000, 100000000), 'status': random.choice(statuses) } projects.append(project) return projects