اذهب إلى المحتوى

السؤال

نشر (معدل)

أريد تصميم برنامج لتخطيط شبكات وأريد أن يحتوي البرنامج على واجهة تحتوي خريطة تفاعلية بحيث يمكنني رفع ملف المواقع المراد تخطيط طرق اتصال بينها و من خلال هذه الخريطة اريد إضافة إطار حول عدد محدد من المواقع ليحسب البرنامج المسافة بين كل منهم و الامواقع المحيطة بمسافة لا تتعدى حد معين هذا الحد متغير 

كيف يمكنني تنفيذ هذا البرنامج

 

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال

Recommended Posts

  • 0
نشر

1- أولاً، تحتاج إلى إنشاء واجهة مستخدم تسمح للمستخدمين برفع ملف المواقع المراد تخطيط طرق اتصال بينها، وهناك مكتبة tkinter أو PyQt لإنشاء واجهة مستخدم رسومية.

بعد إنشاء الواجهة، تحتاج إلى إضافة عنصر تحكم يمكن للمستخدمين من خلاله رفع الملف، وتستطيع استخدام عنصر تحكم filedialog.askopenfilename() لعرض مربع حوار يسمح للمستخدمين بتحديد الملف.

بمجرد أن يقوم المستخدم برفع الملف، باستطاعتك قراءة بيانات الملف وإنشاء قائمة بالمواقع.

2-بعد إنشاء قائمة بالمواقع، قم  بإضافة إطار حول عدد محدد من المواقع باستخدام الدالة shapely.geometry.Point() لإنشاء نقطة لكل موقع.

بعد إنشاء النقاط، استخدم الدالة shapely.geometry.Polygon() لإنشاء مضلع يحيط بالمواقع المحددة.

3-بعد إضافة الإطار، يمكنك حساب المسافة بين كل موقع والموقع المحيط به واستخدام الدالة shapely.geometry.distance() لحساب المسافة بين نقطتين.

4- أخيرًا، عرض النتائج على الواجهة من خلال مكتبة matplotlib لعرض البيانات في شكل خريطة.

import tkinter as tk
import shapely.geometry as geom
import matplotlib.pyplot as plt

# إنشاء واجهة المستخدم
root = tk.Tk()
root.title("تخطيط الشبكات")

# إضافة عنصر تحكم لرفع الملف
upload_button = tk.Button(root, text="رفع الملف", command=upload_file)
upload_button.pack()

# قراءة بيانات الملف
def upload_file():
    filename = tk.filedialog.askopenfilename()
    with open(filename, "r") as f:
        data = f.readlines()

    # إنشاء قائمة بالمواقع
    sites = []
    for line in data:
        point = geom.Point(line.split(","))
        sites.append(point)

# إضافة إطار حول المواقع المحددة
def add_frame():
    num_sites = int(input("عدد المواقع: "))
    frame_points = []
    for i in range(num_sites):
        point = sites[i]
        frame_points.append(point)
    frame = geom.Polygon(frame_points)

    # حساب المسافة بين المواقع
    distances = []
    for site in sites:
        distances.append(frame.distance(site))

# عرض النتائج
def show_results():
    plt.scatter([site.x for site in sites], [site.y for site in sites], c=distances)
    plt.show()

# إضافة أزرار لإضافة إطار حول المواقع المحددة وعرض النتائج
add_frame_button = tk.Button(root, text="إضافة إطار", command=add_frame)
add_frame_button.pack()
show_results_button = tk.Button(root, text="عرض النتائج", command=show_results)
show_results_button.pack()

# تشغيل الواجهة
root.mainloop()

 

  • 0
نشر (معدل)

شكرا لتفاعلك أخي الكريم ودعني أوضح الفكرة أكثر لترتيب الخطوات 

1- تصميم الواجهة يجب أن يحتوي على خريطة تفاعلية تظهر بصرف النظر كان هناك ملف مواقع مدرج أم لا.

2- الواجهة تسمح برفع ملف مواقع يشمل جميع المواقع بمنطقة ما تنعكس على هذه الخريطة التفاعلية بمجرد رفعها. 

3- اتاحة خيار للمستخدم يستطيع من خلاله رسم إطار على هذه الخريطة ليحدد من خلاله قائمة المواقع المستهدفة لتخطيط طرق الاتصال بينها.

4-إتاحة خيار حساب المسافة بين كل موقع داخل الاطار و بين كل المواقع المحيطة الواقعة على مسافة أقل من حد معين (هذا الحد متغير حسب رغبة المستخدم يجب أن يدرج من خلال واجة المستخدم) 

5-وعليه بمجرد تحديد هذه المواقع يستطيع المستخدم أن يحدد ما إذا كان يريد تخطيط طرق اتصال بين كل موقع داخل الاطار وبين المواقع الاخرى داخل الاطار فقط أو كل المواقع (داخل و خارج الاطار) ومن ثم حساب المسافة بين كل موقع داخل الاطار و المواقع الاخرى بشرط ألا يدرج في قائمة المواقع الستهدفة كوجههة أي موقع يقع على مسافة تتعدى حد معين(المتغير الذي يحدده المستخدم من خلال الواجهة) و ليكن 10 كيلومترات

6-إستخراج النتائج في ملف وليكن csv يحتوي كل موقع داخل الاطار أمامه قائمة المواقع التي تم استهدافها أمام كل منها المسافة بينهما.

 

أرجو أن تكون الفكرة والهدف من البرناج أوضح الآن

 

تم التعديل في بواسطة محمد النجار13
  • 0
نشر
بتاريخ On 16‏/9‏/2023 at 09:18 قال محمد النجار13:

شكرا لتفاعلك أخي الكريم ودعني أوضح الفكرة أكثر لترتيب الخطوات 

1- تصميم الواجهة يجب أن يحتوي على خريطة تفاعلية تظهر بصرف النظر كان هناك ملف مواقع مدرج أم لا.

2- الواجهة تسمح برفع ملف مواقع يشمل جميع المواقع بمنطقة ما تنعكس على هذه الخريطة التفاعلية بمجرد رفعها. 

3- اتاحة خيار للمستخدم يستطيع من خلاله رسم إطار على هذه الخريطة ليحدد من خلاله قائمة المواقع المستهدفة لتخطيط طرق الاتصال بينها.

4-إتاحة خيار حساب المسافة بين كل موقع داخل الاطار و بين كل المواقع المحيطة الواقعة على مسافة أقل من حد معين (هذا الحد متغير حسب رغبة المستخدم يجب أن يدرج من خلال واجة المستخدم) 

5-وعليه بمجرد تحديد هذه المواقع يستطيع المستخدم أن يحدد ما إذا كان يريد تخطيط طرق اتصال بين كل موقع داخل الاطار وبين المواقع الاخرى داخل الاطار فقط أو كل المواقع (داخل و خارج الاطار) ومن ثم حساب المسافة بين كل موقع داخل الاطار و المواقع الاخرى بشرط ألا يدرج في قائمة المواقع الستهدفة كوجههة أي موقع يقع على مسافة تتعدى حد معين(المتغير الذي يحدده المستخدم من خلال الواجهة) و ليكن 10 كيلومترات

6-إستخراج النتائج في ملف وليكن csv يحتوي كل موقع داخل الاطار أمامه قائمة المواقع التي تم استهدافها أمام كل منها المسافة بينهما.

 

أرجو أن تكون الفكرة والهدف من البرناج أوضح الآن

 

من الجيد دائماً عند القيام ببرنامج خاص بالخرائط استعمال google map api، فهي تسمح لك بجلب خريطة تفاعلية و القيام ببعض التعديلات عليها.

مثلاً عندما تقول أن المستخدم سيرفع ملف مواقع، عليك أن تحدد الشكل الخاص بمحتوى هذا الملف، و بناء عليه تقوم بمعالجته و إرسال طلبات لل api لإضافة مواقع معينة.

باقي العمليات نفس المبدأ، عليك القيام ببعض المعالجة لوحدك و من ثم إرسال الطلب المناسب لل api.

لكن هناك مشكلة في حساب الموقع بين كل نقطة و أخرى، سيكون هناك الكثير من النقاط و بالتالي حساب المسافة سيكون معقد جداً من الناحية الحسابية و غير ممكن.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...