DivideTiles - معالجة التقسيم
نظرة عامة
تُستخدم واجهة DivideTiles لتقسيم المشاهد إلى بلاطات قبل إعادة البناء. تدعم هذه الواجهة طرق التقسيم ثنائي الأبعاد المنتظم وثلاثي الأبعاد المنتظم والتكيفي القائم على الذاكرة، وهي مناسبة لمعالجة مجموعات البيانات واسعة النطاق.
حالات الاستخدام
- مجموعات البيانات فائقة الحجم (آلاف الصور)
- بيئات المعالجة محدودة الذاكرة
- المشاريع التي تتطلب معالجة متوازية
- سيناريوهات الحوسبة الموزعة
كيف يعمل
استدعاء الواجهة
استدعاء سطر الأوامر
# الطريقة الأولى: من خلال المحرك الرئيسي
reconstruct_full_engine.exe -reconstruct_type 4 -task_json divide_config.json
# الطريقة الثانية: محرك التقسيم المستقل
divide_engine.exe divide_config.json
وصف المعاملات
reconstruct_type
: ثابت كـ4
(يشير إلى DivideTiles)task_json
: مسار ملف التكوين
معاملات التكوين
المعاملات المطلوبة
المعامل | النوع | الوصف |
---|---|---|
working_dir | string | دليل العمل (يجب أن يحتوي على نتائج AT) |
gdal_folder | string | مسار بيانات GDAL |
resolution_level | int | دقة إعادة البناء (1=عالي، 2=متوسط، 3=منخفض) |
divide_parameters | JSON | معاملات التقسيم |
roi_for_3d | JSON | ROI لإعادة البناء ثلاثي الأبعاد |
المعاملات الاختيارية
المعامل | النوع | الافتراضي | الوصف |
---|---|---|---|
roi_coordinate_system | JSON | WGS84 | نظام إحداثيات ROI |
معاملات التقسيم (divide_parameters)
المعامل | النوع | الافتراضي | الوصف |
---|---|---|---|
divide_mode | int | - | وضع التقسيم: 0=شبكة ثنائية الأبعاد، 1=شبكة ثلاثية الأبعاد، 2=تكيفي للذاكرة |
tile_size | double | - | حجم الشبكة (مطلوب للوضع 0/1) |
target_memory | double | 0 | حد الذاكرة المستهدف (GB) |
reconstruct_whole_tile | bool | false | ما إذا كان سيتم إعادة بناء البلاطات الكاملة (بدون قطع الحدود) |
tile_system | JSON | نظام إحداثيات AT | نظام إحداثيات التقسيم |
شرح أوضاع التقسيم
1. الشبكة المنتظمة ثنائية الأبعاد (divide_mode = 0)
مناسبة للمناطق ذات التنوع التضاريسي القليل:
{
"divide_mode": 0,
"tile_size": 500.0, // شبكة 500م × 500م
"tile_system": {
"type": 3,
"epsg_code": 32650 // نظام إحداثيات الإسقاط UTM
}
}
2. الشبكة المنتظمة ثلاثية الأبعاد (divide_mode = 1)
مناسبة للمناطق ذات التغيرات الارتفاعية الكبيرة:
{
"divide_mode": 1,
"tile_size": 300.0, // مكعب 300م × 300م × 300م
"tile_system": {
"type": 1 // نظام إحداثيات محلي
}
}
3. التقسيم التكيفي للذاكرة (divide_mode = 2)
يقسم تلقائياً بناءً على حدود الذاكرة:
{
"divide_mode": 2,
"target_memory": 16.0, // حد أقصى 16GB ذاكرة لكل بلاطة
"reconstruct_whole_tile": false
}
أمثلة التكوين الكاملة
تقسيم ثنائي الأبعاد لمشهد بحجم المدينة
{
"working_dir": "C:/Projects/CityScale",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 0,
"tile_size": 1000.0, // شبكة 1كم
"tile_system": {
"type": 3,
"epsg_code": 32650
},
"reconstruct_whole_tile": true
},
"roi_for_3d": {
"boundary": [
[500000, 2500000],
[510000, 2500000],
[510000, 2510000],
[500000, 2510000]
],
"min_z": 0,
"max_z": 500
},
"roi_coordinate_system": {
"type": 3,
"epsg_code": 32650
}
}
تقسيم ثلاثي الأبعاد للتضاريس الجبلية
{
"working_dir": "C:/Projects/Mountain",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 1,
"tile_size": 500.0, // مكعب 500م
"tile_system": {
"type": 0, // LocalENU
"origin_point": [114.123, 22.123, 100.0]
}
},
"roi_for_3d": {
"boundary": [...],
"min_z": 100,
"max_z": 2000 // اختلاف ارتفاع كبير
}
}
بيئة محدودة الذاكرة
{
"working_dir": "C:/Projects/LimitedMemory",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 2,
"target_memory": 8.0, // فقط 8GB ذاكرة متاحة
"reconstruct_whole_tile": false
},
"roi_for_3d": {
"boundary": [...]
}
}
نتائج الإخراج
بنية ملف tiles.json
ملف tiles.json
المُنتج بعد التقسيم:
{
"tiles": [
{
"name": "tile_0_0",
"empty": false,
"max_memory": 12.5, // GB
"roi": {
"boundary": [...],
"min_z": 100,
"max_z": 200
}
},
{
"name": "tile_0_1",
"empty": false,
"max_memory": 15.3,
"roi": {...}
}
],
"divide_mode": 0,
"tile_system": {...},
"tile_grid": { // معلومات الشبكة (الوضع 0/1)
"origin": [500000, 2500000],
"rows": 10,
"cols": 10
},
"tile_size": 1000.0
}
استخدام نتائج التقسيم
سيقرأ Reconstruct3D تلقائياً tiles.json
ويؤدي إعادة البناء المقسم:
{
"license_id": 9200,
"working_dir": "C:/Projects/CityScale", // يحتوي على tiles.json
// ... معاملات Reconstruct3D الأخرى
}
اختيار استراتيجية التقسيم
مقارنة أنواع المشاهد
نوع المشهد | الوضع الموصى به | اقتراح حجم الشبكة | الوصف |
---|---|---|---|
مدينة مسطحة | شبكة ثنائية الأبعاد | 500-2000م | تضاريس مسطحة، تغيرات ارتفاع صغيرة |
تضاريس جبلية | شبكة ثلاثية الأبعاد | 300-1000م | اختلافات ارتفاع كبيرة، يتطلب طبقات عمودية |
مشهد مختلط | تكيفي للذاكرة | - | تحسين مخطط التقسيم تلقائياً |
هندسة خطية | شبكة ثنائية الأبعاد | مخصص | تعيين شرائط مطولة على طول اتجاه المسار |
تقدير الذاكرة
متطلب الذاكرة لكل بلاطة ≈ (الصور في البلاطة × دقة الصورة × 3) / نسبة الضغط
القيم المرجعية:
- 100 صورة 20MP ≈ 8-12 GB
- 200 صورة 20MP ≈ 16-24 GB
المعالجة المتوازية
التوازي المحلي
import subprocess
import json
import concurrent.futures
# قراءة نتائج التقسيم
with open("tiles.json", "r") as f:
tiles_info = json.load(f)
def process_tile(tile):
if tile["empty"]:
return
config = {
"license_id": 9200,
"working_dir": f"./output/{tile['name']}",
"tile_name": tile["name"],
# ... معاملات أخرى
}
with open(f"{tile['name']}.json", "w") as f:
json.dump(config, f)
subprocess.run([
"reconstruct_full_engine.exe",
"-reconstruct_type", "2",
"-task_json", f"{tile['name']}.json"
])
# المعالجة المتوازية
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
executor.map(process_tile, tiles_info["tiles"])
المعالجة الموزعة
يمكن توزيع نتائج التقسيم على عدة أجهزة للمعالجة:
- العقدة الرئيسية تؤدي التقسيم
- توزيع tiles.json والبيانات
- كل عقدة تعتني بشكل مستقل بالبلاطات المخصصة لها
- تجميع النتائج
أفضل الممارسات
1. اختيار حجم البلاطة
- ذاكرة كافية: استخدم بلاطات أكبر لتقليل تأثيرات الحدود
- ذاكرة محدودة: استخدم بلاطات أصغر لضمان الاستقرار
- معالجة متوازية: وازن بين عدد البلاطات ووقت المعالجة لكل بلاطة
2. التعامل مع منطقة التداخل
{
"reconstruct_whole_tile": true, // إنتاج بلاطات كاملة
// دمج مناطق التداخل في المعالجة اللاحقة
}
3. اختيار نظام الإحداثيات
- التقسيم ثنائي الأبعاد: استخدم نظام إحداثيات مُسقط (وحدات مترية)
- التقسيم ثلاثي الأبعاد: محلي أو LocalENU
- تجنب التقسيم ثلاثي الأبعاد في أنظمة الإحداثيات الجغرافية
4. تحسين ROI
{
"roi_for_3d": {
"boundary": [
// استخدم Smart ROI المُنتج من AT
// مد الحدود بشكل صحيح لتجنب القطع
]
}
}
تحسين الأداء
1. تقدير وقت المعالجة
الوقت الإجمالي = وقت التقسيم + max(وقت المعالجة لكل بلاطة) + وقت الدمج
2. توازن الحمولة
- فحص توزيع
max_memory
- تعديل المعاملات لتوازن الحمولة عبر البلاطات
- النظر في تخصيص المهام الديناميكي
3. تحسين التخزين
- استخدم SSD لدليل العمل
- وزع نتائج البلاطات عبر عدة أقراص
- احجز مساحة مؤقتة كافية
المشكلات الشائعة
س: فجوات في حدود البلاطات بعد التقسيم؟
ج:
- تعيين
reconstruct_whole_tile: true
- زيادة التداخل بين البلاطات (بتوسيع ROI)
- تحسين الدمج في المعالجة اللاحقة
س: فشل بعض البلاطات في المعالجة؟
ج:
- فحص ما إذا كانت
max_memory
للبلاطة تتجاوز الحدود - مراجعة توزيع الصور في بلاطات محددة
- النظر في إعادة التقسيم أو تعديل المعاملات
س: بلاطات كثيرة جداً؟
ج:
- زيادة
tile_size
أوtarget_memory
- استخدام وضع تقسيم مختلف
- النظر في استراتيجية معالجة هرمية
التطبيقات المتقدمة
مخططات التقسيم المخصصة
بناءً على tiles.json، يمكنك:
- تعديل حدود البلاطات يدوياً
- دمج البلاطات الصغيرة
- تقسيم البلاطات الكبيرة
- تعيين الأولويات
التحديثات التدريجية
# معالجة المناطق المتغيرة فقط
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)
الخطوات التالية
- تعلم عن Reconstruct3D لإعادة البناء المقسم
- راجع المفاهيم الأساسية لمزيد من تقنيات المعالجة
نصيحة: الاستراتيجية الصحيحة للتقسيم هي مفتاح معالجة البيانات واسعة النطاق. يُوصى بالاختبار مع بيانات صغيرة أولاً لإيجاد المعاملات المثلى قبل معالجة مجموعات البيانات الكاملة.