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.
- ا Point Data: بيتم تخزينها بطرق زي
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: دي بتمثل "الفولدرات الكبيرة والمتوسطة" اللي في الشجرة، ومفيهاش بيانات حقيقية، وظيفتها بس توجهك. وكل عقدة فيها بتتكون من حاجتين:
- المستطيل (N dimensional rectangle): ده مستطيل وهمي كبير بيترسم عشان يحوط مجموعة من المستطيلات الأصغر منه (ممكن يكون 2D على خريطة عادية، أو 3D لو الخريطة مجسمة).
- المؤشر (Child pointer): ده السهم أو "العنوان" اللي بيشاور على المستطيلات الأصغر (الأبناء) اللي موجودين جوه المستطيل الكبير ده.
-
ا Leaf Nodes: دي "نهاية فروع الشجرة"، ودي اللي بتوصلك للبيانات الحقيقية. وبرضه بتتكون من حاجتين:
- أصغر مستطيل محيط (MBR - Minimum Bounding Rectangle): ده المستطيل اللي بيترسم حوالين الشكل الحقيقي بالظبط على الخريطة (زي مبنى أو بحيرة) عشان يحجمه بأقل مساحة ممكنة من غير أي فراغات ملهاش لازمة.
- مؤشر البيانات (Tuple-identifier): ده السهم الأخير اللي بياخدك من إيدك ويوديك للـ "Hard Disk" (أو قاعدة البيانات) عشان تقرا البيانات الفعلية بتاعت الشكل ده (زي اسمه، نوعه، مساحته، إلخ).

- الأشكال الي متلونه ازرق (المستطيلات الصغيرة والنقط) اللي تحت دي البيانات الحقيقية بتاعتنا (مثلاً: بيوت، بحيرات، شوارع).
- كل مجموعة أشكال زرقا قريبة من بعض حوطناهم بـ مستطيل رفيع على قدهم بالظبط (زي المستطيلات
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) اللي بتوديك للخطوة اللي بعدها في الشجرة.

4.3) K-D Tree Operations
-
1. عملية الإدخال (Insert):
- إنت بتدخل عنصر ليه بُعدين (Vector حجمه 2، زي
[X, Y]). - دايماً العنصر الجديد بينزل في آخر الشجرة كـ ورقة (Leaf).
- الفكره هنا: المقارنة بتتغير حسب المستوى. يعني وإنت نازل في الشجرة، بتسأل نفسك: "أنا في مستوى كام؟ لو 0 هقارن الـ X، لو 1 هقارن الـ Y"، وهكذا بالتبادل.
- إنت بتدخل عنصر ليه بُعدين (Vector حجمه 2، زي
-
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).
- القاعدة: بتحدد النطاق لبعض المحاور، والمحاور التانية بتعتبرها واخدة من

-
القاعده الي بنمشي عليها:
- المستوى 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.
- لو التري 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
- ا Properties: Height Balanced, Internal Nodes + Leaf Nodes, Leaves بتشاور على Disk Pages، كل Leaf Record = MBR، Max Capacity = M (min M/2)، Completely Dynamic، Root لازم يبقى ليه ابنين على الأقل.