Lecture 7 - Spatial Data Structure

مقدمة
  • الجزء ده بيتكلم عن هياكل البيانات المكانية (Spatial Data Structures) — إزاي البيانات المكانية (نقاط، خطوط، مناطق) بتتخزن في الـ GIS.
  • أهم المحاور: Point Data (K-D Tree, PR Quadtree, Grid Files), Line Data (Arc-Node, Chain Codes), Area Data (Boundary Model, Region Quadtree), و R-Trees كـ Index ديناميكي.

2) Overview of Spatial Data Structures

  • هياكل البيانات المكانية اتقسمت حسب نوع البيانات نفسها الي:
    • ا Point Data: بيتم تخزينها بطرق زيCell Method, Point Quadtrees, K-D Trees, PR Quadtrees, Grid Filess.
    • ا Line Data: بيتم تخزينها باستخدام Arc-Node Structure, Chain Codes.
    • ا Area Data: بيتم تخزينها باستخدام Boundary Model, Region Quadtree.

3) R-Trees — A Dynamic Index Structure for Spatial Data

  • الـ R-Tree هي Dynamic Index Structure مخصص للبيانات المكانية.

3.1) Why R-Trees?

  • الـ B+ Tree كويس للبيانات الخطية (1D)، لكن مش مناسب للبيانات المكانية (2D/3D).
  • الـ R-Tree بيحل المشكلة دي عن طريق تقسيم المساحة لمستطيلات حد أدنى (MBR).

3.2) Properties

  • ا Height Balanced — كل المسارات من الروت للورقة طولها متساوي.
  • ا 2 types of nodes: فيها نوعين, Internal Nodes و Leaf Nodes.
  • ا Leaves point to disk pages — الـ Leaves بتبقى شايلة "عناوين" (Pointers) بتوديك لمكان تخزينها الفعلي على الهارد ديسك.
  • ا Records in the leaves point to actual data objects — كل Record جواه مؤشر مباشر بيسحب العنصر أو الشكل الفعلي من قاعدة البيانات..
  • ا Max Capacity = اM — لو النود بتشيل عدد (M) من البيانات كحد أقصى، فلازم على الأقل تكون مليانة للنص (M/2).
  • ا Completely Dynamic — لو ضفت بيانات جديدة أو مسحت بيانات قديمة، الشجرة بتعدل نفسها وتتوازن تلقائياً من غير ما تحتاج توقف النظام وتبني الشجرة كلها من الصفر.
  • ا Guaranteed Fan-out of M/2 — كل نود (ما عدا الروت) يكون طالع منها على الأقل فروع عددها M/2، وده اللي بيحافظ على توازن الشجرة.
  • كل Leaf Record هو MBR (Minimum Bounding Rectangle) — كل سجل في الأوراق بيمثل (MBR - Minimum Bounding Rectangle)، يعني بيحوط العنصر اللي جواه في "أصغر مستطيل ممكن" من غير ما يسيب مساحات فاضية كتير ملهاش لازمة.
  • ا Root has at least two children) — الروت لازم يتقسم لفرعين علي الاقل.

ا M هنا بيمثل السعة القصوى (Maximum Capacity) لأي Node جوه الشجرة.

3.3) The Structure

  • عشان تتخيلها ببساطة، اعتبر الـ R-Tree دي عاملة زي "فولدرات الكمبيوتر"؛ فولدر كبير جواه فولدرات أصغر، لحد ما تفتح آخر فولدر تلاقي جواه الملفات الحقيقية.

  • ا Internal Nodes: دي بتمثل "الفولدرات الكبيرة والمتوسطة" اللي في الشجرة، ومفيهاش بيانات حقيقية، وظيفتها بس توجهك. وكل عقدة فيها بتتكون من حاجتين:

    1. المستطيل (N dimensional rectangle): ده مستطيل وهمي كبير بيترسم عشان يحوط مجموعة من المستطيلات الأصغر منه (ممكن يكون 2D على خريطة عادية، أو 3D لو الخريطة مجسمة).
    2. المؤشر (Child pointer): ده السهم أو "العنوان" اللي بيشاور على المستطيلات الأصغر (الأبناء) اللي موجودين جوه المستطيل الكبير ده.
  • ا Leaf Nodes: دي "نهاية فروع الشجرة"، ودي اللي بتوصلك للبيانات الحقيقية. وبرضه بتتكون من حاجتين:

    1. أصغر مستطيل محيط (MBR - Minimum Bounding Rectangle): ده المستطيل اللي بيترسم حوالين الشكل الحقيقي بالظبط على الخريطة (زي مبنى أو بحيرة) عشان يحجمه بأقل مساحة ممكنة من غير أي فراغات ملهاش لازمة.
    2. مؤشر البيانات (Tuple-identifier): ده السهم الأخير اللي بياخدك من إيدك ويوديك للـ "Hard Disk" (أو قاعدة البيانات) عشان تقرا البيانات الفعلية بتاعت الشكل ده (زي اسمه، نوعه، مساحته، إلخ).
image
  • الأشكال الي متلونه ازرق (المستطيلات الصغيرة والنقط) اللي تحت دي البيانات الحقيقية بتاعتنا (مثلاً: بيوت، بحيرات، شوارع).
  • كل مجموعة أشكال زرقا قريبة من بعض حوطناهم بـ مستطيل رفيع على قدهم بالظبط (زي المستطيلات a, b, c, d), المستطيلات الرفيعة دي هي الـ (MBR) اللي جوه العقد الورقية (Leaf Nodes).
  • في الشجرة اللي فوق، هتلاقي الحروف دي (a, b, c...) هي اللي في المستوى قبل الأخير، وكل حرف طالع منه خطوط لتحت (دي المؤشرات أو الـ Tuple-identifiers اللي بتوديك للشكل الأزرق الحقيقي).
  • بعدها جمعنا كل كام مستطيل رفيع قريبين من بعض، وحوطناهم بـ مستطيل تخين كبير (دي العقد الداخلية).
من الاخر
  • البيانات الحقيقية (الأشكال الزرقاء): دي العناصر الفعلية اللي على الخريطة (بيوت، شوارع، إلخ) وموجودة جوه أصغر مستطيلات.

  • العقد الورقية / Leaf Nodes (المستطيلات الرفيعة a,b,c...): دي أصغر مستطيلات (MBR) بتترسم عشان تحوط الأشكال الزرقاء بالظبط، وبتكون في المستوى قبل الأخير في الشجرة اللي فوق.

  • العقد الداخلية / Internal Nodes (المستطيلات الكبيرة m,n,o,p): دي مستطيلات "تجميعية" أكبر، كل مستطيل فيهم بيلم جواه مجموعة من المستطيلات الرفيعة القريبة من بعض.

  • الجذر / Root Node (البلوك [m|n|o|p]): ده قمة الشجرة (نقطة البداية)، وجواه المؤشرات اللي بتوزعك على المستطيلات الكبيرة عشان تبدأ رحلة البحث.

3.4) Operations

  • الإضافة (Inserts): إنك تحط عنصر أو شكل جديد في الشجرة.
  • الحذف (Deletes): إنك تمسح عنصر من الشجرة.
  • التحديث (Updates): خلي بالك، التحديث هنا مش بيحصل في نفس المكان، لكن النظام بيمسح العنصر القديم ويضيفه من جديد بتعديلاته. (السبب: إن تغيير حجم العنصر ممكن يغير حجم المستطيلات اللي محوطاه، فالأضمن يمسحه ويضيفه عشان الشجرة تتوزن صح).

2. الـ Queries/Searches

  • دي الميزة الأقوى للـ R-Tree، إنها بتعمل "بحث مكاني" (Spatial Search).
  • امثله:
    • البحث جوه مساحة معينة: "هاتلي أسماء كل الطرق اللي جوه مساحة 1 كيلومتر مربع؟".
    • البحث في مسار معين: "إيه المباني اللي هتقابلني وأنا ماشي بين مبنى كذا ومبنى كذا؟"
    • الاحتواء الكامل (Contained): "هاتلي كل المستطيلات (العناصر) اللي واقعة بالكامل جوه المستطيل اللي ببحث بيه".
    • التقاطع (Intersecting): "هاتلي كل المستطيلات اللي بتتقاطع أو بتلمس المستطيل اللي ببحث بيه" (حتى لو جزء منها بس هو اللي جوه).

4) K-D Trees

4.1) Definition

  • الـ K-D Tree (K-Dimensional Tree) هو Binary Search Tree كل عقدة فيه نقطة في K بُعد.
  • بيستخدم لتخزين النقاط في K أبعاد (مثلًا: 2D أو 3D).
  • الـ Range queries: دي اهم ميزه, بتمكنك تبحث بأكتر من شرط (Key) في نفس الوقت.
    • مثال: لو بتبحث في داتا بيز، تقدر تقول: "هاتلي الناس اللي سنهم بين 34 و 49 وكمان مرتبهم بين 100 ألف و 150 ألف".
  • أشهر مجالاتها: بتستخدم بكثرة في الـ GIS (عشان الإحداثيات) والجرافيكس.
  • هي تطوير للـ binary search tree اللي خدناها زمان (BST)، بس بدل ما كانت بتبحث في بُعد واحد (1D)، بقت بتبحث في عدد من الأبعاد (-dimensional).
  • النود في الـ K-D Tree مش بتشيل قيمة واحدة، دي بتشيل (مجموعة قيم مع بعضها = Vector)، بالإضافة لـ (الأسهم = Pointers) اللي بتوديك للخطوة اللي بعدها في الشجرة.
image

4.3) K-D Tree Operations

  • 1. عملية الإدخال (Insert):

    • إنت بتدخل عنصر ليه بُعدين (Vector حجمه 2، زي [X, Y]).
    • دايماً العنصر الجديد بينزل في آخر الشجرة كـ ورقة (Leaf).
    • الفكره هنا: المقارنة بتتغير حسب المستوى. يعني وإنت نازل في الشجرة، بتسأل نفسك: "أنا في مستوى كام؟ لو 0 هقارن الـ X، لو 1 هقارن الـ Y"، وهكذا بالتبادل.
  • 2. عملية البحث في نطاق مستطيل (Orthogonal Range Query):

  • عشان تبحث عن بيانات جوه منطقة محددة، إنت بتدي للكمبيوتر حدود "صندوق" يبحث جواه:

    • البُعد الأول key[0] (زي محور X): بتديله حد أدنى low[0] وحد أقصى high[0].
    • البُعد التاني key[1] (زي محور Y): بتديله حد أدنى low[1] وحد أقصى high[1]. الكمبيوتر بيمشي في الشجرة ويجيبلك بس النقط اللي واقعة جوه الصندوق ده.
  • الحالات الخاصة للبحث

  • الصندوق ده مش دايماً لازم يكون مستطيل، ده ممكن يتغير حسب إنت بتبحث عن إيه بالظبط، وعندنا حالتين:

  • الحالة الأولى: التطابق التام (Exact match)

    • القاعدة: low[level] = high[level] (يعني الحد الأدنى بيساوي الأقصى في كل الأبعاد).
    • الشرح: لو إنت قولت للكمبيوتر دورلي في الـ X من النقطة 5 للنقطة 5، وفي الـ Y من 10 لـ 10.. كده المستطيل انكمش وبقى عبارة عن نقطة واحدة بس.
    • الخلاصة: إنت هنا مش بتبحث في مساحة، إنت بتبحث عن إحداثيات "نقطة محددة بالظبط" عشان تتأكد هي موجودة في الداتا بيز ولا لأ.
  • الحالة التانية: التطابق الجزئي (Partial match)

    • القاعدة: بتحدد النطاق لبعض المحاور، والمحاور التانية بتعتبرها واخدة من (من سالب ما لا نهاية لموجب ما لا نهاية).
    • الشرح: افرض إنك بتبحث بشرط واحد بس، زي "هاتلي كل الموظفين اللي سنهم من 20 لـ 30 سنة" ومش مهتم بالمرتب (محور Y).
image
  • القاعده الي بنمشي عليها:

    • المستوى 0 (الروت): بنقارن بمحور X. (لو أصغر تروح شمال، لو أكبر تروح يمين).
    • المستوى 1: بنقارن بمحور Y. (لو أصغر تنزل شمال، لو أكبر تنزل يمين).
    • المستوى 2: نرجع نقارن بـ X.
    • المستوى 3: نرجع نقارن بـ Y.. وهكذا.
  • تعالى نمشي مع الأرقام واحدة واحدة ونشوف اترصت في الشجرة إزاي:

    • 1. النقطة (A = 65, 50): أول نقطة دخلت، فبقت هي الـ Root.
    • 2. النقطة (B = 60, 70):
      • نقف عند A (مستوى 0 يعني نقارن X): الـ X بتاعت B بـ (60) أصغر من الـ X بتاعت A الي بـ (65).
      • النتيجة: B تروح شمال A.
    • 3. النقطة (C = 70, 60):
      • نقف عند A (مستوى 0 نقارن X): الـ X بتاعت Cبـ (70) أكبر من 65.
      • النتيجة: C تروح يمين A.
    • 4. النقطة (D = 75, 25):
      • نقف عند A (نقارن X): 75 أكبر من 65 ⬅️ نروح يمين عند C.
      • نقف عند C (مستوى 1 يعني نقارن Y): الـ Y بتاعت D بـ (25) أصغر من الـ Y بتاعت C بـ (60).
      • النتيجة: D تنزل شمال C.
    • 5. النقطة (E = 50, 90):
      • نقف عند A (نقارن X): 50 أصغر من 65 ⬅️ نروح شمال عند B.
      • نقف عند B (مستوى 1 نقارن Y): الـ Y بتاعت E بـ (90) أكبر من الـ Y بتاعت B بـ (70).
      • النتيجة: E تنزل يمين B.
Tip
  • لو التري 3d (فيها تلات قيم X,Y,Z ) يبقي هنعمل نفس الحاجة بس نزود Z:
    • المستوى 0 (الروت): بنقارن بمحور X. (لو أصغر شمال، لو أكبر يمين).
    • المستوى 1: بنقارن بمحور Y.
    • المستوى 2: بنقارن بمحور Z.
    • المستوى 3: نرجع نعيد الدورة ونقارن بـ X.
    • المستوى 4: نرجع نقارن بـ Y.. وهكذا.

4.4) K-D Tree Insertion Code (Java)


6) Final Quick Revision

ملخص
  • هياكل البيانات المكانية بتتقسم حسب نوع البيانات: Point Data (K-D Tree, PR Quadtree, Grid Files), Line Data (Arc-Node, Chain Codes), Area Data (Boundary Model, Region Quadtree).
  • ا R-Tree = Dynamic Index Structure للبيانات المكانية (2D/3D). حلّ محل الـ B+ Tree اللي مش مناسب للأبعاد المتعددة.
    • ا Properties: Height Balanced, Internal Nodes + Leaf Nodes, Leaves بتشاور على Disk Pages، كل Leaf Record = MBR، Max Capacity = M (min M/2)، Completely Dynamic، Root لازم يبقى ليه ابنين على الأقل.
      Structure: Internal Nodes = (Rectangle + Child pointer). Leaf Nodes = (MBR + Tuple-identifier للـ Data).
    • ا Operations: ا Insert, Delete, Update