Skip to main content

خرائط OsmAnd الثنائية - .obf

مقدمة

تحدث عن *.travel.obf, *.wiki.obf, *.roads.obf, ..

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

توجد بيانات خرائط OsmAnd غير المتصلة بالإنترنت في ملفات "obf". تتميز ملفات "obf" بهيكل معقد ويمكن أن تتكون من أجزاء عديدة. يوصى بشدة بالحفاظ على أحجام الملفات أقل من 2 جيجابايت. حاليًا، يمكن أن تحتوي ملفات obf على أجزاء عديدة تتكون من أجزاء متعددة من نقاط الاهتمام (POI)، وأجزاء متعددة من بيانات التوجيه، وأجزاء متعددة من الخرائط، وأجزاء متعددة من النقل، وأجزاء متعددة من بيانات العناوين. يمكن تمديد هذه القائمة في المستقبل. لدمج أو تقسيم أو حذف بعض الأجزاء من ملف obf، استخدم أداة وحدة التحكم "binary_inspector" المتوفرة مع OsmAndMapCreator.

  • نقاط الاهتمام (POI)، جزء النقل
  • جزء الخريطة
  • جزء العنوان

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

ج: جميع الأماكن المرئية في OsmAnd كمدن مأخوذة من العقد التي تحمل العلامة "place" https://wiki.openstreetmap.org/wiki/Place. حاليًا، تُستخدم المدن، والبلدات، والضواحي، والقرى، والتجمعات السكانية الصغيرة.

س: كيف يتعامل منشئ الخرائط مع مضلع منطقة يُعطى عبر علاقة ذات حدود إدارية؟ كيف تربط مكانًا مُعطى كعقدة بحدوده عندما يكون موجودًا في بيانات OSM؟

ج: ببساطة: يعمل حاليًا بالاسم. يحاول منشئ الخرائط زيارة جميع الحدود وإنشاء حدود مغلقة (!) من العلاقة أو من طرق منفصلة ويربطها باسم واحد فقط. بعد ذلك، يحاول مطابقة المكان مع اسم الحدود باستخدام خوارزمية يحتوي على. هناك أيضًا فحص إضافي إذا كانت هذه الحدود تحتوي على المكان. إذا كان هناك العديد من الحدود ذات المستويات الإدارية المختلفة بنفس الاسم (تحتوي على بعضها البعض مثل المنطقة/البلدة/المنطقة التي تحمل نفس الاسم)، فسيتم اختيار أعلى مستوى إداري مطابق تمامًا. ملاحظة: يجب أن تكون هناك المزيد من التفاصيل هنا (حول أحياء المدينة...).

س: أين توجد الوثائق التي تصف مستوى الإدارة الصحيح لبناء ارتباط بعقدة مكان معينة؟ ما هي البلدان التي تفضل أي مستوى إداري؟

ج: حاليًا، لا يُستخدم الارتباط بين علاقة المستوى الإداري ومركز الإدارة. لأن عددًا قليلاً فقط من العلاقات توفر هذه المعلومات.

س: كيف يعرف MapCreator أي شارع ينتمي إلى أي مكان؟ هل هناك حالات مختلفة عندما يتم إعطاء مضلع حدودي وعندما لا يوجد؟

ج: هناك العديد من الاستراتيجيات للتحقق ويتم ترتيبها حسب الأولوية بالترتيب التالي:

  • الأهم هي الأماكن وحدودها. لكي تعمل خوارزمية إدارة الشوارع بشكل صحيح، يجب أن تكون حدود مطابقة الأماكن صحيحة. إذا كان الشارع ينتمي إلى العديد من الحدود، فسيتم تسجيله في جميع الأماكن المناسبة.
  • علامة is_in (تم إهمالها). لذا إذا كان الشارع يحتوي على علامة is_in، فسيتم تحليله وتقسيمه بفاصلة وسيتم ربط الشارع بجميع المدن ذات الصلة (بواسطة مطابقة الاسم الدقيقة). (للتحقق: فحص أساسي للشارع في نطاق المدينة؟)
  • إذا كان الشارع لا ينتمي إلى أي حدود (قد تكون الحدود غير المغلقة بشكل صحيح مشكلة هنا)، فإنه يحاول العثور على أقرب/أكبر مدينة وتسجيل الشارع في تلك المدينة (أحيانًا يسجل في بلدة على بعد 1 كم ويفتقد أقرب قرية صغيرة على بعد 100 متر فقط).

الجزء الأخير غير دقيق للغاية. ولهذا السبب يتم ربط العديد من الشوارع بمدينة مجاورة.

في تفضيلات MapCreator لديك خمسة إعدادات أخرى للواحق الشوارع، والتكبير، والنعومة، والعرض... ما هي التأثيرات التفصيلية التي يمكنك تحقيقها مع كل منها؟ هل تُستخدم هذه الإعدادات بالفعل؟

الأدوات

  • يمكن لـ OsmAndMapCreator عرض الشوارع المرتبطة بأي مدينة (قائمة السياق -> إظهار العنوان). يجب أن تكون ملفات obf المحلية موجودة ومكونة في الإعدادات.
  • يمكن لأداة فحص الثنائيات إظهار قائمة بالشوارع لكل مدينة. قم بتشغيل الأداة بدون معلمات لرؤية المعلمات الممكنة.
  • حاليًا، تحتوي جميع ملفات الفهرس على gen.log. عند عرض ملف السجل، يمكنك العثور على أخطاء في عملية إنشاء الخريطة وهذا يمكن أن يعطي إجابة لماذا بعض الشوارع ليست في مكان فهرس العنوان الصحيح.

جزء العنوان - سير العمل

توجد هذه العلاقات:

المدينة -> 0..1 حدود

الحدود -> 0..** مدينة (تُستخدم لتحديد ضاحية المدينة)

تكرار جميع عقد Osm وتسجيلها كمدن إذا كانت العلامة = PLACE موجودة:

  • استخراج المدن (بلدة، مدينة).
  • استخراج القرى (أي شيء آخر).

تكرار جميع العلاقات والطرق ذات النوع = حدود وتسجيل جميع الحدود:

  • الحدود تسمى كيانًا (طريق أو علاقة) بعلامة 'boundary=administrative' أو بعلامة 'place=...'.
  • يجب أن يكون مستوى الإدارة للحدود > 4 أو لا يحتوي على مستوى إدارة.
  • لا ترتبط الحدود دائمًا بمدينة (أو ولاية، ...).
  • يمكن أن تحتوي الحدود على 'admin_center'، عضو 'label' يشير إلى عقدة مدينة.
  • تتطابق الحدود تمامًا بالاسم مع عقدة المدينة وتقع عقدة المدينة داخل الحدود.
  • تتطابق الحدود بداية، نهاية أو جزء فرعي بالاسم مع عقدة المدينة وتقع عقدة المدينة داخل الحدود.

يمكن ربط العديد من الحدود بمدينة واحدة. فيما يلي الترتيب الذي يتم به أخذ الحدود الأكثر أهمية وربطها بالمدينة:

  • تتطابق الحدود بالاسم تمامًا وتحتوي على علامة المكان.
  • تتطابق الحدود بالاسم تمامًا وتحتوي على مستوى إداري 8 > 7 > 6 > 9 > 10 > 5... أو لا شيء.
  • تتطابق الحدود بمعرف الإدارة.
  • جميع الحالات الأخرى بما في ذلك ترتيب مستوى الإدارة.

إذا لم يكن للمدينة أي حدود مخصصة، فسيتم فحص جميع الحدود التي لا تحتوي على مراكز مدن وتحتوي على تلك المدينة، وسيتم تعيين الحدود ذات المستوى الإداري >=7.

لكل حدود، قم بإنشاء قائمة بالمدن الموجودة بداخلها.

تكرار جميع العلاقات والعثور على العناوين (Postal_Addresses):

علاقة بعلامة "address" نوع، وهي "house" أو "a6" نوع العنوان.

البحث عن علاقة الشارع المرتبطة وأعضاء المنزل.

محاولة العثور على المدينة للشارع والمدينة لعنوان المنزل.

البحث عن المدن (يجب أن نكون قد وجدناها بالفعل في الخطوات السابقة!).

إذا كان لدينا مدينة وشارع، قم بتسجيله في قاعدة البيانات:

لتسجيل الشارع، انظر: تسجيل الشارع لمدينة

إذا تم تسجيل الشارع، ونحن نعالج الشارع:

تكرار جميع أعضاء العلاقة:

  • العثور على الشارع -> كتابة عقد الشارع إلى قاعدة البيانات
  • العثور على المنزل -> كتابة المنزل إلى الشارع

إذا تم تسجيل الشارع، ونحن نعالج المنزل:

  • العثور على رقم المنزل
  • العثور على حدود المنزل: إذا وجدت، تخزين: مبنى للشارع

تسجيل الشارع (الشارع، موقع الشارع (los)، المدن):

ملاحظة: قد نسجل شارعًا لعدة مدن = هذا يعني أن الشارع يمكن أن يكون في مناطق متداخلة، ضاحية، مدينة، قرية صغيرة، إلخ... لكل منطقة، نريد تسجيل الشارع الذي يقع فيه.

لكل مدينة:

البحث عن تسجيل شارع موجود داخل المدينة:

إذا كان الشارع موجودًا:

  • إذا كان جزء المدينة غير معروف -> تحديث جزء المدينة للشارع الموجود
  • حاول العثور على جزء المدينة لشارعنا، وابحث عن الشارع مرة أخرى

إذا لم يكن الشارع موجودًا: (قد يتغير بعد البحث)

  • تسجيل الشارع للمدينة، جزء المدينة، الموقع، واسم الشارع

findOrRegister street

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

تكرار جميع العقد، ثم الطرق، ثم العلاقات (تكرار الكيان الرئيسي)

العثور على الطرق - الاستيفاء:

  • لكل استيفاء، ابحث عن أو سجل شارعًا بموقع الاستيفاء
  • لكل عقدتين، قم بإنشاء مبنى يمثل الاستيفاء

لأي كيان، ابحث عن addr:housenumber و addr:street (يمكن أن يكون أيضًا استيفاء للعقد مرة أخرى!!!):

  • تجاوز إذا كان المبنى لهذا الكيان موجودًا بالفعل!
  • ابحث عن أو سجل الشوارع للشارع
  • ابحث عن رقم المنزل
  • إذا كان رقم المنزل يحتوي على '-'، حاول إنشاء رقم منزل مستوفى (latlon2 مفقود؟)
  • إذا كان رقم المنزل يحتوي على '/'، حاول البحث عن شارع ثانٍ addr:street2 --> يبدو فقط لـ RU osm:
  • هناك المزيد من الاختلافات لهذا: adr:housenumber2، addr2:street، addr2:housenumber إلخ...
  • لكل شارع، قم بتخزين المنزل الموجود

للطريق الذي يحتوي على علامة - اسم وعلامة - طريق سريع، ولكن بدون addr:housenumber و addr:street:

  • ملاحظة: قد تكون هذه طرقًا للسيارات، بأسماء (طريق سريع، أو ما شابه)
  • تجاوز إذا كان هذا الشارع موجودًا بالفعل
  • ابحث عن أو سجل الشارع للمدينة
  • اكتب العقد لكل شارع تم العثور عليه في كل مدينة

كل علاقة تحتوي على "postal_code"، قم بتخزينها للاستخدام لاحقًا.

ملاحظة: هذا لا يشمل address:type = pc و addr:postalcode

معالجة الرموز البريدية:

  • لكل علاقة رمز بريدي مخزنة
  • لكل عضو مبنى، قم بتحديث الرمز البريدي

كتابة الفهرس:

تقسيم المدن إلى: مدن + بلدات، ضواحي (ضاحية مع علامة is_in)، قرى (ليست مدينة أو بلدة)

كتابة المدن + البلدات باستخدام الضواحي

قراءة الشارع من المدن + البلدات + الضواحي المناسبة لكل بلدة

  • هنا، قد يكون هناك المزيد من الشوارع بنفس الاسم لمدينة واحدة، في هذه الحالة نحاول العثور على جزء مدينة للشارع (ضاحية)، حيث يقع الشارع. يجب ألا يكون هناك المزيد من الشوارع بنفس الاسم داخل جزء مدينة واحد!

لكل شارع

  • لكل مبنى، سجل/أنشئ/ابحث عن الرمز البريدي، سجل الشارع

كتابة القرى

  • مثل البلدات...

كتابة الرموز البريدية المستخرجة وشوارعها