هياكل التقاطعات
هياكل التقاطعات
تُعيد خطوط المركز الكاملة وغير المقطوعة للجسور والأنفاق قرب نقطة معيّنة. هذا ما يشغّل عرض التقاطع ثلاثي الأبعاد في Navvo أثناء الملاحة منعطفًا بمنعطف — جسور علوية مرتفعة على دعامات، وفتحات أنفاق غائرة — لكنه مفيد لأي تطبيق يحتاج هندسة فصل المستويات لمنطقة صغيرة.
النطاق المطلوب: geo
معاينة التقاطع ثلاثي الأبعاد
افتح معاينة التقاطع لاستعراض جسر أو نفق. تتكيّف المعاينة مع شاشات الحاسوب والهاتف، وتوفّر خيارَي Overview للعرض العام وDrive لتتبّع مسار القيادة.
يستخدم المشهد إضاءة متوافقة مع محوره الرأسي، وتظليلًا يميّز الأسطح العلوية عن الجدران، وحواجز جسور مرتفعة، وظلالًا أنعم تتبع انحناءات سطح الجسر. ويُبقي لون المسار الأوضح خط القيادة ظاهرًا فوق الطرق. يتبع العرض العام الآن الاتجاه المختار بزاوية مائلة، وتُسهّل فواصل جدران النفق وشريطا الإضاءة في سقفه تقدير العمق. عند تفعيل prefers-reduced-motion تبقى أسهم المسار ساكنة.
للمعاينة حالات منفصلة للتحميل، وعدم توفّر الهندسة، وأخطاء الطلب. عند التكامل، تعني available: false تعذّر الحصول على الهندسة؛ وهي لا تثبت عدم وجود جسر أو نفق في الموقع. أما الاستجابة الناجحة التي تحمل available: true ومصفوفات منشآت فارغة فتعني أن الطلب لم يُرجع منشآت مطابقة. اعرض حالة تتيح إعادة المحاولة إذا تعذّر تحميل هندسة المعاينة المستقلة، وأبقِ الملاحة العادية قابلة للاستخدام.
GET /junction/structures
تُعيد كل جسر ونفق ضمن مسافة radius بالأمتار من lat,lng.
معاملات الاستعلام
320، محصور بين 80–800.curl -s "https://navvo.io/api/v1/junction/structures?lat=31.98382&lng=35.89252&radius=320" \
-H "x-api-key: nvvo_YOUR_KEY"
الاستجابة
{
"source": "navvo-junction",
"available": true,
"bridges": [
{
"id": 150918346,
"kind": "bridge",
"roadClass": "secondary",
"layer": 1,
"name": "شارع الشهيد وصفي التل",
"names": { "en": "Wasfi Al-Tall Street", "ar": "شارع الشهيد وصفي التل" },
"oneway": true,
"lanes": 2,
"coordinates": [[35.8923719, 31.9831129], [35.892758, 31.9829988], "…"]
}
],
"tunnels": []
}
| الحقل | النوع | الوصف |
|---|---|---|
source | string | دائمًا navvo-junction. |
available | boolean | تكون false عند عدم توفّر الهندسة مؤقتًا. وتختلف هذه الحالة عن استجابة ناجحة بمصفوفات فارغة؛ على التطبيقات التعامل معها بسلاسة. |
bridges / tunnels | array | الهياكل من كل نوع قرب النقطة. |
buildings | array | بصمات المباني ضمن ~360 مترًا من النقطة، الأقرب أولًا، بحدّ أقصى 900. كتلة سياقية لعرض تقاطع ثلاثي الأبعاد — تكفي لوضع المناورة كاملةً داخل حيّها بدل أرض فارغة. |
…buildings[].height | number | بالأمتار. من height في OSM، وإلا building:levels × 3.2، وإلا قيمة افتراضية حسب الصنف (منزل 5، شقق 14، تجاري 12، وغير ذلك 9) — فمعظم المباني بلا وسم ارتفاع أصلًا. |
…buildings[].coordinates | array | حلقة [lng, lat] مغلقة. قد تتقاطع ذاتيًا في بيانات OSM الخام — احمِ عملية البثق. |
…[].id | number | معرّف مسار بيانات خرائط Navvo. |
…[].kind | string | bridge أو tunnel. |
…[].roadClass | string | صنف highway في OSM (motorway، trunk، primary، secondary، …) — استخدمه لاشتقاق عرض الطريق. |
…[].layer | number | الترتيب الرأسي (layer في OSM): >0 فوق الأرض، <0 تحتها. |
…[].name | string | null | اسم الشارع إن وُجد. |
…[].names | object | الأسماء الموسومة بلغاتها من name:<code> — en وar وfr وes وtr وde — لما هو موسوم منها. ارسم اللافتات والعناوين بلغة القارئ من هذا الحقل لا من name، فهو ما كتبه راسم الخرائط المحلي. |
…[].oneway | boolean | هل المسار باتجاه واحد (المسارات المزدوجة تصل كمسارين). |
…[].lanes | number | null | عدد الحارات إن وُسم. |
…[].coordinates | array | خط المركز الكامل [lng, lat] للهيكل (مسار واحد متصل). |
coordinates إلى عرض الطريق (من lanes أو roadClass) وارفعه إلى layer × ~5.5 م؛ ثم أنزل دعامات على طوله ودِعامة طرفية عند كل نهاية. وللـنفق، اقطع خط مسارك حيث يمر ضمن نصف عرض الطريق من coordinates النفق لكي يغوص المسار بوضوح داخل الفتحة ولا يُرسم تحت الأرض.- اجلب بيانات المحيط حول التقاطع نفسه، لا حول الإحداثي الذي بحثت به. يجد
lat,lngأقرب هيكل من النوع المطلوب، وقد يبعد مئات الأمتار — عند إحدى بوّابات عمّان بَعُد الهيكل 280 مترًا عن نقطة البحث، فصار أقرب سطح مسارب في البيانات على بعد 106 أمتار من كل ما يُرسم، وغابت الدوّارة التي يوشك السائق دخولها تمامًا. حدّد الهيكل أولًا ثم أعد جلبstructuresوstreetsحوله. - لا تدع طبقة أغنى تحلّ صامتةً محلّ طبقة أبسط لا تغطّي مكانها. يجب ألّا يحلّ سطح المسارب محلّ مخططات الطرق إلا حيث يصل فعلًا إلى المناورة، وإلا ظهرت البيانات الناقصة كأرض فارغة — أي عرض يعمل لكن لا يُظهر شيئًا، بدل خطأ واضح.
- حُدَّ ارتفاع المباني. المباني بمقياسها الحقيقي بينما يُبالَغ في فروق المناسيب، فقد يحجب برج مرتفع فعلًا موضوع العرض — غطّى مبنى بارتفاع 105 أمتار على بعد 118 مترًا ثلث المشهد.
- اشتقّ حجم الإطار من المناورة لا من كامل النافذة. احتساب ذيل الخروج ضخّم امتداد إحدى الحلقات من ~120 إلى 173 مترًا، فاتّسع الإطار إلى حدّه الأقصى وبقيت المناورة صغيرة وسط أرض فارغة.
- تحقّق من التكوين لا من مجرّد نجاح الرسم. قد يُبنى المشهد بلا أخطاء ويكون صورةً للمكان الخطأ؛ افحص خاصية قابلة للقياس (كوجود هندسة مسارب داخل التقاطع نفسه) وإلا اجتازت الفجوات الصامتة كل اختبارات "لقد رُسم".
- التفاصيل دون حجم البكسل ضجيج لا تفصيل. خطوط الحارات المرسومة بعرض بكسل واحد والمساحات المدهونة (الشرطات والأسهم ومثلثات الأفضلية) بمقاسها الأرضي الحقيقي تصبح ثلث بكسل حين يتّسع الإطار إلى ~350 مترًا، فتحوّل آلافُها كل طريق — وأي سطح جسر يحملها — إلى ضبابٍ مبقّع يبدو كخامة معطوبة. امنح الخطوط عرضًا حقيقيًا (~2.2 بكسل) وأسقِط المساحات المدهونة كليًا فوق عتبة أمتار/بكسل معيّنة.
- وينطبق ذلك على الهندسة المستوردة. وحدة سطح تحمل درابزينًا وأضلاعًا وحاجزًا، مرصوفة 35 مرة ومرئية شبه موازية للنظر، تتداخل في نقشٍ متصالب أسوأ من سطح بسيط. استخدم النموذج المفصّل حيث تظهر تفاصيله فقط.
- خذ الشكل من النموذج واللون** من لوحتك.** عرض التقاطع رسمٌ مسطّح لا مشهد واقعي؛ والخرسانة والإسفلت الفوتوغرافيان بمقياس التقاطع ضجيجٌ دقيق. استبدل خامات النموذج بلوحة ألوان الهندسة الإجرائية نفسها.
- اشتقّ حجم البوّابة من الطريق لا من ثابت. وضع نصفُ عرضٍ ثابت مقداره 16 مترًا قوسًا بعرض 32 مترًا فوق شارع عرضه 7 أمتار، فبدت البوّابة نصبًا لا فتحةً يدخلها الطريق. اشتقّها من عرض الطريق (~0.78×) بحدٍّ أدنى نحو 6 أمتار.
- لكن اجعل العتبة عند أضيق مقياس تبلغه الكاميرا لا عند أوسعه. هذه القاعدة تتعلّق بما يُرى، وتتحوّل صامتةً إلى قاعدة عمّا يُبنى بمجرّد أن تتحرّك الكاميرا. مع إطار ثابت واحد عند 0.64–0.90 متر/بكسل كانت العتبة تُسقط كل علامات الدهان والسطح المنمذج — بقياسٍ فعلي
paintTris: 0وdecks3d: 0— فلم يبقَ لعرضٍ يقترب لاحقًا ما يكشفه. اشتقّ أحجام الهندسة من أقرب لقطة، وأخفِ مجموعة التفاصيل حسب مسافة الكاميرا عند الرسم؛ فالهندسة التي لم تُبنَ أصلًا لا يمكن استرجاعها.
- المتطلّبان متتاليان لا متزامنان. محاولة تحقيقهما معًا تتأرجح: وسِّع الإطار فيصير الطريق خيطًا وتُكبَت كل العلامات تلقائيًا؛ وضيِّقه فيسقط نصف المناورة خارجه. قطِّع العرض إلى لقطات: تأسيسٌ واسع للتقاطع، ثم هبوطٌ على مسار الاقتراب، ثم عبورٌ للمناورة بمقياس الحارة، ثم استقرارٌ على المخرج.
- سِر على منحنى مُعامَل بطول القوس لا على الرؤوس الخام. ابنِ مسار الكاميرا من خط السير (المسار + إزاحة الحارة + الارتفاع المحلول) كمنحنى Catmull-Rom من نوع centripetal: في منحدر الحلقة ينعطف المسار على نفسه وتتكدّس الرؤوس عند القمة، وتتجاوز المعاملات المنتظمة أو الوتَرية إلى نتوءات هناك تحديدًا فتنحرف الكاميرا عن الطريق. ثم اجتَزْه بطول القوس؛ فمساحة المعامل تُسرع عبر رؤوس الطريق السريع المتباعدة وتزحف عبر رؤوس المنحدر المتقاربة، فيبدو ذلك تسارعًا وتباطؤًا بلا سبب.
- قيِّد معامل المنحنى بنفسك. الكاميرا المتتبِّعة تأخذ عيّنات خلف المركبة وأمامها، فتطلب مواضع خارج طرفَي المنحنى في أول إطار وآخره من لقطة العبور. وأخذ العيّنات في Catmull-Rom لا يقيّد المدخل: القيمة الخارجة عن المدى تتجاوز جدول أطوال القوس فتنتج NaN ثم تفهرس نقطة تحكّم غير معرّفة — فيرمي خطأً بدل أن يعيد قيمة غير ضارّة.
- استخدم منحنى سرعة شبه منحرف لا تنعيمًا واحدًا للقطة كلها. تنعيم العبور بأكمله يجعل منتصف المناورة أسرع أجزائها، وهو المكان الوحيد الذي يحتاج فيه السائق وقتًا للقراءة. تسارَعْ ثم اثبُتْ عبر التقاطع ثم تباطأْ.
- سلِّم كل لقطة عند الوضع الذي انتهت إليه السابقة فعلًا. دفعٌ بطيء في اللقطة التأسيسية تبدأ بعده اللقطة التالية من الوضع الأصلي يقذف الكاميرا إلى الخلف عند القطع — بدفعٍ مقداره 7% يساوي ذلك 12 مترًا عند مسافة 150 مترًا و28 مترًا عند 350.
- أبقِ العين فوق مستوى الأرض حتى حيث لا يكون المسار كذلك. في الحفر ينخفض الطريق نحو 8 أمتار تحت السطح؛ وعينٌ مثبّتة على الطريق تنتهي داخل التراب تنظر إلى الجدار الداخلي للحفرة. خذ أعلى الارتفاعات المحلية واجعل حدّها الأدنى مستوى الأرض، لتنظر الكاميرا إلى أسفل نحو مدخل النفق وتبقى البوّابة في الإطار.
- اجعل نصف قطر طلب سطح الحارات بحجم المسار لا بحجم الإطار. نصف القطر بحجم الإطار صحيح فقط ما دامت الكاميرا ساكنة؛ فحين تقطع مئات الأمتار يصبح كل ما تمرّ به قابلًا للرسم، وتترك حمولةٌ بحجم الإطار المسارَ يعبر أرضًا جرداء بلا إسفلت تحته.
- أبقِ الدورة الواحدة دون 12 ثانية. تضع إرشادات NHTSA لتشتّت انتباه السائق حدًّا مقبولًا لإجمالي زمن رفع العين عن الطريق قدره 12.0 ثانية، والحركة المتكرّرة بلا نهاية طبيعية تدفع السائق المنتظر «ليرى كل شيء» إلى دورةٍ كاملة. وأبقِ اللقطات المفردة قرب معيار النظرة الواحدة (2.0 ثانية) لتقع أي نظرة على مشهدٍ مكتمل مقروء.
- وفِّر صورة ساكنة. احترم
prefers-reduced-motionبتثبيت التحليق عند أكثر أوضاعه إفادةً بدل تعطيل العرض. ثبّت أسهم المسار أيضًا كي لا تبقى طبقة متحرّكة باستمرار في وضع تقليل الحركة. تثبيته عند بداية لقطة العبور يُبقيه قريبًا من التقاطع مع بقاء مسار الاقتراب في الإطار وكل تفاصيل الحارات ظاهرة — وهو أكثر إفادةً من اللقطة الواسعة التي يحلّ محلّها.
- الطريق ليس له ارتفاع واحد. أخذ متوسط ارتفاع واحد لكل طريق ورصف كل مضلّعاته عنده يحوّل اقتراب جسر يصعد من 0 إلى 13 مترًا إلى لوح مسطّح عند نحو 6.5 أمتار: يعلو عن الأرض في أسفله، ويعلو السطحُ عنه في أعلاه. خذ الارتفاع حيث يقع كل مضلّع فعلًا — بإسقاط الرأس على خط مركز الطريق واستيفائه — وأبقِ المسار السريع ذا الارتفاع الثابت للطرق المستوية فعلًا، حتى لا يدفع كلفةَ الصعود إلا ما يصعد.
- ولِّد الطريق المسلوك من المسار لا من الطريق المرسوم. كل سطح آخر مرتبط بارتفاع الطريق المحلول، بينما يحمل المسارُ منسوبه الخاص لكل رأس، وعلى أي منحدر يختلف الاثنان بحكم التصميم. الطريق المشتقّ من المسار لا يمكن أن يخالفه، ويضمن أن الطريق الذي يجب ألّا يغيب أبدًا — الذي يُقاد عليه — موجود دائمًا.
- لا تدع طبقةً أغنى تمحو طبقةً أبسط، ولا تقرّر ذلك لكل طريق على حدة. هندسة الحارات لا تُرصف متّصلة. ورسم الأشرطة فقط للطرق التي «يعجز» سطح الحارات عن تغطيتها، بحسب نسبة تغطية، لا يزيل الثقوب — فطريقٌ مغطّى 70% يُحسب مغطّى ولا يأخذ شيئًا، فيبقى الـ30% الباقي عاريًا. ارسم شبكة الأشرطة لكل طريق طبقةً سفلية متّصلة تحت سطح الحارات، وبألوان الإسفلت نفسها، ليكون الثقب غير مرئي بدل أن يكون رقعة ملوّنة.
- حَفرٌ وتغطية، لا سقف ثابت الارتفاع. سقفٌ عند الطريق + 6.4 أمتار لا يكون نفقًا إلا حيث ينخفض الطريق أكثر من 6.4 أمتار؛ وفوق منحدر اقتراب يبعد 2.5 متر تحت المنسوب يقع السقف نفسه على ارتفاع 4.7 أمتار فوق الأرض ويظهر نتوءًا يخترق المشهد. اجعل سقف الغطاء أسفل مستوى الأرض مباشرة، ولا تبنِه إلا حيث يبقى ارتفاع كافٍ. عندها يظهر البناء الصحيح تلقائيًا: حفرٌ مكشوف عند الاقترابين، ونفقٌ مغطّى حيث تكفي الأرض لتغطيته.
- احجب المسار ولا تحذفه. رسم شريط واحد عادي يخضع لاختبار العمق على الطول كلّه — بما في ذلك داخل النفق — يعطي السلوكين معًا بلا أي اختبار لكل إطار: تحجب الأرضُ الصلبة المقطعَ المدفون من الأعلى فيتوقّف الخط عند البوّابة، وداخل النفق تكون الهندسة نفسها أمام الكاميرا مباشرة. أما تقطيعه إلى مقاطع فهو ما ينتج أطرافًا منفصلة، ولطخةً باهتة عبر الإطار عند النظر شبه الموازي.
- الأسطح الخرائطية يجب أن تكون أحادية الوجه. الإسفلت والدهان والأرض أغطيةٌ للعالم. وازدواج وجهها غير مرئي حتى تنزل كاميرا تحتها، فتُرسم عندئذٍ بطون كل الشوارع فوقك — ألواح باهتة وعلامات حارات معكوسة تملأ الإطار وتحجب النفق الذي أنت فيه.
- احفر الحفر المكشوف، وإلا لم يدخل الطريقُ نفقًا بل نزلت الكاميرا تحت الأرض. يمكن أن يُبنى الطريق الهابط وجدرانه الساندة والبوّابة بشكل صحيح تمامًا وتبقى مع ذلك غير مرئية، لأنها تقع تحت مستوى أرضٍ غير مثقوب. ويُقرأ ذلك من الأعلى: أرض مستوية، ثم وجهة نظرٍ تحتها دون تفسير، ثم أرض مستوية. اثقب الأرض على امتداد الحفر المكشوف وحده؛ أما النفق المغطّى فيحتفظ بأرضه لأنها الغطاء الذي تعبر فوقه شوارع السطح — وحفرها هو ما يترك الدوّار طافيًا فوق خندق.
- احفر على قطعتين. ثقبٌ بعرض ~60 مترًا يُحدَث مباشرةً في مستوى أرضٍ عرضه 4 كيلومترات هو ما يجعل مثلِّث المضلّعات يرمي خطأً، ولأن استثناءً واحدًا يُجهض البناء كلّه فإنه يمحو المشهد بأسره. استخدم رقعة داخلية (~1.2 كم) تحمل ثقوب الممرّ، مع إطارٍ خارجي — ثقب مربّع داخل مربّع، وتمثيله بالمثلثات تافه — يمتدّ إلى الأفق. واجعل فشل الحفر مسموعًا: فالارتداد الصامت إلى مستوٍ غير مثقوب يبدو تمامًا مثل «النفق يُرسم خطأً».
- اشطف الوصلة، وإلا انقبض كل ركن. إزاحة الخط المتعدّد بنصف عرضٍ ثابت هي الطريقة البديهية لتثخينه وهي خاطئة عند كل رأس: على الجانب الخارجي من المنعطف يلتقي خطّا الإزاحة المتجاوران أبعد من نصف العرض، فتسحب الإزاحة الثابتة الحافة الخارجية إلى الداخل وتترك ثلمة. اقسم على جيب تمام نصف الانعطاف، وضع حدًّا أقصى — فذلك المعامل يذهب إلى ما لا نهاية كلما اقتربت الوصلة من منعطفٍ حادّ وسيطلق شوكة عبر المشهد؛ وبعد الحدّ انحلّ إلى الإزاحة البسيطة، وهي شطف.
- الشطف ليس تنعيمًا. فهو يعالج الثلمة لكنه لا يجعل المضلّع دائريًا. المسار المُعاد أخذ عيّناته كل 6 أمتار هو سلسلة أوتار طولها 6 أمتار، فيبقى المنعطف سلسلةً من المسطّحات. أعد تركيب المسار عبر منحنى Catmull-Rom مركزيّ الجذب وأعد أخذ العيّنات كل ~2 متر قبل تثخينه — ودوِّر الطريق تحته بالاستدعاء نفسه، وإلا تزوّى الإسفلت بينما ينحني الشريط فينفصل الاثنان عند كل منعطف.
- افتتح على الطريق لا على التقاطع. اللقطة التأسيسية الواسعة تُظهر المناورة من مسافةٍ لا يراها السائق منها أبدًا. البدء على الطريق بمسافة ثابتة قبل بداية المسار — باستقراء رجعي على امتداد اتجاه الافتتاح للأطوال القوسية السابقة له — يُقرأ قيادةً، ويحذف حدود اللقطات التي تضطر الكاميرا المُمزَّجة للتوقف عندها.
- نعِّم كل ما تشتقّه الكاميرا من الهندسة. مدى النظر المرتبط بنصف قطر انعطافٍ خام لكل عيّنة يقفز من إطار لآخر حيثما انحنى الطريق، ويُقرأ ذلك تمامًا تلعثمًا للكاميرا عند كل منعطف. توسّط نصف القطر على ~30 مترًا ليصبح المقدار المشتقّ متّصلًا مع الموضع.
- حُدَّ الميل، تتوقّف عن مطاردة النتوءات. الارتفاع المحلول لكل عقدة لا يعلم أن قيمه يجب أن يصلها سطحٌ قابل للقيادة؛ وعند تقاطع بمستويين قد يُعيد 0 ثم 26 ثم 0 خلال أمتار، فيُرسم جرفًا على شكل V مقلوبة عبر الطريق. وبدل معالجة كل حالة على حدة، حُدَّ ميل منسوب المسار ومناسيب كل الطرق بمرورين (أمامي ثم خلفي). واضبط الحدّ على مقياس الرسم لا على العالم الحقيقي — ففصل المناسيب المرسوم بنحو 13 مترًا لكل مستوى على منحدر ~55 مترًا هو أصلًا ~24%، فيقبل حدُّ ~34% كل ما يقصده العرض ويرفض قفزة 13 مترًا خلال فترة عيّنة واحدة، وهي 216%.
- النفق المغطّى يحتاج ارتفاعًا حقيقيًا لا مجرّد غطاءٍ يتّسع. إن احتُسب كل انخفاض ضحل نفقًا مغطّى نال طريقٌ منخفض 4 أمتار «نفقًا» بارتفاع 3 أمتار — وتدخله الكاميرا فيملأ السقفُ الإطار. اشترط قرابة ما تحمله أنفاق الطرق الحقيقية (~5 أمتار)؛ وما دونه حفرٌ مكشوف، وهو الأصدق وشكلٌ تستطيع الكاميرا الهبوط فيه.
- أبقِ اللافتات خارج الحفر والأنفاق. الجسر الإشاري المعلّق فوق فوهة نفق يقع مباشرةً في طريق الكاميرا — فتدخل العين ظهر اللوحة ويصير الإطار أخضر. والبوّابة هي ما يسمّي ذلك المقطع من الطريق.
- رصِّف السطح على امتداد المنحدر، وأمِلْ** كل بلاطة إليه.** الوحدة المُدارة لتواجه امتداد الطريق دون إمالة تبقى أفقية عند منتصف ارتفاعها؛ ورصفها على منحدر يجعلها سُلَّمًا. وقِسْ طولها على امتداد المنحدر لا على ظلّه الأفقي، وإلا قصُرت البلاطات على منحدرٍ حادّ وفتحت فجوات. وتتبّع الميل الذي تتطلّبه الهندسة منفصلًا عن الإمالة المطبَّقة فعلًا — فهما يتطابقان بحكم البناء، وهذا بالضبط ما يجعل اقترانهما اختبارًا نافعًا ضد الانتكاس.
- السؤال الخطأ «هل يتغيّر هذا الطريق؟»، والصحيح «هل هو مرتفع عن المنسوب؟». ربط الارتفاعات لكل رأس بمدى ارتفاع الطريق نفسه يُعيد إنشاء السُّلَّم، لأن الجسر الطويل مُقسَّم إلى مسارات قصيرة كلٌّ منها شبه مستوٍ. امنح الارتفاعات لكل رأس لكل ما هو مرتفع ولو قليلًا، وأبقِ المسار السريع ذا الثابت للطرق الواقعة على المنسوب فعلًا.
- اشتقّ البوّابة نزولًا من الأرض لا صعودًا من قوسها. تحديد الجدار الأمامي بـ«قمة القوس + هامش» يضعه فوق السطح في أي نفق ضحل — كتلة خرسانية في العشب عند الطرفين. ثبِّت أعلاه أسفل مستوى الأرض مباشرةً وقِسِ القوس ليتّسع تحته، فلا يبرز شيء مهما كان عرض الحفر أو عمقه.
- ارتفاع الطريق يخصّ محيط ذلك الطريق. هندسة الحارات المرتبطة بطريق عبر معرّفه والمقاسة على خط مركزه صحيحة للطريق نفسه وخاطئة لكل ما عداه في المَعْلم ذاته: فسطح التقاطع حيث يلتقي الجسر بالطرق الأرضية يمتدّ عشرات الأمتار ويُرفع بأكمله إلى ارتفاع السطح. اجعل الرفع يتلاشى مع البعد عن خط المركز، وامنح السطح الذي لا معرّف طريق له ارتفاع الطريق الذي يجاوره فعلًا بدل ثابتٍ من وسم طبقته.
- إشارة الدوران لا تُخمَّن — بل تُقاس. تدوير متجه أمامي
+Xحول محور يسار السير بزاوية موجبة يميل بالمقدّمة إلى أسفل، فالبلاطة الصاعدة يجب أن تُدار بالميل مسلوب الإشارة. واعكسها فيبقى السطح يبدو صاعدًا لأن مراكز البلاطات ما زالت تتبع المنسوب — والخطأ في ميل كل لوح، وعلامته أن المحور الأمامي للبلاطة يقع على ضعف الميل بعيدًا عن خط المركز. اجعل كل بلاطة تقارن محورها الأمامي في الفضاء العالمي باتجاه صعودها؛ فلا شيء غير ذلك يلتقط انقلاب الإشارة. - الحارس الذي ينهار طرفاه إلى التعبير نفسه ليس حارسًا. حارسٌ كُتب لالتقاط هذا الانقلاب كان يقرأ
|rot.x − π/2| > 1e-6 || |atan2(dz,h)| > 0 ? |atan2(dz,h)| : 0— وطرفا||كلاهما يؤولان إلى القيمة ذاتها، فما كان له أن يفشل أبدًا. تحقّق من الخاصية لا من وجود عملية حسابية. - لا تدع ترتيب رقمنة مسار OSM يقرّر اتجاه مواجهة شيء. ترتيب الإحداثيات اعتباطي وليس اتجاه السير، فاللوحة المُوجَّهة منه تواجه الجهة الخاطئة في نحو نصف المسارات. ومع خامة مزدوجة الوجه لا يخفي ذلك اللوحة — بل يعرض نصّها معكوسًا. وجِّهها من اتجاه القدوم واقلبها حين يشير عموديّها بعيدًا.
- تحقّق من توافق أعضاء البناء الواحد بعضها مع بعض. ساقا الجسر الإشاري على عمودي الطريق وعارضته على مماسّه كلٌّ منهما مقبول وحده، ومعًا صليبٌ طافٍ لا يلامس أيًّا من الساقين.
- الحم البنية قبل أن تبنيها. الجسر يُقسَّم عند كل حدٍّ وسمي، فيصل الجسر الواحد عدة مسارات. وبناء سطحٍ لكل مسار يُظهر الوصلة مرتين: إذ يُعاد الترصيف من جديد (فأي تداخل يخفي الوصلات لا يسري إلا داخل المسار)، ويقفز العرض لأن كل مسار يحمل صنف طريقه. الحم المسارات التي تتشارك عقدة نهاية في خط مركز واحد أولًا — بالاختبار الطوبولوجي نفسه المستخدم في مواضع أخرى — واجعل أعرض الأعضاء يحدّد العرض، فالسطح الذي يضيق في منتصفه هو الأثر الذي تحاول إزالته.
- الظلّ المُزاح يجب أن يتبع الارتفاع المحلي وأن يكون محدودًا. إزاحة الظلّ بأقصى ارتفاع للبنية وتطبيق ذلك على كل نقطة تصلح فقط ما دامت الأسطح قصيرة. وحين تُرسم البنى كاملةً فإن بنيةً تضمّ مقطعًا مرتفعًا تقذف ظلّها كلّه جانبًا — بما في ذلك تحت الأجزاء التي تكاد تلامس الأرض — فيبقى لوحٌ رمادي في أرض مكشوفة بلا جسر فوقه. والظلّ بعد إزاحة معيّنة يكفّ عن الدلالة على الارتفاع ويبدأ في الظهور سطحًا منفصلًا.
- اعزل بالإخفاء، لكن اعرف بماذا ارتبطت مفاتيحك. إخفاء طبقة لمعرفة ما إذا كانت هي السبب لا ينفع إلا إذا لم يكن ذلك المفتاح يعطّل طبقةً أخرى أيضًا: فربط سطح الحارات بـ
roads && streetsيعني أن إخفاءroadsيزيل سطح الحارات صامتًا، والنتيجة «الفارغة» لا تُثبت شيئًا. - يجب ألّا يرصف نظامان السطح نفسه. وحدة السطح المستوردة تحمل وجه طريقها، وهندسة الحارات ترسم واحدًا أيضًا. وهما متطابقان لا يُحسمان — إذ يختار مخزن العمق فائزًا لكل بكسل فيخرج السطح مبقّعًا رقعًا من كلٍّ منهما. قرّر أي طبقة تملك السطح وأطفئ الأخرى حيث تُغطّى، مع إبقائها احتياطًا حيث لا تصل البيانات.
- لوِّن طبقاتك قبل أن تخمّن مجددًا. إن أنتجت محاولتان أو ثلاث للإجابة عن «أي طبقة ترسم هذا؟» تغييرًا طفيفًا بدا تقدّمًا في كل مرة، فتوقّف عن الترقيع وامنح كل مساهم لونًا مسطّحًا مميّزًا. عندها تكفي لقطة واحدة لتسمية الطبقة تحت أي بكسل؛ والبديل سلسلة لا تنتهي من الإصلاحات المعقولة.
- الاحتياطي الزائد عن الحاجة مجاني على الأرض وليس في الهواء. رسم مخطّط طريق بسيط تحت كل طريق هو الطريقة الصحيحة لمنع فجوةٍ في هندسة الحارات من ترك المسار على تراب عارٍ — فعلى المنسوب يزيد عرضه قليلًا لكنه يقع على الأرض، غير مرئي حيث يُغطّى. أما مرتفعًا فالشريط نفسه يتدلّى عن البنية شفةً من الإسفلت في الهواء ويتنازع مع السطح على بعد سنتيمترات فوقه. أبقِ القاعدة المطلقة حيث لا تضرّ؛ وتخطّاها للطرق المرتفعة التي ترصفها هندسة الحارات أصلًا، وأبقِها للمرتفعة التي لا تصلها.
- دع من يرى العيب يسمّيه. تلوين الطبقات يجيب عن «أي طبقة هذه؟» وتدرّج الارتفاع يجيب عن «هل هي عند المستوى الصحيح؟»، لكن كليهما يحتاج من يفسّر لونًا — وإن كنت تعاين البكسل الخطأ فسيخبرانك أن كل شيء سليم. والنقر للتعريف عبر شعاعٍ يُبلّغ بالطبقة والارتفاع وترتيب العمق تحت المؤشّر يسدّ تلك الثغرة: يشير من يرى المشكلة إليها، فيحصل على طبقة مسمّاة عند ارتفاع مقيس.
- احفظ المصدر عبر التجميع. دمج آلاف مضلّعات الطرق في مخزن واحد قرارٌ صحيح للأداء، وهو يُسقط بالضبط ما تحتاجه حين يكون سطحٌ في المكان الخطأ: أي مَعْلم أنتجه. احفظ سجلًّا واحدًا لكل مثلث إلى جانب مخزن المواضع — بضع مئات من المراجع — فيحوّل فهرسُ الوجه في الشعاع أيَّ بكسل إلى طريق مسمّى بصنفه ونوعه ووسم طبقته.
- وسم
layerيصف الطريق كاملًا، والمنحدر ليس عند مستوى واحد. تَسِم بيانات OSM الطريقَ الفرعي كاملًا بطبقة البنية التي يخدمها، فالمنحدر الصاعد من دوّار إلى سطحٍ في المستوى الثاني يُقرأlayer=2من طرفه إلى طرفه. وإن زرعتَ كل عقده عند الارتفاع الكامل فلن يبقى ما يُسترخى — فيُرسم المنحدر مسطّحًا على مستويين وينتهي في الهواء فوق الأرض التي عليه ملاقاتها. ثبِّت العقدة التي يتشارك فيها طريق مرتفع عقدةً مع طريق على المنسوب عند الأرض: فتلك نقطة هبوط، ولأن الطرق المتقاطعة فحسب لا تتشارك عقدة فلن يُسحب شيء إلى الأسفل بسبب طريق يمرّ تحتها. ودع حدَّ الميل يوزّع الهبوط من هناك. - مُدّ السطح، ولا ترصف نموذجًا على امتداده. وحدة السطح المستوردة جسمٌ جامد ينوب عن شكلٍ يختلف عند كل تقاطع: تحتاج إمالة يدوية وتحجيمًا لكل محور وتداخلًا لإخفاء وصلاتها وبوابة مسافة حين تتفتّت تفاصيلها، وطريقةً لمنعها من منازعة ما يرصف الطريق. أما مدّ خط المركز بعرضٍ وسماكة فيعطي سطح سير وبطنية ووجهين جانبيين ونهايات مغلقة تتبع المنسوب تمامًا، بلا وصلات ولا شيء يمكن توجيهه خطأً. وافحص الأصل قبل الوثوق به — فحافّة وحدتنا بكامل العرض لم تتجاوز نصف متر عمقًا، أي بكسل واحد عند التأطيرات الأوسع، فلم يكن لها جسم مقروء أصلًا.
- امنح كل وجهٍ رؤوسه الخاصة. مشاركة أربعة رؤوس لكل محطة بين سطح السير والبطنية والوجهين تجعل
computeVertexNormalsيتوسّط عبر الحواف القائمة، فتُظلَّل البلاطة أنبوبًا مستديرًا لا جسمًا ذا حواف. كرِّرها لكل وجه؛ فالسطح يُبنى مرة واحدة لكل تقاطع. - لا تضع زخرفة على سطحٍ بمساعد يتدلّى على الأرض. إن كانت ارتفاعات السطح تتضمّن أصلًا عيّنة التضاريس وأضافها المساعد مرة أخرى لكل رأس، تسلّقت الأرصفة وخطوط الحواف بعيدًا عن البنية بكامل ارتفاع التضاريس. ابنِ كل ما يلتصق بالسطح داخل هندسة السطح نفسها.
- الدعامة تحمل البطنية. تحجيم العمود على ارتفاع الطريق يتركه أقصر بمقدار سماكة البلاطة عمّا يحمله، وضوءُ النهار بينهما هو بالضبط ما يجعل الجسر يبدو طافيًا. وتخطَّ الدعامات حيث يقلّ الخلوص عن طول العمود — فقرب نقطة الهبوط تصير أعمدة مبتورة محشورة تحت منحدر يوشك أن يلامس الأرض.
- زرعُ كل نقطة في البنية يثبّتها مكانها. إن كانت كل عقدة في الجسر بذرةً بمسافة صفر، فلن يعمل الاسترخاء الذي يُنزل الارتفاع إلى المنسوب على امتداد البنية، بل نحو جيرانها فقط. فيبقى رأس السطح الذي يبعد 29 مترًا عن هبوطه عند الارتفاع الكامل، ولا يستطيع حدُّ ميل 0.34 أن يُنزل أقل من عشرة أمتار على تلك المسافة، فينتهي الطريق على ارتفاع أمتار خلف جدار نهاية. أضف مرورًا ثانيًا يقيّد الارتفاع بمسافة كل عقدة عن المنسوب عبر الرسم البياني، بميل أقلّ قليلًا من ميل المحدِّد حتى لا يتنازعا.
- حُلَّ منسوب البنية مرة واحدة وشارِكه. إن بُني السطح من مسارات مُلحَمة بينما يشتقّ السطح المدهون ارتفاعه لكل مسار على حدة، اختلف الاثنان — إذ يسحب المحدِّد المقطعَ المرتفع للسلسلة نحو هبوطها، أما المسار المنفرد المثبّتة عقده كلّها عند الارتفاع الكامل فلا شيء يسحبه. الاختلاف المقيس: عشرة أمتار، أي 40 مترًا من الطريق معلّقة فوق هواء مكشوف أعلى سطحها. حُلَّ لكل بنية، ثم هيّئ ذاكرة كل عضو منها.
- أعد أخذ العيّنات قبل المدّ. تباعد الرؤوس في البيانات المصدرية لا علاقة له بشكل الجسر: فجسرٌ بطول 397 مترًا وصل بخمسة رؤوس، فكان صعوده كلّه رباعيًا واحدًا بلا شيء بين 99 و207 أمتار. أعد أخذ العيّنات خطيًّا على امتداد الخط المتعدّد — لا عبر منحنى تنعيم، فهو يستوفي الارتفاع ثلاثيًا ويتجاوز فوق مقطعٍ مستوٍ من السطح.
- انسخ المصفوفة المحفوظة قبل إعادة كتابتها. التكثيف في مكانه يُغيّر الذاكرة التي يقرأها كل مستهلك آخر، ويسلّمهم منسوبًا مفهرسًا على رؤوس لم تعد موجودة.
- امزج خلوص الكاميرا لا ارتفاعها المطلق. الاستيفاء بين وضع سيرٍ مرتفع وآخر بمستوى الطريق يجعل العين تنقضّ نحو السطح قبل أن يبدأ الطريق نزوله — بقياس 12 مترًا في ثلث ثانية، لتصل على أقلّ من مترين من الإسفلت والطريق ما زال على المنسوب. احتفظ بخلوصٍ فوق الطريق ودع الطريق يحمل العين نزولًا: فيصير الهبوط هبوطَ الطريق، وهو ما يُفترض أن يقرأه السائق.
- تنعيم القناع ليس كتخفيفه. فشكل smootherstep كلّه وسطٌ حادّ؛ وتطبيقه على قناع هو أصلًا متوسط متحرّك يركّز الانتقال بدل أن ينشره. وسِّع القناع لنشر التغيّر، ودع شكله وشأنه.
- استثِر القيد بالشرط الذي يحميه لا بالقرب منه. فقاعدةٌ تُبقي العين تحت سقف النفق، مربوطةٌ بالقرب من النفق، تعمل والطريق ما زال على المنسوب — حيث يقع السقف المحسوب تحت الطريق نفسه — فتدفع الكاميرا إلى الأرضية. اربطها بكون الطريق تحت الأرض فعلًا: الاختبار نفسه الذي تُحكم به الهندسةُ الأنبوب.
- وسم
layerيرتّب المنشآت المتراكبة، ولا يقول شيئًا عن المتقاطعة فحسب. جسران علويان متقاطعان يكونان عادةً كلاهماlayer=1— ومعناه «كلاهما جسر» لا «كلاهما على الارتفاع نفسه»، ورسم كلٍّ بمستوى يمرّ سطحين أحدهما في الآخر. حُلَّ المستوى بدل ذلك: افرض ترتيبًا حيثما تقاطع طريقان مرتفعان في المسقط دون تشارك عقدة، وخذ أطول مسار خلاله (بحدٍّ أعلى، وإلا صار المخطط رصًّا). ودَعْ منشأة المسار تفوز بالتعادل — فالطريق المقود ينبغي أن يمرّ فوق ما يعبره، لأنها القراءة التي تجيب «إلى أين أتجه». - على سطح المسارب ثنائي الأبعاد أن يتوقف عند حافة الحفر. تأخذ هندسة المسارب ارتفاعها من المسار الذي جاءت منه، ويأخذ الخندق ارتفاعه من مقطع الطريق. وقرب البوّابة يكونان الطريق نفسه بالغًا الموضع نفسه بمسلكين، فيختلفان — بقياس ستة أمتار، فيُرصف لوح إسفلت عبر المدخل ويحجب البوّابة خلفه. اكبته داخل الخندق المفتوح (فأرضية القشرة والمسلك المقود يرسمان الطريق هناك أصلًا، وكلاهما من المقطع الذي تحلّق عليه الكاميرا) ودَعه يمضي فوق النفق المسقوف حيث الأرض سليمة فعلًا.
- اكبت على مستوى المثلث لا المضلّع. يأتي سطح المسارب في حفنة أشكال كبيرة أحدها التقاطع كلّه، فيسمح فحص المركز للوحٍ يقع وسطه بعيدًا عن الخندق بأن يرصفه رغم ذلك.
- قِس نصف قطر البحث عن «المسافة إلى مستوى الأرض» لأعلى منشأة موجودة لا لمستوى واحد. فنصف قطر يساوي «مستوى واحد ÷ الانحدار» لا يمكن أن ينتج حدًّا يتجاوز ارتفاع مستوى واحد، فما إن يكفّ الخروج عن المدى عن أن يعني «بلا حدّ» حتى يثبّت صامتًا كل سطحٍ في المستوى الثاني عند ارتفاع المستوى الأول — انحدارٌ لا يراه أي فحص ميل، لأن النتيجة تبقى مقطعًا مشروعًا.
- بوّابة النفق ليست نقطة هبوط. حيث يلتقي الجسر بالشبكة حوله فإنه يهبط، ولذا كان تثبيت العقدة المشتركة عند مستوى الأرض هو المقصد كلّه. والنفق يفعل العكس — فهو أصلًا عند كامل عمقه هناك، لأن الطريق نزل في حفرٍ ليبلغه وذلك الحفر موسوم
layer=0كأي طريق. وإن ثبّتّها رغم ذلك فلا يبقى للعمق موضع إلا داخل النفق: نفق طوله 54 مترًا بخمس عقد وطرفاه مثبتان حُلّ إلى0, −2.6, −7.7, −4.6, 0، أي حوض استحمام عند حدّ الميل. ازرع النفق عند كامل عمقه على طوله كلّه بما فيه الفمان، وانشر الصعود خارجًا على طرق الاقتراب. - اشتقّ طول المنحدر من العمق لا من ثابتٍ في المشهد. نصف قطر ارتخاء واحد لا يصحّ إلا ما دامت المنشآت كلها بارتفاع واحد؛ فنفق في المستوى −2 مُنح المدى نفسه الممنوح لنفق في −1 يصل السطح بضعف الانحدار، فيقصّه المحدِّد قفزةً. ثبِّت الانحدار عبر المخطط — فهو ما يقرأه السائق — وتذكّر أن أشدّ نقطة في منحنى التنعيم تساوي 1.5 ضعف متوسطه، فاحسب للذروة.
- خذ ارتفاع المسار على امتداد الطريق لا عند عقده. يُصدر محرّك التوجيه خطًّا خاصًّا به ولا يعيد إنتاج مواضع عقد المسار إلا حيث تقتضي الهندسة، فبحثٌ في شبكةٍ يعتمد التطابق يعيد صفرًا على معظم الاقتراب — مقطعٌ مسطّح ثم حافة. اسقط على أقرب طريق مسلوك واستوفِ بين رؤوسه المحلولة؛ فيكون متّصلًا بحكم البناء ولا يتوقف على اتفاق هندستين مستقلتين.
- عدد واحد، لا ثلاثة عشر ثابتَ عمق.
cover = إزاحة الأرض − منسوب المسار(أمتار التراب فوق الطريق) يكفي لتقرير أين يوجد سقف، وكم ارتفاع الغرفة، وأين البوّابات، وما يحقّ للكاميرا فعله. الثوابت الثلاثة عشر، ولكلٍّ وجاهته، لم تصف شكلًا واحدًا: لم يطابق الفم الأنبوب، ورُسم السقف تحت الأرضية، وأُعيد تسقيف الخندق المفتوح بربع متر أخفض على 100% من طوله. - اجعل البوّابة وصلةً لا جسمًا. فتحةٌ تُبنى بحسابها الخاص قد تكون مستحيلة برهانًا: حُدَّ نصف قطر القوس من فوق بثابت وحُدَّ نصف عرض الأنبوب من تحت بآخر، يصر
الفم < الأنبوبلازمًا دائمًا — بقياس فتحة 2.4 متر على نفق 11.6 مترًا، يتدلّى المسلك خارجها 4.4 متر من كل جانب. ابنِ الفم حلقةً بين مقطع الخندق ومقطع النفق مأخوذَين عند المحطة ذاتها، فلا يخالف فمٌ أنبوبًا هو شريحة منه. - قِس السقف بحيث تتّسع الكاميرا، فلا يبقى ما يخطئ. اختر الارتفاع الصافي بالتنصيف بشرط
H ≥ ارتفاع العين + خلوصها + نطاق، ولا تسقّف إلا حيثcover ≥ H + السماكة + الحرّية. وتنتج مبرهنتان: لا شيء يمكن أن ينبثق من السطح، ولا يمكن أن يتقاطع حدّا الكاميرا الأدنى والأعلى — وهو العيب الوحيد وراء كل إطار معطوب. - مِشبكٌ يستطيع الحدّ الأدنى تجاوزه ليس مِشبكًا.
max(min(z, السقف − c), الطريق + k)يجعل الحدّ الأدنى يفوز حيثما انخفض السقف، أي عند كل بوّابة على الأرض. اشبِك بعد التنعيم وعند محطة العين نفسها — فالعين تتخلّف عن المركبة عشرات الأمتار، وحلّ ارتفاعها عند محطة المركبة يدفنها تحت مسلك الاقتراب على أي انحدار. - جسر المشاة ليس جسرًا للسيارات.
bridge=yesيصف الإنشاء لا مَن يقود عليه. وبناء معابر المشاة أسطحَ مسالك يضع جسرًا وهميًّا فوق التقاطع ويلوّث حاسب مناسيب يعمل على العقد المشتركة. وفصل المستويات في مخطط قيادة يعني فصل ما يمكن قيادته. - احفر بحذف مثلثات من شبكة، لا بدفع حلقة مُزاحة إلى مثلِّث. الخط المُزاح بلا حدّ لالتقاء الأركان ولا إصلاح لتقاطع الذات، وearcut لا يرمي خطأً على حلقة فاسدة — بل يُصدر خردة، فلا يمكن لـ
try/catchحولها أن ينطلق أبدًا. احذف المثلث فقط حين تقع أركانه الثلاثة داخل الخندق: فيكون الفائض دائمًا تجاوزًا بخلية واحدة، لا فجوةً على السماء. - تحقّق من اتجاه اللفّ ولا تستنتجه. خذ أول مثلث غير منحلّ، واضرب عاموده قياسيًّا في اتجاه الهواء المحصور، واعكس مخزن الفهارس كلّه مرة واحدة إن أشار إلى الجهة الخطأ. ومع خامات أحادية الوجه يمنحك ذلك الاختبارُ الواحد السلوكيات الثلاثة معًا: مرئيّ من داخل النفق، وشفّافٌ من خارج خندق مفتوح، وغائبٌ من فوق مجرى مسقوف.
- امزج الخلوص لا الارتفاع حين تتبع الكاميرا طريقًا هابطًا. الاستيفاء بين وضع تتبّع مرتفع وآخر بمستوى الطريق يجعل العين تنقضّ نحو الإسفلت والطريق ما زال مستويًا، ثم تتبعه نزولًا بعد ذلك — بقياس 11.8 مترًا في ثلث ثانية، لتصل على بعد 1.7 متر من السطح. حافظ على خلوصٍ فوق ما يفعله الطريق ودَعِ الطريق يحمل الكاميرا نزولًا؛ فيُقرأ الهبوط عندئذ هبوطًا للطريق، وهو ما هو عليه فعلًا.
- لا تنعّم منحدرًا بمنحنى شكله وسطٌ حادّ. تطبيق smootherstep فوق قناعٍ ناعم أصلًا يركّز الانتقال بدل نشره. وسِّع القناع، ودَع شكله وشأنه.
- اجعل مِشبك «الانخفاض تحت السقف» يعتمد على كون الطريق تحت الأرض فعلًا، لا على القرب من نفق. فتوسيع الاقتراب لهبوط لطيف يجعل أي قناع قرب يقرأ صحيحًا قبل البوّابة بكثير — والسقف المحسوب هناك يقع تحت الطريق، فيقذف المِشبك العين إلى حدّها الأدنى ويعيد بالضبط القفزة التي وُجد التنعيم لإزالتها.
- دقِّق تقاطعات لم ترها قط. مجموعة اختبارات ثابتة تُثبت أن التقاطعات المعروفة ما زالت تُرسم؛ ولا تقول شيئًا عن تقاطعٍ لم ينظر إليه أحد. تحقّق بدل ذلك من الخصائص التي يمتلكها أي تقاطع صحيح أينما كان: لا قيم غير منتهية، ولا طريق يصعد أسرع من مقياس المنحدر، ومدى ارتفاع معقول فيزيائيًا، وإسفلت تحت المسار، وهندسة حارات تصل إلى المناورة، وكاميرا لا تنزل تحت الأرض إلا داخل نفق مغطّى فعلًا. واكتشف الهياكل الحقيقية من الواجهة البرمجية بدل انتقاء الإحداثيات يدويًا، حتى لا يختار المسحُ الحالات السهلة.
- أثاث الشارع ليس الموضوع. الأعمدة الموضوعة على امتداد المسار يجب تكبيرها لتُرى عند تأطير التقاطع، وعندها تصير صفًّا من الأعمدة المتضخّمة تسير في اللقطة. وعرض التقاطع رسمٌ لقرار.
- وسِّع القناع قبل تنعيمه. تنعيم قناع «داخل النفق» مباشرةً يأكل الانتقال إلى داخل النفق من طرفيه: بقي المعامل 0.78 بعد ثلث النفق، فرفع الكاميرا 3.4 أمتار — عبر السقف إلى السماء المفتوحة في منتصف النفق. وسِّع أولًا ليقع التدرّج خارج البوّابة، ثم نعِّم، فيبقى المعامل 1.0 على كل متر من النفق الفعلي.
- أوقف المسار عند البوّابة وأعده عند الأخرى. رسمه عبر النفق كطبقة شفّافة يحفظ الخيط لكنه يجعل النفق يبدو امتدادًا لطريق أبهت؛ أما الفجوة النظيفة فتُقرأ شيئًا يدخل إليه الطريق. حدِّد «داخل النفق» من خط مركز النفق نفسه — قربًا وتوازيًا — لأن منحدر الحلقة يعود بمحاذاة نفقه، وقد اعتبر اختبار المسافة وحده 138 من 170 نقطة «داخل النفق» لنفق طوله 52 مترًا.
- أعد أخذ عيّنات المسار قبل قياس أي شيء عليه. قد يعطي محرّك التوجيه 9 رؤوس على 559 مترًا؛ يكفي ذلك لرسم شريط لكنه لا يحدّد أين يقع أي حدث عليه. أعد العيّنات كل ~6 أمتار، واحسب الارتفاع وإزاحة الحارة على الرؤوس الأصلية ثم استوفِها على الخط الجديد: كلاهما يطابق نقاط المسار بعُقد الطرق إحداثيًا، والنقطة المستوفاة لا تطابق شيئًا، فيتناوب الشريط بين خط السير وخط المنتصف كل 6 أمتار ويظهر مسنّنًا.
- وجِّه عبر الهيكل كاملًا لا عبر المسار الممرَّر إليك. غالبًا ما يتكوّن النفق أو الجسر من عدة مسارات، فإزاحة طرفَي أحدها تضع بداية الطريق داخل المسار التالي من الهيكل نفسه فلا يخرج الشكل من النفق أبدًا. صِل المسارات طرفًا بطرف أولًا ثم أزِح من البوّابات الحقيقية.
- مجموعة مسارات واحدة في كل مكان. يجب أن تتفق سلسلة الهيكل ونافذة المسار والراسم؛ وإلا رأى الراسم نفقًا أطول مما حُسبت له النافذة.
- قف عند بداية المسار مع تقييد المسافة. خذ الاتجاه من اتجاه المسار عند تلك النقطة لا من المتجه بين نقطة التصويب وها — فقد يبلغ ذلك الأساس 56 مترًا على نفق مستقيم فتُدير أمتارٌ قليلة الكاميرا بالكامل. قيّد المسافة، وصوّب على التقاطع نفسه: التصويب دونه يدفعه نحو الأفق حيث تضغطه الكاميرا المنخفضة إلى لا شيء.
- النافذة ذات المسافة الثابتة تبتر كل مناورة دائرية. «160 مترًا خلفًا و150 أمامًا» تناسب المناورة المستقيمة. أما منحدر مطار عمّان فيدور 895 درجة، ولم تلتقط نافذة 310 أمتار سوى 585 منها، فرُسم المسار داخلًا الحلقة ثم توقف في منتصف الدوران. أنهِ النافذة حيث تنتهي المناورة: استمر بالتمديد ما دام المسار ينعطف، وتوقّف بعد نحو 80 مترًا من الاستقامة، بحدٍّ أقصى ~420 مترًا لكل جهة. لا تتأثر المناورات المستقيمة (تتوقف عند الحدّ الأدنى)، بينما تتّسع الحلقة إلى ~410 أمتار لكل جهة فتلتقط 889 من 895 درجة — ولأن الحلقة تعود على نفسها يبقى ذلك ضمن 232×242 مترًا من الأرض فلا يتّسع الإطار.
- قيّد الخطوة قبل احتسابها. رؤوس المسار متباعدة على الطرق السريعة — وقد يقفز رأس واحد 200 متر — ففحص الحدّ بعد الإضافة يتجاوزه بنصف النافذة.
- انظر إلى التقاطع بزاوية مائلة لا من محور الاقتراب. منظر السائق نفسه هو أسوأ زاوية لقراءة تقاطع: تنكمش الدوّارة إلى قطع ناقص، وتختفي ساق الحلقة العائدة خلف الذاهبة، ويصير النفق المارّ تحتها موازيًا للنظر. إمالة الكاميرا ~35 درجة عن اتجاه الاقتراب ورفعها ~10 درجات تحوّل اللطخة المنكمشة إلى مسار يُرى داخلًا من بوّابة، وعابرًا تحت الدوّارة، وخارجًا من الأخرى.
- رصِّف وحدة السطح ولا تمدّها. سطح الجسر ينحني ويرتفع، ومدّ نموذج واحد بين الركيزتين يستبدل ذلك بوتر مستقيم. ضع نسخة كل ~20 مترًا على خط المركز، كلٌّ على المماس والارتفاع المحلّيين. سِر بطول القوس لا بالرؤوس — تباعد رؤوس OSM غير منتظم — وقسّم الطول إلى خطوات متساوية حتى لا يبقى طرف ناقص، مع تداخل بسيط بين الوحدات كي لا تنفتح الوصلات.
- اشحن وحدة واحدة لا الطقم كاملًا. يضمّ الطقم المعياري كل الأشكال جنبًا إلى جنب، بينما يُرصَّف واحد منها غالبًا. استخراج تلك الوحدة وحدها خفّض طقم الجسر من 4.67 ميغابايت و36.6 ألف مثلث إلى 1.00 ميغابايت و7.1 ألف. وحّد إطار الوحدة المستخرجة (الطول على X ومتمركز، والعرض على Z ومتمركز، وسطح الطريق عند
y = 0) ليصبح وضعها مجرّد تحجيم لكل محور. - حجِّم السطح لكل محور على حدة: العرض إلى عرض الطريق، والطول إلى مدى الوحدة، مع إبقاء السماكة شبه ثابتة — فنقل معامل العرض (~3.5 أضعاف عادةً) إلى العمق يحوّل سطحًا سماكته 2.5 وحدة إلى بلاطة بسماكة 9 أمتار.
- يجب أن يكون شريط المسار أضيق من الطريق الذي يسير عليه. التحجيم بالبكسل وحده يتجاهل ما تحته: بلغ هدف 19 بكسل عند أحد الأُطر 11.8 مترًا فوق طريق رئيسي عرضه 8.5 أمتار، فتجاوز الشريط الرصيفين وبدا طريقًا أزرق مستقلًا. أبقِ عرض البكسل سقفًا للوضوح ثم قيّده بعرض الطريق (نستخدم
0.56 للتعبئة و0.86 للإطار)، واشتقّ عرض الطريق من عدد الحارات حين يكون موسومًا لا من صنف الطريق وحده.
- حدّد نهايتَي النفق الحقيقيتين أولًا. غالبًا ما يُقسَّم النفق إلى عدة مسارات، فتكون نهايات المسار الواحد في منتصف النفق. النهايات الحقيقية هي العُقد التي يستخدمها مسار نفق واحد فقط؛ وأي عقدة مشتركة أخرى هي وصلة داخلية.
- نسخة واحدة ممدودة، لا فوهتان. المقطع المفتوح من الطرفين يعطي المدخل والمخرج من كائن واحد متصل؛ أما فوهتان منفصلتان فتتركان الوسط أجوف وقد تتداخلان في الأنفاق القصيرة.
- قِس كل محور على حدة. اضبط العرض على عرض الحفر الذي يسير فيه المسار، والارتفاع على عمق الحفر. التحجيم المتناسب يرفع القشرة فوق مستوى الشارع فيبدو السقف شريطًا إسفلتيًا مرتفعًا — عكس المطلوب تمامًا.
- يجب أن ينتهي التاج تحت مستوى الأرض، وإلا ظهر النفق فوق الشارع لا تحته.
- أبقِ الجدران الأمامية (headwalls). القشرة مدفونة وغير مرئية من الأعلى، والواجهة المقوّسة عند كل طرف هي ما يُظهر المدخل والمخرج فعليًا.
- الفوهة تحتاج إطارًا غير مضاء. الجدار المضاء يصبح شبه أسود على أرضية داكنة في الوضع الليلي فيختفي المدخل. الشريط غير المضاء يحافظ على سطوعه من أي زاوية وفي الوضعين.
- انتبه لحجم الخامات. خامة 4K واحدة قد تبلغ 10 ميغابايت. تحدّ Navvo خامات التقاطعات عند 1K، ما خفّض ملف النفق من 15.1 إلى 0.95 ميغابايت دون فرق مرئي.
- إعادة بناء ملف GLB تستلزم إعادة كتابة كل الإزاحات: المخازن مرصوصة تتابعيًا، فأي تغيير في حجم خامة يزيح ما بعدها. حاذِ كل عرض على 4 بايت، وحدّث طول المخزن والطول الكلي في الترويسة (مقطع JSON يُحشى بمسافات
0x20، والمقطع الثنائي بأصفار).
تُخزَّن الاستجابات الناجحة على الخادم لكل خلية ~120 م لمدة 24 ساعة (هندسة الجسور/الأنفاق ثابتة).
GET /junction/streets
هندسة سطحية على مستوى المسارب لتقاطع ما: مضلَّعات الطرق والتقاطعات إضافةً إلى كل علامة مدهونة، مولَّدة من جهة الخادم من بيانات المنشآت الخاصة بـ Navvo.
النطاق المطلوب: geo
فبينما تخبرك /junction/structures بـما هو موجود (جسر، نفق، الشبكة المحيطة)، تخبرك هذه بـكيف يبدو على الأرض — أشكال الإسفلت الفعلية والدهان عليها، جاهزةً للرسم.
curl -s "https://navvo.io/api/v1/junction/streets?lat=31.9539&lng=35.9106&radius=160" \
-H "x-api-key: nvvo_YOUR_KEY"
معاملات الاستعلام
300.الاستجابة
{
"source": "osm2streets",
"available": true,
"roads": { "type": "FeatureCollection", "country_code": "JO", "features": [ /* مضلَّعات الطرق والتقاطعات */ ] },
"markings": { "type": "FeatureCollection", "features": [ /* فواصل المسارب، خطوط المنتصف، أسهم المنعطفات */ ] }
}
false عندما يتعذّر توليد هندسة على مستوى المسارب لتلك النقطة. ارجع إلى /junction/structures أو إلى خط مسار بسيط — ولا تعامل ذلك كخطأ.road أو intersection. ارسم التقاطعات كقرص مرصوف واحد بدل أشرطة طرق متداخلة، وإلا ظهر كل تقاطع ككومة من الحزم المتراكبة.radius. نحو 1.44 MB عند 320 م، و701 KB عند 220 م، و390 KB عند 160 م. اطلب أصغر نصف قطر يملأ إطارك؛ فالقيمة الافتراضية 300 سخيّة لعرض تقاطع كامل ومُبذِّرة لصورة مصغّرة.GET /junction/route-through
خط القيادة الحقيقي عبر جسر أو نفق عند نقطة ما — الشكل الذي تتبعه المركبة فعلاً، لا حدود المنشأة.
النطاق المطلوب: geo
curl -s "https://navvo.io/api/v1/junction/route-through?lat=31.9539&lng=35.9106&kind=tunnel" \
-H "x-api-key: nvvo_YOUR_KEY"
معاملات الاستعلام
::::field{name="lat" / name="lng" type="number" required} النقطة الواقعة على المنشأة. ::::
tunnel (الافتراضي) أو bridge. وأي قيمة غير bridge تُعامَل على أنها tunnel.الاستجابة
{
"source": "navvo-junction",
"available": true,
"shape": [[35.913101, 31.95377], [35.912649, 31.953971], "…"]
}
shape خطّ متعدّد مرتّب بالصيغة [lng, lat]. ارسمه شبه شفّاف عبر النفق بدل قصّه عند البوّابة — فالمسار الذي يتلاشى عند فوهة النفق يبدو للسائق وكأنه إخفاق في التوجيه.
بناء عرض تقاطع داخل منتج ملاحة حيّ
كل ما سبق يصف البيانات. وهذا القسم عن تشغيلها في سيارة، وهو مكتوب من واقع عميل الملاحة منعطفًا بمنعطف في Navvo نفسه، الذي يستدعي هذه النقطة عند كل مناورة.
افتح النافذة على المناورة لا على الخريطة
يجيب عرض التقاطع عن سؤال واحد — إلى أين أتجه عند نقطة القرار التالية — فعمره هو الاقتراب من مناورة واحدة. يفتحه Navvo على بُعد 220 مترًا لمنعطف مدينة و420 مترًا لمخرج طريق سريع أو اندماج أو تشعّب أو أي فصل مستويات، ويغلقه قبل المناورة بستة أمتار. ثبّت الحالة بتخلّف مغناطيسي (تشغيل داخل المدى، وإطفاء بعد المدى + 60 مترًا فقط) وإلا ارتجفت اللوحة عند الحدّ — وامسح ذلك المزلاج عند كل تغيير للمسار، وإلا ورثت أول مناورة في المسار الجديد قيمة المسار القديم وفتحت نافذتها مبكرًا.
اجلب الهياكل مسبقًا، واجلب المسارب عند الحاجة
GET /junction/structures صغيرة — خطوط مركز لا هندسة — فاجلبها للخطوتين أو الثلاث التالية بغضّ
النظر عمّا إذا كانت نوافذها ستُفتح: فوجود جسر أو نفق عند المناورة هو نفسه جزء من تقرير متى
تُفتح. أما GET /junction/streets فهي المكلفة ولا ينبغي جلبها إلا حين توشك نافذة على الفتح فعلًا.
استخدم نصف القطر نفسه للجلب المسبق ولجلب العرض. فالمخبأ يوزّع حسب نصف القطر، وطلب 450 مترًا مسبقًا و400 متر عند الاستعمال مفتاحان اثنان واستعلامان اثنان للتقاطع نفسه.
الأحجام، بالقياس
| الاستدعاء | نصف القطر | الحمولة |
|---|---|---|
/junction/structures | 450 م | ~10–30 كيلوبايت مضغوطة (الحدّ الأعلى في حيّ مدينة كثيف) |
/junction/streets | 180 م | ~800 كيلوبايت خام |
/junction/streets | 220 م | ~700 كيلوبايت خام / ~78 كيلوبايت مضغوطة |
/junction/streets | 360 م | ~2.0 ميغابايت خام |
تتوسّع هندسة المسارب بأسرع من الخطّي، وبعد مئتي متر أو نحوها تُرسم تحت أسطح طرق تملكها أصلًا من
structures.roads لا بدلًا منها. لا تشتقّ نصف قطر المسارب من طول نافذة مسارك. ثبّته — 220 مترًا
لا يُميَّز عن 360 مترًا في إطارٍ بعرض تقاطع ويكلّف ثلث الكلفة.
تدهور إلى مخطط، لا إلى مؤشّر انتظار
| الحالة | ما تحصل عليه | ما تَرسم |
|---|---|---|
| تقاطع عادي بمستوى واحد | bridges: [] وtunnels: [] مع وجود الطرق والمباني | العرض الطبيعي. هذه هي الحالة الشائعة لا حالة فشل. |
| هندسة المسارب بطيئة أو غير متاحة | streets غائبة أو available: false | ارجع إلى أشرطة المسالك من خطوط مركز الهياكل. أبسط بوضوح بمقياس الحارة، ومقروء تمامًا. |
| خارج التغطية | available: true وكل المصفوفات فارغة | لا تفتح النافذة. |
| الفهرس غير قابل للوصول / دون اتصال | available: false | لا تفتح النافذة. |
انتبه للصف الثالث. available تعني أن فهرس الهندسة أجاب، لا أن هنا بيانات — فتقاطعٌ خارج
التغطية يجيب بنجاحٍ ولا شيء فيه. اجعل البوّابة roads.length > 0، وإلا أظهرت صندوقًا مضاءً
فارغًا. وضع مهلةً صارمة لطلب المسارب أيضًا (يستخدم Navvo 4.5 ثانية): فحمولةٌ تصل بعد أن يتجاوز
السائق التقاطع كلّفت بياناتٍ وبطاريةً بلا مقابل.
اللوحة مشهد ثلاثي الأبعاد، وعليها أن تعرف متى لا ينظر إليها أحد
أبقِها مركّبة طوال الجلسة — فإنشاؤها لكل مناورة أغلى من تعطيلها — لكن امنحها راية نشاط صريحة من
حالة الملاحة. فـIntersectionObserver يبلّغ عن عنصر شفّاف بأنه مرئيّ تمامًا، فلوحةٌ مخفّاة إلى
opacity: 0 سترسم بكامل معدّل الإطارات، على هاتف، على بطارية، طوال 95% من الرحلة التي ليست اقترابًا.
وثلاثة أمور أخرى لا تظهر إلا في السيارة:
- قِس اللوحة بالنسبة لا بارتفاع بالبكسل. الأمتار لكل بكسل تعتمد على ارتفاع اللوحة، فارتفاعٌ ثابت واحد يمنح الهاتف والحاسب تأطيرين مختلفين للتقاطع نفسه — ولوحةٌ بارتفاعٍ يبدو صحيحًا على هاتف كبير ستغطّي مؤشّر المركبة على هاتف صغير.
- افصل هوية المشهد عن ملصق المسافة. تتناقص المسافة كل بضعة أمتار؛ فإن شاركت المشهدَ كائنًا واحدًا أعادت كل نبضة بناء الهندسة وأعادت الكاميرا إلى البداية، فلا يرى السائق إلا نصف الثانية الأولى من الاقتراب في حلقة.
- أدرج فهرس الخطوة في تلك الهوية. فالمسار الذي يدور أو يعود على نفسه يمرّ بإحداثي المناورة نفسه مرتين باقترابٍ مختلف في كل مرة.
تعامل مع فقدان سياق WebGL
قد تحمل صفحة ملاحة عدة سياقات WebGL، والمتصفّح المحمول الذي تنفد منه يطرد الأقدم — وقد يكون خريطتك
الرئيسية. أنصت لـwebglcontextlost على لوحة التقاطع وتوقّف عن فتح النافذة لبقية الجلسة. فاللوحة
المغلقة صحيحة، أما مستطيلٌ أسود فوق مسار السائق فلا.