Spaces:
Sleeping
Sleeping
File size: 11,389 Bytes
fb20480 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
"""
وحدة الخرائط المتكاملة
"""
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("<h2 class='module-title'>وحدة الخرائط المتكاملة</h2>", 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"""
<div style="direction: rtl; text-align: right; width: 200px;">
<h4>{project['name']}</h4>
<p><strong>العميل:</strong> {project['client']}</p>
<p><strong>القيمة:</strong> {project['value']} ريال</p>
<p><strong>الحالة:</strong> {project['status']}</p>
</div>
"""
# تحديد لون المؤشر بناءً على حالة المشروع
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"""
<div style="direction: rtl; text-align: right; width: 200px;">
<h4>{project['name']}</h4>
<p><strong>العميل:</strong> {project['client']}</p>
<p><strong>القيمة التقديرية:</strong> {project['value']} ريال</p>
<p><strong>تاريخ الإغلاق:</strong> {project.get('closing_date', '2025-05-15')}</p>
</div>
"""
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
|