Navvo
مرجع الواجهة البرمجية

بيانات الخريطة والمخاطر

إعداد الخريطة، أنماط الفئات، الطبقات العلوية، الطقس، وتقييم مخاطر المسار المراعي للأحوال.

بيانات الخريطة والمخاطر

كل ما يُركَّب فوق خريطة الأساس: بيان إعداد الخريطة، أنماط علامات الفئات، صور الأيقونات المركَّبة، الطبقات العلوية المتجهية/بصيغة GeoJSON، الطقس، وتقييم مخاطر المسار الذي يدمج حركة المرور والطقس والحوادث ومناطق اللوجستيات وأصول الإنفاذ.

النطاق المطلوب: tiles للإعداد والطبقات العلوية والطقس؛ و**routing** لنقاط نهاية POST الخاصة بمخاطر المسار/الإنفاذ.

الإحداثيات بصيغة GeoJSON على هيئة [lng, lat]؛ وbbox هو west,south,east,north. الطبقات العلوية الثقيلة تدعم مرشِّح bbox/zoom/limit ومخطِّط تغطية بالبلاطات للتحميل المحدود. تتعامل معظم نقاط النهاية مع المدخلات السيئة بسلاسة (FeatureCollection فارغة مع hasData:false) بدلًا من إصدار خطأ.

GET /map/config

بيان إعداد الخريطة الكامل من المصدر الأول: الأنماط الأساسية، الطبقات العلوية، الفئات، الأيقونات، الطقس، النمط ثلاثي الأبعاد، مناطق اللوجستيات، وكتلة capabilities التي تصف نقاط النهاية العامة وحدود الأداء. اجلب هذا مرة واحدة عند بدء التشغيل لاكتشاف ما هو متاح وكيفية تحميله.

المفاتيح من المستوى الأعلى: layers، baseStyles، overlays، categories، icons، iconSpriteUrl، iconSpriteManifestUrl، categoryStyleManifest، threeD، logisticsZones، capabilities.

{
  "baseStyles": [ { "key": "standard", "name": "Navvo", "kind": "base", "endpoint": "/api/v1/tiles/style?style=standard" } ],
  "overlays": [ { "key": "traffic", "kind": "overlay", "layerType": "traffic", "tileUrl": "/api/v1/traffic/lines/tiles/{z}/{x}/{y}" } ],
  "iconSpriteUrl": "/api/v1/map/icons/sprite.svg",
  "capabilities": {
    "publicEndpoints": { "config": "/api/v1/map/config", "routeRisk": "/api/v1/map/route-risk" },
    "performance": { "defaultTileCoverCap": 64, "maxTileCoverCap": 256, "tileAddressedOverlays": true },
    "vectorOverlays": { "enabled": true, "format": "mvt" }
  }
}

GET /map/layers

فهرس مسطَّح لجميع الطبقات المُعدَّة: { items, baseStyles, overlays, total, requiredOverlays }. يسرد requiredOverlays أنواع طبقات الطبقات العلوية التي يتوقعها Navvo (مثل traffic، transit، incidents، weather، logistics_zones).


GET /map/category-styles

تنسيق جاهز للعرض لفئات الأماكن — ألوان العلامات، أنماط الدبابيس، الأيقونات، الأسماء متعددة اللغات، والأسماء البديلة. استخدمه لرسم علامات ملوَّنة حسب الفئة تطابق خريطة Navvo نفسها.

{
  "version": 1,
  "iconSpriteUrl": "/api/v1/map/icons/sprite.svg",
  "categories": [
    {
      "slug": "restaurants",
      "name": { "en": "Restaurants", "ar": "مطاعم" },
      "color": "#F97316",
      "pinStyle": "teardrop",
      "zoomRange": { "min": 11, "max": 22 },
      "icon": { "name": "utensils", "href": "/api/v1/map/icons/sprite.svg#navvo-icon-utensils" }
    }
  ]
}

GET /map/icons/sprite.svg & sprite.json

sprite.svg تُعيد صورة رموز مركَّبة بصيغة SVG (image/svg+xml) لجميع الأيقونات النشطة (<symbol id="navvo-icon-…">). وsprite.json تُعيد البيان الذي يصف كل أيقونة (name، id، href، الحجم).

GET /map/readiness

تدقيق ذاتي لسطح الخريطة — قائمة من الفحوص المنطقية checks إضافةً إلى summary (أعداد الأنماط الأساسية، الطبقات العلوية، الفئات، الأيقونات). مفيد للتشخيص.


GET /map/poi

تحدّد أي الأماكن ينبغي أن تعرضها نافذة العرض فعلياً. فبإعطائها مربّعاً حدودياً ومستوى تقريب، تعيد مجموعة من نقاط الاهتمام مرتّبة حسب الأولوية ومحكومة بميزانية تسميات — لا مجرّد أقرب N صفّاً.

النطاق المطلوب: places

لماذا ليست مجرّد «أماكن داخل مربّع حدودي». عند تقريب المدينة قد تحتوي نافذة العرض على عشرات الآلاف من الأماكن. ورسمها كلها يُنتج جداراً غير مقروء من الدبابيس، ورسم أقربها فقط يُنتج خريطة تُخفي المستشفى وتُظهر ثلاثة حلّاقين. تطبّق هذه النقطة ميزانية تسميات لكل مستوى تقريب وحدّاً أدنى للأولوية، فما يعود إليك هو ما كان رسّام الخرائط ليُبقيه عند ذلك المستوى — المعالم أولاً، ثم الكبرى، ثم الذيل الطويل — مُنقّى سلفاً.
curl -s "https://navvo.io/api/v1/map/poi?bbox=35.85,31.93,35.97,32.00&zoom=15" \
  -H "x-api-key: nvvo_YOUR_KEY"

معاملات الاستعلام

bbox
string required
نافذة العرض بالصيغة west,south,east,north بالدرجات. مطلوب — وبدونه تكون الاستجابة { "error": "bbox required as west,south,east,north", "items": [], "clusters": [] } مع حالة HTTP 200.
zoom
number
مستوى تقريب الخريطة، من 0 إلى 22. القيمة الافتراضية 14. وهو الضابط الرئيسي: يختار ميزانية التسميات وحدّ الأولوية وعتبة الاقتصار على الأيقونة.
categories
string
قائمة مُعرِّفات فئات مفصولة بفواصل لحصر النتيجة بها (مثل hospital,pharmacy). أهمِلها لتشمل كل الفئات.
locale
string
en (الافتراضي) أو ar — يحدّد الاسم المستخدَم في قياس تزاحم التسميات.

::::field{name="vw" / name="vh" type="number"} عرض نافذة العرض وارتفاعها ببكسلات CSS (من 200 إلى 8000، والافتراضي 1440×900). يُستخدَم لملاءمة ميزانية التسميات للشاشة الفعلية. ::::

dpr
number
نسبة بكسلات الجهاز، من 1 إلى 4. القيمة الافتراضية 1.
perf
number
مِعْيار الأداء، من 0.3 إلى 1 (الافتراضي 1). والقيم الأدنى تقلّص الميزانية للأجهزة الأضعف.

الاستجابة

{
  "zoom": 15,
  "budget": 180,
  "minPriority": 35,
  "profile": { "clusterRadius": 0, "labelSpacing": 12, "iconOnlyBelow": 40 },
  "items": [
    {
      "id": "98506109-374d-4810-a148-e0b7add768ac",
      "slug": "telescope-medical-center-…-fad9f9",
      "name": "Telescope Medical Center",
      "canonicalCategorySlug": "medical-center",
      "categories": ["medical-center"],
      "priority": 73,
      "rating": 4.9,
      "reviewCount": 2594,
      "lng": 35.867637,
      "lat": 31.960408,
      "labelHidden": false,
      "iconLightUrl": "https://navvo.io/uploads/category-icons/medical-center-light.svg",
      "iconDarkUrl": "https://navvo.io/uploads/category-icons/medical-center-dark.svg"
    }
  ],
  "clusters": [],
  "truncated": false
}
budget
number
عدد التسميات التي يسمح بها هذا المزيج من التقريب ونافذة العرض. وتكون items مقصوصة إليه سلفاً.
minPriority
number
حدّ الأولوية الأدنى المطبَّق عند هذا التقريب. ولم يُعَد شيء دونه.
items[].priority
number
درجة أهمية مُجسَّدة من 0 إلى 100 تجمع وزن الفئة والشهرة والتقييم وثقة المراجعات وأي تجاوز يدوي لأهمية النشاط التجاري. اعرِضها بهذا الترتيب — فهي مرتّبة سلفاً.
items[].labelHidden
boolean
تعني true أن ترسم الأيقونة دون نصّها: فقد نال المكان دبّوساً لكنه خسر منافسة تزاحم التسميات عند هذا التقريب. التزِم بها وإلا تداخلت خريطتك.
profile.iconOnlyBelow
number
الأولوية التي تُعرَض العناصر دونها بالأيقونة فقط بحكم السياسة، بما يوازي labelHidden.
truncated
boolean
تكون true عندما تتأهّل أماكن أكثر ممّا سمحت به الميزانية — قرِّب أكثر لرؤية البقية.
العرض. مرِّر items مباشرةً إلى مُصيِّرك كبيانات رموز ودَع وحدة معالجة الرسوميات تتولّى التزاحم فوقها؛ فالميزانية وأعلام labelHidden موجودة كي لا تضطرّ إلى تشغيل مرحلة تزاحم خاصة بك على الخادم. والاستجابات قابلة للتخزين المؤقّت نحو 20 ثانية مع نافذة إعادة تحقّق أثناء التقادم مدتها 120 ثانية.

الطبقات العلوية

تقدِّم الطبقات العلوية العامة عناصر الخريطة المخزَّنة على هيئة GeoJSON، أو بلاطات متجهية، أو نقطية. تشمل أنواع الطبقات المعروفة traffic، transit، biking، terrain، incidents، speed_cameras، traffic_cameras، traffic_lights، weather، وlogistics_zones.

GET /map/overlays/{layerType}

FeatureCollection بصيغة GeoJSON لطبقة علوية واحدة. يقبل bbox، limit، zoom.

{
  "type": "FeatureCollection",
  "features": [
    { "type": "Feature", "geometry": { "type": "Point", "coordinates": [35.91, 31.95] },
      "properties": { "id": 12, "name": "Amman central speed camera", "layerType": "speed_cameras", "color": "#B91C1C" } }
  ],
  "metadata": { "layerType": "speed_cameras", "name": "Speed cameras", "hasData": true }
}
biking (شبكة الدراجات) و**transit** تُعيدان بيانات شبكة حيّة مرتبطة بالمنطقة المعروضة (مُخزَّنة مؤقتًا لكل منطقة). في biking يحمل كل خط network (protected | shared | trail) وsurface وlit وoneway وcolor. في transit تحمل المعالم kind (line | stop) وmode (bus | metro | tram | rail) وcolor و(للخطوط) routeRef وlineName وnetwork. مرِّر bbox لتحديد نطاق الطلب.

الوصول المُبلَّط للطبقات العلوية

نقطة النهايةتُعيد
GET /map/overlays/{layerType}/tile-coverروابط البلاطات التي تغطي نطاق bbox (bbox، zoom، maxTiles).
GET /map/overlays/{layerType}/tiles/{z}/{x}/{y}بلاطة واحدة على هيئة GeoJSON.
GET /map/overlays/{layerType}/vector/{z}/{x}/{y}بلاطة واحدة على هيئة بلاطة متجهية ثنائية (application/x-protobuf، الطبقة navvo).

GET /map/logistics-zones.geojson

مضلَّعات مناطق اللوجستيات / اتفاقية مستوى الخدمة (SLA) على هيئة GeoJSON. يحمل كل عنصر zoneType، وriskScore، وcostMultiplier، وroutingPolicy — وهي المناطق نفسها التي تظهر في نتائج /routing/plan.


الطقس

طبقات الطقس العلوية هي مضلَّعات مخزَّنة إضافةً إلى بحث نقطي حي. type ∈ precipitation, temperature, clouds, storms, alerts؛ وtime ∈ -1h, now, +1h, +3h.

نقطة النهايةتُعيد
GET /map/weather/geojsonمضلَّعات الطقس على هيئة GeoJSON (المرشِّحات: type، time، bbox، limit، zoom).
GET /map/weather/geojson/tiles/{z}/{x}/{y}الطقس بصيغة GeoJSON لبلاطة واحدة.
GET /map/weather/vector/{z}/{x}/{y}الطقس على هيئة MVT ثنائية (الطبقة navvo_weather).
GET /map/weather/tiles/{z}/{x}/{y}بلاطة طقس نقطية مُصيَّرة بصيغة SVG (image/svg+xml).
GET /map/weather/tile-coverروابط البلاطات التي تغطي نطاق bbox.
GET /map/weather-riskمعاينة مجمَّعة لمخاطر الطقس (score، severity، warnings).

أيقونات الطقس

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

الحقلالنوعالوصف
iconstringمُعرِّف الرسم — وهو اسم الملف. انظر القائمة أدناه.
iconLightUrlstringرابط مطلق لملف SVG المُعدّ للواجهات الفاتحة.
iconDarkUrlstringرابط مطلق لملف SVG المُعدّ للواجهات الداكنة.

المُعرِّفات: clear وclear-night وpartly وcloud وrain وstorm وsnow وfog للحالات الجوية، وheat وcold وwind للتنبيهات المُشتقّة.

https://navvo.io/uploads/weather-icons/{slug}-{light|dark}.svg
  • ملفات SVG بمقاس 24 × 24 بلا أي مراجع خارجية، فيمكن تخزينها مؤقتًا أو تلوينها أو تحويلها إلى نقطية بأي حجم.
  • الروابط مطلقة لأن الملفات تُقدَّم من جذر الموقع لا من تحت /api/v1؛ فحلّ مسار نسبي على بادئة الواجهة يعطي 404.
  • اختر النسخة حسب سِمة واجهتك، لا حسب الليل والنهار — فالليل والنهار محمولان في المُعرِّف أصلًا: تُعيد السماء الصافية clear نهارًا وclear-night بعد الغروب.
  • قد يكون icon أدقّ من النص الوصفي: يُعاد partly للسماء الصافية جزئيًا والغائمة جزئيًا، وكلاهما يُقرأ «غيوم» على المستوى الأعمّ.
  • تعامل مع قائمة المُعرِّفات على أنها مفتوحة؛ قد تُضاف عائلات جديدة، فارجع إلى cloud عند قيمة غير معروفة بدل الفشل.
  • تحمل مضلَّعات الطقس (/map/weather/geojson) الأيقونات مرة واحدة في metadata.icons مفهرسةً بنوع الطقس، بدل تكرار رابطين على كل خلية من آلاف الخلايا. أما نقاط MVT الثنائية وبلاطات SVG المُصيَّرة فلا تحمل أيقونات — فهي بكسلات أصلًا.

GET /map/weather/point

الطقس النقطي الحالي (من خدمة الطقس الخاصة بـ Navvo).

lat
number required
خط العرض.
lng
number required
خط الطول (lon مقبول أيضًا).
units
string
metric (افتراضي) أو imperial.
{
  "ok": true, "lat": 31.95, "lon": 35.91, "city": "Amman",
  "temperature": 28, "unit": "C", "feelsLike": 30, "humidity": 35,
  "windSpeed": 12, "windUnit": "km/h", "visibility": 16, "visibilityUnit": "km",
  "condition": "Clear sky",
  "aqi": 40, "aqiCategory": "Good", "pm25": 9, "pm10": 16, "dust": 1,
  "source": "Navvo weather point service"
}

تحمل الاستجابة أيضاً جودة هواء حيّة: aqi (مؤشر AQI الأمريكي)، وaqiCategory (Good…Hazardous)، وpm25/pm10 (ميكروغرام/م³)، وdust (ميكروغرام/م³، تركيز الغبار الصحراوي). وتكون null إذا تعذّر مصدر جودة الهواء مؤقتاً. تُعيد نقطة النهاية هذه 400 عند إحداثيات غير صالحة؛ بينما تُعيد إخفاقات المصدر الأعلى 200 مع ok:false.

GET /map/weather/forecast

توقّعات الطقس بالساعة لنقطة — الساعات N القادمة (افتراضي 24، أقصى 72).

lat
number required
خط العرض.
lng
number required
خط الطول (يُقبَل lon أيضاً).
hours
number
عدد الساعات المُعادة (افتراضي 24، أقصى 72).
units
string
metric (افتراضي) أو imperial.
{
  "ok": true, "lat": 31.95, "lon": 35.91, "city": "Amman",
  "units": "metric", "unit": "C", "windUnit": "km/h", "hours": 6,
  "forecast": [
    { "time": "2026-06-27T19:00:00.000Z", "temperature": 22.8, "condition": "Clear", "precipitationMm": 0, "windSpeed": 9, "humidity": 38 },
    { "time": "2026-06-27T20:00:00.000Z", "temperature": 22, "condition": "Clear", "precipitationMm": 0, "windSpeed": 8, "humidity": 41 }
  ]
}
الحقلالنوعملاحظات
forecast[].timestringساعة ISO
forecast[].temperaturenumberبوحدة unit (C/F)
forecast[].conditionstringتسمية بشرية
forecast[].precipitationMmnumber | nullالمطر في الساعة
forecast[].windSpeednumberبوحدة windUnit

400 عند إحداثيات غير صالحة؛ وإخفاقات المصدر الأعلى تُعيد 200 مع ok:false وforecast فارغة.

GET /map/weather/alerts

تحذيرات طقس مُشتقّة لنقطة — تفحص الساعات N القادمة من التوقّعات وتعيد تنبيهات عند تجاوز العتبات: حرارة (≥37°م، مهمّة خصوصاً للمنطقة)، برد/تجمّد (≤1°م)، مطر غزير (≥4مم/س)، ورياح قوية (≥40كم/س). يحمل كل تنبيه severity (moderate/high/severe) وقيمة الذروة والساعة التي يقع فيها.

?lat=&lng=&hours= (افتراضي 24، أقصى 72).

{
  "ok": true, "provider": "navvo-weather", "lat": 24.63, "lon": 46.72, "city": "…",
  "checkedHours": 48, "count": 1,
  "alerts": [
    { "type": "heat", "severity": "severe", "message": "High temperatures up to 43°C", "valueC": 43, "at": "2026-06-28T12:00:00.000Z" }
  ]
}

count: 0 (وalerts فارغة) يعني عدم تجاوز أي عتبة في النافذة. و400 عند إحداثيات غير صالحة.

GET /map/weather/cities

دبابيس طقس للمدن والبلدات داخل المنطقة المعروضة — تُستخدم لعرض الأحوال الحالية على الخريطة عند تكبير مستوى المدينة. تُعيد FeatureCollection من النقاط؛ ولا تكون ذات معنى إلا عند zoom ≥ 7 (المستويات الأقل تُعيد مجموعة فارغة بسرعة)، والعدد محدود ليبقى المشهد مقروءًا.

bbox
string required
حدود المنطقة west,south,east,north.
zoom
number required
مستوى التكبير الحالي (< 7 يُعيد فارغًا).
units
string
metric (افتراضي) أو imperial.
limit
number
أقصى عدد دبابيس (يتدرّج تلقائيًا مع التكبير؛ الحد الأقصى 24).
{
  "type": "FeatureCollection",
  "features": [
    { "type": "Feature", "geometry": { "type": "Point", "coordinates": [35.93, 31.95] },
      "properties": { "name": "Amman", "temperature": 30, "unit": "C", "condition": "Clear",
        "code": 0, "icon": "clear", "color": "#386BFF" } }
  ],
  "metadata": { "layerType": "weather_cities", "name": "Weather", "hasData": true }
}

الحقل icon عائلة محايدة — إحدى clear أو cloud أو rain أو storm أو snow أو fog — وcode مكافئها الرقمي (0–5).

GET /map/airquality/cities

دبابيس جودة الهواء (مؤشر AQI الأمريكي + الغبار) للمدن والبلدات داخل المنطقة المعروضة — وهي نظير /map/weather/cities لعرض جودة الهواء على الخريطة عند تكبير مستوى المدينة. تُعيد FeatureCollection من النقاط؛ ولا تكون ذات معنى إلا عند zoom ≥ 7، والعدد محدود (الحد الأقصى 20). القيم مخزَّنة مؤقتًا ~15 دقيقة لكل خلية.

bbox
string required
حدود المنطقة west,south,east,north.
zoom
number required
مستوى التكبير الحالي (< 7 يُعيد فارغًا).
limit
number
أقصى عدد دبابيس (يتدرّج تلقائيًا مع التكبير؛ الحد الأقصى 20).
{
  "type": "FeatureCollection",
  "features": [
    { "type": "Feature", "geometry": { "type": "Point", "coordinates": [35.92, 31.95] },
      "properties": { "name": "Amman", "aqi": 40, "aqiCategory": "Good",
        "pm25": 10, "pm10": 16, "dust": 1 } }
  ],
  "metadata": { "layerType": "air_quality_cities", "name": "Air quality", "hasData": true }
}

aqi هو مؤشر جودة الهواء الأمريكي؛ وaqiCategory فئته (Good، Moderate، Unhealthy (sensitive)، Unhealthy، Very unhealthy، Hazardous). أما pm25/pm10/dust فبوحدة µg/m³. والقيم نفسها لكل نقطة تغذّي حقلَي aqi/dust في /map/weather/point.


مخاطر المسار والإنفاذ

قيِّم مسارًا مقابل الأحوال الحية عبر خمس طبقات — حركة المرور، الطقس، الحوادث، مناطق اللوجستيات، وأصول الإنفاذ (الكاميرات/الإشارات) — باستخدام تقاطع الهندسة.

POST /map/route-risk

النطاق: routing.

جسم الطلب

geometry
object | array required
هندسة المسار. تقبل LineString/Feature/FeatureCollection بصيغة GeoJSON، أو مصفوفة خام من أزواج [lng, lat]، أو أي كائن يحوي حقل coordinates. (يُقبَل route كاسم بديل.)
routeId
string
يُعاد ذكره في الاستجابة. القيمة الافتراضية preview.
timeOffset
string
-1h، أو now (افتراضي)، أو +1h، أو +3h — أي لقطة طقس يُقيَّم مقابلها.
{
  "routeId": "trip-42",
  "timeOffset": "+1h",
  "geometry": { "type": "LineString", "coordinates": [[35.91,31.95],[35.93,31.97],[35.95,31.99]] }
}

الاستجابة (200)

{
  "ok": true,
  "routeId": "trip-42",
  "hasRouteGeometry": true,
  "timeOffset": "+1h",
  "scores": { "overall": 24, "traffic": 40, "weather": 10, "incidents": 0, "logistics": 32, "cameras": 16 },
  "severity": "low",
  "stack": [
    { "key": "traffic", "label": "Traffic speed", "score": 40, "severity": "medium", "detail": "Moderate congestion exposure on this route.", "count": 3 }
  ],
  "warnings": [
    { "type": "traffic", "severity": "high", "title": "Heavy traffic segment", "detail": "18 km/h average · 42 samples", "location": { "lng": 35.93, "lat": 31.97 } },
    { "type": "logistics", "severity": "medium", "title": "Amman core congestion SLA", "location": { "lng": 35.91, "lat": 31.97 } }
  ]
}
الحقلالوصف
scores0–100 لكل طبقة إضافةً إلى overall مرجَّح.
severitylow / medium / high مشتقة من الدرجة الإجمالية.
stack[]تفصيل لكل طبقة (score، severity، detail، count، source).
warnings[]مخاطر محددة على امتداد المسار، لكل منها مرساة موقع location على هيئة { lng, lat }.
يوجد أيضًا GET /map/route-risk (النطاق tiles) يأخذ المسار عبر سلسلة استعلام coords من أزواج lng,lat مفصولة بـ ; — مفيد للمعاينات السريعة دون جسم طلب.

POST /map/route-enforcement

النطاق: routing. تُعيد فقط نقاط تفتيش الإنفاذ (كاميرات السرعة، كاميرات حركة المرور، إشارات المرور) على امتداد المسار. جسم الطلب نفسه الخاص بمخاطر المسار.

{
  "ok": true,
  "routeId": "trip-42",
  "count": 2,
  "items": [
    { "id": "speed_camera-0", "type": "speed_camera", "title": "Amman central speed camera", "detail": "Speed camera on or near route · 60 km/h", "confidence": 0.84, "location": { "lng": 35.92, "lat": 31.96 } }
  ]
}
Copyright © 2026