SA-SAJCOAI / modules /maps /maps_app.py
EGYADMIN's picture
Upload 75 files
fb20480 verified
"""
وحدة الخرائط المتكاملة
"""
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