حركة المرور والحوادث
حركة المرور والحوادث
ازدحام لحظي واعتيادي مستمد بالكامل من شبكة الاستشعار المجهولة الخاصة بـ Navvo (لا يوجد أي تغذية لحركة المرور من طرف خارجي)، وحركة المرور المتوقَّعة لأي مكان ووقت من تحليل Navvo لحركة المرور السابقة في المنطقة، إضافة إلى حوادث الطرق المجمَّعة من المستخدمين.
النطاق المطلوب: traffic (التوجيه المراعي لحركة المرور POST /traffic/route يحتاج إلى كلا النطاقين routing وtraffic).
[lng, lat]. معامل bbox هو west,south,east,north. "بلاطات" خطوط الازدحام تُعيد GeoJSON، وليس بلاطات متجهية ثنائية. مفردات الازدحام: level ∈ free | slow | heavy | standstill؛ congestion ∈ light | moderate | heavy | blocked.GET /traffic/layers
واصف الطبقة وأسطورة الدليل للطبقة الحية لحركة المرور.
{
"layerType": "traffic",
"name": "Live traffic",
"source": "navvo-user-traffic",
"tilePattern": "/api/v1/traffic/lines/tiles/{z}/{x}/{y}",
"summary": "/api/v1/traffic/summary",
"historicalGrid": "/api/v1/traffic/analysed/grid",
"refreshSeconds": 60,
"basisValues": ["current", "historical", "typical", "all-hours-fallback", "none"],
"legend": {
"free": { "label": "Free flow", "color": "#2dbe60" },
"slow": { "label": "Slow", "color": "#f9a825" },
"heavy": { "label": "Heavy", "color": "#e84b36" },
"standstill": { "label": "Standstill", "color": "#a01a12" }
}
}
يشير historicalGrid إلى GET /traffic/analysed/grid، أي حركة المرور المعتادة لكل خلية في الخريطة بأسطورة الألوان نفسها، للطرق التي لا تتوفر لها بيانات حيّة. القيمة current وحدها في basisValues حيّة؛ وكل القيم الأخرى سجلّ تاريخي.
GET /traffic/summary
أحوال حركة المرور ضمن نطاق bbox (أو على مستوى الشبكة كلها إذا حُذف bbox): حيّة من مجسّات Navvo الخاصة حين تغطي العرض، وإلا فما تكون عليه حركة المرور عادةً هناك في هذه الساعة (انظر أدناه)، ولا تُقدَّم على أنها حيّة أبدًا. لكل إجابة ملخص إنجليزي summary وملخص عربي summaryAr، وزوج freshnessLabel / freshnessLabelAr يُعرض بجانبها.
معاملات الاستعلام
west,south,east,north. احذفه لتلخيص جميع الحواف الحالية (البيانات الحيّة فقط: من دون عرض لا يوجد «هنا» يمكن وصفه).{
"source": "navvo-user-traffic",
"bbox": "35.85,31.90,35.99,31.99",
"conditions": {
"hasData": true,
"basis": "current",
"sampleCount": 342,
"sampledSegments": 128,
"confidence": 1,
"congestionScore": 0.42,
"level": "slow",
"congestion": "moderate",
"summary": "Slow moving",
"summaryAr": "حركة بطيئة",
"breakdown": [
{ "level": "free", "congestion": "light", "segments": 60, "share": 46.9 },
{ "level": "slow", "congestion": "moderate", "segments": 40, "share": 31.2 }
]
},
"coverage": { "liveSegments": 128, "typicalSegments": null, "hour": 8, "hourSampleCount": null },
"freshnessAt": "2026-06-09T08:55:00.000Z",
"freshnessLabel": "From Navvo users",
"freshnessLabelAr": "من مستخدمي Navvo"
}
congestionScore هو متوسط مرجَّح بين 0 و1. وsampleCount هو عدد المجسّات التي تقف خلف الإجابة، وsampledSegments عدد مقاطع الطرق التي تغطيها.
لا حركة حيّة في العرض: الصورة المعتادة
عندما لا يغطي أي مجسّ حيّ العرض، يجيب الملخص من حركة المرور المُحلَّلة عند مركز العرض: ما تكون عليه حركة المرور عادةً هناك في هذه الساعة، مع مراعاة نوع اليوم ورمضان والعطل والموسم والطقس. تحمل الإجابة basis: "historical" وsource: "navvo-analysed-traffic"، وهي ليست حيّة أبدًا:
{
"source": "navvo-analysed-traffic",
"bbox": "28.975,41.035,28.995,41.045",
"conditions": {
"hasData": true,
"basis": "historical",
"sampleCount": 0,
"sampledSegments": 0,
"confidence": 1,
"congestionScore": 0.45,
"level": "slow",
"congestion": "moderate",
"summary": "Usually moderate traffic at this hour",
"summaryAr": "ازدحام متوسط عادةً في هذه الساعة",
"breakdown": [ … ],
"historical": {
"country": "TR",
"dayType": "workday",
"holiday": null,
"ramadanPhase": null,
"occasion": null,
"expected": { "speedRatio": 0.657, "level": "moderate", "delayPct": 52 },
"topFactors": [
{ "family": "month", "key": "10", "label": "October", "labelAr": "أكتوبر", "effectPct": -2.2 }
],
"confidence": 1,
"basis": "local"
}
},
"coverage": { "liveSegments": 0, "typicalSegments": null, "hour": 15, "hourSampleCount": null },
"freshnessAt": "2026-10-06T09:16:34.000Z",
"freshnessLabel": "From traffic history — no live data in this view",
"freshnessLabelAr": "من سجل حركة المرور — لا توجد بيانات حيّة في هذا العرض"
}
| الحقل | الوصف |
|---|---|
conditions.level | على تدرّج الألوان الحيّ (free أو slow أو heavy أو standstill)، فتحتفظ النقطة أو الخط بألوان الطبقة الحيّة. |
conditions.summary وsummaryAr | «عادةً … في هذه الساعة»، بصياغة من التدرّج المُحلَّل الأدق (free-flowing وlight وmoderate وheavy وnear standstill). |
conditions.hasData | true: أجاب النموذج. يبقى sampleCount وsampledSegments بقيمة 0 لأنه لا يقف خلف إجابة النموذج أي مجسّ أو مقطع طريق؛ وأدلّتها في historical. |
conditions.historical | expected كما في GET /traffic/analysed؛ وbasis (المستوى الجغرافي الذي أجاب، من local إلى region) وconfidence؛ وdayType وholiday وramadanPhase؛ وoccasion، وسم جاهز للعرض باللغتين مثل { "en": "Eid al-Fitr", "ar": "عيد الفطر" } أو «وقت الإفطار» أو «العطلة المدرسية» (وقيمته null في اليوم العادي)؛ وtopFactors، التأثيرات التي يلاحظها السائق (2% على الأقل)، الأكبر أولًا. |
freshnessAt | وقت تدريب النموذج المستخدَم. |
أما العرض الذي يزيد ضلعه على 3 درجات، أو يقع مركزه خارج المنطقة المغطّاة (الشرق الأوسط)، أو حيث لا يملك النموذج بيانات، فيعود إلى سجل مجسّات Navvo لكل طريق في الساعة الحالية (source: "navvo-typical-traffic" مع basis: "typical"، أو "all-hours-fallback" حين لم تُرصد تلك الساعة قط). وحين لا يتوفر شيء على الإطلاق، يكون hasData بقيمة false وlevel بقيمة null وfreshnessLabel بقيمة "Awaiting Navvo user traffic".
conditions.basis: القيمة current وحدها حيّة. أما historical وtypical وall-hours-fallback فهي سجلّ تاريخي: اعرضها مع freshnessLabel الخاص بها (مثل «من سجل حركة المرور — لا توجد بيانات حيّة في هذا العرض»)، ولا تصفها بأنها «حيّة» أبدًا. وإذا كنت تبدّل السلوك حسب source، فعامِل navvo-analysed-traffic معاملة navvo-typical-traffic. ولتلوين طرق هذا العرض بالطريقة نفسها، استخدم GET /traffic/analysed/grid.GET /traffic/lines/tiles/{z}/{x}/{y}
خطوط الازدحام الحية لبلاطة واحدة، على هيئة GeoJSON FeatureCollection (تقتصر على الحواف المرصودة خلال آخر ~6 ساعات تقريبًا).
curl -s "https://navvo.io/api/v1/traffic/lines/tiles/14/9783/6592" -H "x-api-key: nvvo_YOUR_KEY"
{
"type": "FeatureCollection",
"hasData": true,
"features": [
{
"type": "Feature",
"properties": { "level": "slow", "congestion": "moderate", "color": "#f9a825", "edgeId": "edge-12345", "averageSpeedKph": 22.4, "freeFlowSpeedKph": 50 },
"geometry": { "type": "LineString", "coordinates": [[35.9106, 31.9539], [35.9121, 31.9558]] }
}
]
}
GET /traffic/lines/tile-cover
حساب البلاطات التي تغطي نطاق bbox لطبقة الخطوط الحية، مع روابط جاهزة.
معاملات الاستعلام
west,south,east,north.14.24.{
"layerType": "traffic", "zoom": 14, "capped": false,
"tilePattern": "/api/v1/traffic/lines/tiles/{z}/{x}/{y}",
"tiles": [ { "z": 14, "x": 9783, "y": 6592, "url": "/api/v1/traffic/lines/tiles/14/9783/6592" } ]
}
GET /traffic/predicted/tiles/{z}/{x}/{y}
الازدحام الاعتيادي/المتوقَّع لبلاطة واحدة (متوسطات تاريخية مرجَّحة بعدد العينات)، على هيئة GeoJSON. بنية مطابقة لبلاطة البيانات الحية، لكن properties لكل عنصر تحمل "predicted": true. وهناك مرافق GET /traffic/predicted/tile-cover يعمل مثل tile-cover الخاص بالبيانات الحية، ويقبل إضافةً إلى ذلك طابعًا زمنيًا at بصيغة ISO (يُدمج في الروابط المُعادة).
?at=<ISO> الآن مُحترَمًا على البلاطة نفسها. تُبنى البلاطة من الملف النموذجي المتعلَّم لكل حافة عند الساعة المطلوبة (مع الرجوع إلى طبقة النموذجي لكل الساعات عندما لا توجد عينات لتلك الساعة)، بحيث تختلف معاينة «حركة المرور عند الساعة 8 صباحًا» عن معاينة «حركة المرور عند الساعة 6 مساءً». احذف at للساعة الحالية.POST /traffic/route
حساب مسار وإثراء وقت وصوله المقدَّر ببيانات حركة مرور حية مصدرها Navvo. هذا هو النظير المراعي لحركة المرور لـ POST /routing/route: يحدِّد المسار عبر محرّك التوجيه الخاص بـ Navvo، ويأخذ عينات من الازدحام على امتداد المسار، ويُعيد وقت وصول معدَّلًا حسب حركة المرور إضافةً إلى تقسيم المسار إلى مقاطع ملوَّنة.
النطاقات المطلوبة: routing و traffic.
جسم الطلب
{ "lon": number, "lat": number, "name"?: string }. مطلوب 2 على الأقل.auto (افتراضي)، أو truck، أو bicycle، أو pedestrian، أو motor_scooter.arrivalTime. القيمة الافتراضية هي الوقت الحالي.en-US.[lon, lat]. عند توفيرها، تُؤخذ عينات الازدحام على طول هذا الشكل بالضبط ولا تتم إعادة تخطيط المسار — ما يضمن تطابق segments الملوّنة مع الخط الذي ترسمه (إعادة التخطيط قد تنتج مسارًا مختلفًا عن البديل الذي اختاره المستخدم). تُقبل حتى 10,000 نقطة (يُعاد أخذ العينات داخليًا إلى ≤ 2,000).shape — تُستخدم أساسًا لحساب durationInTrafficSeconds. لا معنى لها إلا مع shape؛ وبدونها تكون حقول الوقت المعدّل صفرًا وتبقى segments الملوّنة هي المفيدة. القيمة التي تُوحي بسرعة غير واقعية تُقصَر بصمت إلى نطاق 15–130 كم/س على امتداد طول الشكل المُرسَل، فلا يمكن لقيمة baseSeconds زائفة أن تُشوّه التأخير/وقت الوصول.{
"locations": [ { "lon": 35.91, "lat": 31.95 }, { "lon": 35.95, "lat": 31.99 } ],
"costing": "auto",
"departureTime": "2026-06-09T08:30:00.000Z"
}
مع هندسة المسار المعروض لديك (يُنصح به عندما ترسم المسار بنفسك):
{
"locations": [ { "lon": 35.91, "lat": 31.95 }, { "lon": 35.95, "lat": 31.99 } ],
"shape": [ [35.91, 31.95], [35.917, 31.958], [35.93, 31.972], [35.95, 31.99] ],
"baseSeconds": 540,
"costing": "auto"
}
الاستجابة (201)
{
"provider": "navvo-user-traffic-routing",
"available": true,
"distanceKm": 6.42,
"baseDurationSeconds": 540,
"durationInTrafficSeconds": 637,
"delaySeconds": 97,
"departureTime": "2026-06-09T08:30:00.000Z",
"arrivalTime": "2026-06-09T08:40:37.000Z",
"traffic": {
"hasData": true,
"congestionScore": 0.33,
"level": "slow",
"trafficFactor": 1.18,
"congestedShare": 50
},
"segments": {
"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "level": "free", "color": "#1A73E8" }, "geometry": { "type": "LineString", "coordinates": [[35.91, 31.95], [35.92, 31.96]] } },
{ "type": "Feature", "properties": { "level": "slow", "color": "#F9A825" }, "geometry": { "type": "LineString", "coordinates": [[35.92, 31.96], [35.95, 31.99]] } }
]
},
"legend": { "free": { "label": "Free", "color": "#1A73E8" }, "slow": { "label": "Slow", "color": "#F9A825" } }
}
| الحقل | الوصف |
|---|---|
baseDurationSeconds | وقت الوصول المقدَّر من محرّك التوجيه الخاص بـ Navvo، دون حركة مرور. |
durationInTrafficSeconds | وقت الوصول المقدَّر معدَّلًا حسب حركة المرور (base × trafficFactor). |
delaySeconds | الوقت الإضافي الناتج عن حركة المرور. |
traffic.trafficFactor | المُضاعِف المطبَّق على المدة الأساسية. |
segments | المسار على هيئة GeoJSON FeatureCollection، ملوَّن حسب الازدحام — اعرضه مباشرةً على الخريطة. |
إذا كان محرّك التوجيه متوقفًا، يكون available بقيمة false، والمُدد تساوي 0، وتكون segments فارغة.
حركة المرور المُحلَّلة
حركة المرور المتوقَّعة لأي مكان في الشرق الأوسط ولأي لحظة: لاحقًا اليوم، أو يوم الخميس القادم الساعة 17:00، أو أول أيام العيد، أو مساء يوم في رمضان، أو صباح عاصف. مصدرها نموذج Navvo لحركة المرور السابقة في المنطقة. كل إجابة تحمل source: "navvo-analysed-traffic" وهي ليست حيّة أبدًا: اعرضها على أنها «عادةً» أو «متوقَّعة»، واستخدم GET /traffic/summary لما يحدث الآن. النطاق المطلوب: traffic.
يتعلّم النموذج سرعةً اعتيادية لكل دور يوم ولكل ساعة. أدوار الأيام هي أول يوم عمل، وأيام العمل التالية، وآخر يوم عمل، ويوما العطلة الأسبوعية، فيُقارَن يوم الأحد في عمّان بيوم الاثنين في إسطنبول مقارنةً متكافئة أيًّا كانت العطلة المحلية. ثم يعدّل تلك السرعة حسب الشهر، والعيد والعطل الرسمية والعطل المدرسية، والساعة التي تلي الإفطار في رمضان، والمطر الغزير والعواصف والغبار. هذه هي التأثيرات التي ثبتت حين دُرِّب النموذج على سنوات سابقة واختُبر على سنة لاحقة؛ أما اليوم السابق للعطلة وبقية ساعات يوم رمضان والمطر الخفيف والضباب والثلج فلم تُحدث فرقًا موثوقًا هناك، لذلك تُذكر في local وweather لكنها لا تغيّر expected. تُحسب العطل ورمضان ووقت الإفطار لكل دولة، فلا تحتاج التواريخ المستقبلية إلى أي مصدر خارجي. وحين يكون تاريخ الشارع قليلًا، تستعير الإجابة من الحيّ ثم المنطقة الحضرية ثم الدولة ثم الإقليم؛ ويبيّن basis المستوى الذي أجاب.
speedRatio هو السرعة المتوقَّعة ÷ سرعة الطريق الحرّ (1 = طريق خالٍ). level ∈ free | light | moderate | heavy | standstill. delayPct هو وقت الرحلة الإضافي مقارنةً بالطريق الحرّ (النسبة 0.5 تعطي 100). basis ∈ local | district | metro | country | region | none. القيمة none تعني أن النموذج لا يملك بيانات هناك بعد: عندها تكون expected بقيمة null، ولا يُعاد خطأ أبدًا. النقطة خارج المنطقة المغطّاة تُعيد 400.GET /traffic/analysed
حركة المرور المتوقَّعة عند نقطة ولحظة واحدة.
معاملات الاستعلام
Z أو فرق توقيت عن UTC يكون هو تلك اللحظة. ومن دون فرق توقيت (2026-10-09T08:00) يكون بالتوقيت المحلي عند النقطة. الافتراضي: الآن. حتى سنتين مقدمًا.clear | rain | heavy_rain | storm | fog | snow | dust. احذفه لاستخدام التوقعات الجوية (الساعات الـ72 القادمة) أو، للحظات الماضية، الطقس المرصود.{
"source": "navvo-analysed-traffic",
"at": "2026-10-08T14:00:00.000Z",
"country": "JO",
"local": {
"date": "2026-10-08", "time": "17:00", "weekday": "Thursday", "tz": "Asia/Amman",
"dayType": "workday", "dayRole": "last_workday",
"holiday": null, "eve": null, "ramadan": null,
"schoolBreak": false, "approximate": true
},
"weather": { "class": "rain", "source": "forecast" },
"expected": { "speedRatio": 0.48, "level": "heavy", "delayPct": 108 },
"factors": [
{ "family": "weather", "key": "rain", "effectPct": -14.2, "label": "Rain", "labelAr": "مطر" },
{ "family": "month", "key": "10", "effectPct": -1.5, "label": "October", "labelAr": "أكتوبر" }
],
"basis": "metro",
"confidence": 0.58,
"model": { "runId": 12, "trainedAt": "2026-10-06T09:12:00.000Z" }
}
| الحقل | الوصف |
|---|---|
local | التاريخ والوقت المحليان واليوم والمنطقة الزمنية؛ وdayType (workday، weekend، ramadan، ramadan_weekend، holiday_eve، public_holiday، eid، school_break)؛ وdayRole؛ والعطلة أو العطلة التي يسبقها اليوم، بالإنجليزية والعربية؛ وفي رمضان ramadan: { "phase": "pre_iftar", "iftar": "17:41", "minutesToIftar": 52 }؛ وschoolBreak (تقديري)؛ وapproximate، ويُضبط للدول التي تبدأ الأشهر الهجرية برؤية الهلال، حيث قد تختلف التواريخ بيوم. |
weather | فئة الطقس المطبَّقة ومصدرها: scenario (قيمة weather التي أرسلتها)، أو forecast، أو observed، أو none. |
expected | speedRatio وlevel وdelayPct؛ وتكون null حين تكون basis بقيمة none. |
factors | ما أبعد التقدير عن اليوم العادي، الأكبر أولًا. effectPct هو التغيّر في السرعة (-12 = أبطأ بنسبة 12%). label وlabelAr جاهزان للعرض. |
basis وconfidence | مستوى التسلسل الجغرافي الذي جاء منه النمط الاعتيادي، ودرجة ثقة بين 0 و1 بحسب كمية البيانات التاريخية خلفه. |
model | النموذج المستخدَم (runId وtrainedAt)، أو null قبل أول تدريب. |
GET /traffic/analysed/week
سبعة أيام محلية × 24 ساعة عند نقطة، مع أفضل وأسوأ فترتين من ساعتين لكل يوم بين 06:00 و23:00. هذه هي البيانات التي تجيب عن «متى أنطلق؟».
معاملات الاستعلام
YYYY-MM-DD. الافتراضي: اليوم عند النقطة. ضمن سنة من اليوم.{
"source": "navvo-analysed-traffic",
"country": "JO", "tz": "Asia/Amman", "from": "2026-10-06",
"basis": "metro", "confidence": 0.55,
"weather": { "source": "forecast", "note": "Forecast weather is applied to the next 72 hours only." },
"model": { "runId": 12, "trainedAt": "2026-10-06T09:12:00.000Z" },
"days": [
{
"date": "2026-10-06", "weekday": "Tuesday", "dayType": "workday", "dayRole": "workday_3",
"holiday": null, "eve": null, "ramadan": null,
"best": { "from": "10:00", "to": "12:00", "startHour": 10, "speedRatio": 0.81, "level": "light", "delayPct": 23 },
"worst": { "from": "16:00", "to": "18:00", "startHour": 16, "speedRatio": 0.47, "level": "heavy", "delayPct": 113 },
"hours": [
{ "hour": 0, "speedRatio": 0.93, "level": "free", "delayPct": 8, "weather": "clear" }
]
}
]
}
تحتوي hours دائمًا على 24 عنصرًا (يظهر هنا عنصر واحد)؛ والساعة التي لا بيانات لها تكون قيمها null. يُطبَّق الطقس المتوقَّع على الساعات الـ72 القادمة فقط، وتفترض الساعات اللاحقة طقسًا عاديًا. تحتاج الفترة إلى بيانات لساعتيها كلتيهما. وفي اليوم المتجانس تكون worst بقيمة null. وفي رمضان يحمل كل يوم ramadan: { "iftar": "17:41" }.
GET /traffic/analysed/grid
حركة المرور المتوقَّعة لكل خلية geohash في عرض الخريطة في لحظة واحدة، لرسم الطرق التي لا تتوفر لها حركة حيّة. تحمل كل خلية level الخاص بالنموذج وliveLevel: السرعة المتوقَّعة نفسها على عتبات الطبقة الحيّة نفسها، فيمكن رسم الخطوط بأسطورة الألوان الحيّة من GET /traffic/layers. ليست حيّة أبدًا.
معاملات الاستعلام
west,south,east,north، بحدّ أقصى 3 درجات للضلع. العرض الأكبر يُعيد 400: كبّر الخريطة.GET /traffic/analysed؛ ومن دون فرق توقيت يكون بالتوقيت المحلي في العرض. الافتراضي: الآن. يُقرَّب إلى الأسفل لأقرب 5 دقائق.6 لخلايا الشوارع (نحو 1.0 × 0.6 كم في المنطقة) أو 5 لخلايا الأحياء (نحو 4.2 × 4.9 كم). الافتراضي: 6 للعروض حتى نحو 15 × 15 كم، و5 لما هو أكبر.curl -s "https://navvo.io/api/v1/traffic/analysed/grid?bbox=28.975,41.035,28.995,41.045" -H "x-api-key: nvvo_YOUR_KEY"
{
"source": "navvo-analysed-traffic",
"at": "2026-10-06T12:45:00.000Z",
"precision": 6,
"extent": [28.970947, 41.033936, 29.003906, 41.050415],
"cellSize": { "lngDeg": 0.010986328125, "latDeg": 0.0054931640625 },
"truncated": false,
"country": "TR",
"countries": ["TR"],
"local": { "date": "2026-10-06", "time": "15:45", "dayType": "workday", "holiday": null, "ramadan": null },
"weather": { "class": "clear", "source": "forecast" },
"cells": [
{ "g": "sxk97q", "ratio": 0.541, "level": "moderate", "liveLevel": "slow", "basis": "local" },
{ "g": "sxk97w", "ratio": 0.637, "level": "moderate", "liveLevel": "slow", "basis": "local" },
{ "g": "sxk97y", "ratio": 0.435, "level": "heavy", "liveLevel": "heavy", "basis": "local" },
{ "g": "sxk97r", "ratio": 0.591, "level": "moderate", "liveLevel": "slow", "basis": "local" },
{ "g": "sxk97x", "ratio": 0.657, "level": "moderate", "liveLevel": "slow", "basis": "local" },
{ "g": "sxk97z", "ratio": 0.503, "level": "moderate", "liveLevel": "slow", "basis": "local" },
{ "g": "sxk9e2", "ratio": 0.72, "level": "light", "liveLevel": "slow", "basis": "local" },
{ "g": "sxk9e8", "ratio": 0.549, "level": "moderate", "liveLevel": "slow", "basis": "local" },
{ "g": "sxk9eb", "ratio": 0.519, "level": "moderate", "liveLevel": "slow", "basis": "local" }
],
"basis": "local"
}
| الحقل | الوصف |
|---|---|
cells | عنصر لكل خلية لدى النموذج إجابة عنها: g (رمز geohash للخلية)، وratio (السرعة المتوقَّعة ÷ سرعة الطريق الحرّ)، وlevel (free أو light أو moderate أو heavy أو standstill)، وliveLevel (free أو slow أو heavy أو standstill، على عتبات الطبقة الحيّة)، وbasis (من local إلى region). تُستبعد الخلايا الواقعة خارج المنطقة المغطّاة أو التي لا بيانات لها. |
precision وcellSize وextent | دقّة geohash، وحجم الخلية الواحدة بالدرجات، و[west, south, east, north] الذي تغطيه الخلايا: العرض مضبوطًا على خلايا كاملة. |
country وcountries وlocal | الدولة التي تقع فيها معظم الخلايا (تُقرأ كل خلية بساعة دولتها وتقويمها)، وكل الدول في العرض، والتاريخ والوقت المحليان وdayType والعطلة ومرحلة رمضان للدولة الرئيسية. |
weather | الطقس المطبَّق، من التوقعات الجوية عند مركز العرض؛ ويكون source بقيمة "none" حين لم تتوفر في الوقت المناسب. |
basis | أدقّ مستوى جغرافي بين الخلايا، أو none. وحين يكون country أو region تحمل كل الخلايا التقدير العام نفسه: ارسمه باهتًا، أو صِفه بأنه نمط عام. |
truncated | true حين يضم العرض أكثر من 2,500 خلية بهذه الدقة. عندها تُعاد نافذة في وسط العرض، ويبيّن extent حدودها. |
لرسمها، خذ منتصف كل مقطع طريق، واحسب رمز geohash له بدقة precision، ولوّن المقطع بقيمة liveLevel لتلك الخلية. أما العرض الواقع كليًا خارج المنطقة المغطّاة فيُعيد cells: [] مع note، لا خطأً. وتُخزَّن الإجابات مؤقتًا لكل عرض ولكل فترة من 5 دقائق، فإعادة الطلب بعد كل تحريك للخريطة رخيصة.
GET /traffic/analysed/outlook
توقّع مروري من جملة أو جملتين للمدينة الرئيسية في دولة ما في تاريخ محلي، بالإنجليزية أو العربية.
معاملات الاستعلام
JO أو SA أو AE أو QA أو KW أو BH أو OM أو EG أو LB أو PS أو IQ أو SY أو YE أو TR أو IR. الافتراضي JO.YYYY-MM-DD. الافتراضي: اليوم في تلك الدولة.en (الافتراضي) أو ar.{
"source": "navvo-analysed-traffic",
"country": "JO", "scope": "cc:JO", "date": "2026-10-08", "lang": "ar",
"text": "عمّان، الخميس 8 أكتوبر: يوم عمل عادي. يُتوقع أن تكون الطرق أكثر ازدحاماً حوالي الساعة 08:00 (ازدحام متوسط) و16:00 (ازدحام شديد)، وهو قريب من يوم الخميس المعتاد.",
"facts": {
"city": "Amman", "date": "2026-10-08", "weekday": "Thursday", "dayType": "workday",
"holiday": null, "eve": null, "iftar": null,
"busiest": [
{ "time": "08:00", "hour": 8, "level": "moderate", "delayPct": 54 },
{ "time": "16:00", "hour": 16, "level": "heavy", "delayPct": 121 }
],
"vsUsualPct": 0, "basis": "metro", "confidence": 0.55
},
"writer": "template",
"stored": true,
"updatedAt": "2026-10-06T23:41:07.000Z"
}
تُكتب التوقعات لعمّان والرياض ودبي والدوحة ومدينة الكويت والمنامة ومسقط والقاهرة وإسطنبول كل ليلة للأيام السبعة القادمة (stored: true). تكون writer بقيمة navvo-ai حين يكتب الجملةَ نموذجُ Navvo العامل على خوادمها، وtemplate حين يكتبها القالب الثابت. ولا تُنشر الجملة التي كتبها النموذج إلا إذا ورد كل رقم فيها ضمن facts. يقارن vsUsualPct متوسط وقت الرحلة بين 06:00 و23:00 بيوم معتاد له دور اليوم نفسه (القيمة الموجبة = أبطأ). أما الدول والتواريخ الأخرى فتُبنى عند الطلب من الحقائق نفسها (stored: false). وحين لا يملك النموذج بيانات للدولة بعد، تكون text وfacts بقيمة null وbasis بقيمة "none".
GET /traffic/analysed/model
عمليات تدريب النموذج التي تقف خلف هذه الإجابات: آخر خمس عمليات، والنموذج المستخدَم، وحجم جداول الأنماط.
{
"source": "navvo-analysed-traffic",
"model": { "runId": 12, "trainedAt": "2026-10-06T09:12:00.000Z" },
"rows": { "patternBase": 184212, "patternFactors": 96540 },
"runs": [
{ "id": 12, "kind": "grid", "status": "done", "stats": { "rows": 21800000, "baseRows": 184212, "factorRows": 96540 }, "startedAt": "2026-10-06T08:40:00.000Z", "finishedAt": "2026-10-06T09:12:00.000Z" },
{ "id": 11, "kind": "grid-holdout", "status": "done", "stats": { "validation": { "heldOutFrom": "2024-07-01", "maeSpeedRatio": { "model": 0.061, "hourOfDayOnly": 0.083 } } }, "startedAt": "2026-10-06T07:55:00.000Z", "finishedAt": "2026-10-06T08:31:00.000Z" }
]
}
تقيس عملية *-holdout أداء النموذج على أشهر لم يُدرَّب عليها، من دون أن تستبدل النموذج المستخدَم. وvalidation.maeSpeedRatio هو متوسط الخطأ المطلق في speedRatio للنموذج الكامل ولخط أساس أبسط يعتمد على ساعة اليوم فقط. الأرقام أعلاه توضّح البنية فقط؛ اقرأ القيم الفعلية من نقطة النهاية.
الحوادث
حوادث الطرق المجمَّعة من المستخدمين — اختناقات، إغلاقات، حوادث سير، مخاطر، وغيرها. النطاق المطلوب: traffic.
type ∈ jam, closure, accident, hazard, weather, breakdown, speed_check, construction, lane_closure, visibility. والخطورة severity بين 1 و5. تُعاد فقط الحوادث active غير المنتهية الصلاحية.GET /incidents/types
كتالوج أنواع الحوادث المدعومة — لبناء قائمة اختيار "إبلاغ عن حادث". يحمل كل عنصر تسمية بشرية وخطورة افتراضية والعمر الافتراضي (defaultTtlMinutes) وما إذا كان النوع يحجب التوجيه (الأنواع الحاجبة تُلتَفّ حولها؛ والأنواع اللينة تنبّه السائق فقط).
curl -s "https://navvo.io/api/v1/incidents/types" -H "x-api-key: $NAVVO_API_KEY"
{
"provider": "navvo-incidents", "count": 10, "confirmBumpMinutes": 25, "maxTtlMinutes": 720,
"types": [
{ "type": "jam", "label": "Traffic jam", "defaultSeverity": 2, "defaultTtlMinutes": 90, "routeBlocking": false },
{ "type": "closure", "label": "Road closure", "defaultSeverity": 4, "defaultTtlMinutes": 240, "routeBlocking": true },
{ "type": "accident", "label": "Accident", "defaultSeverity": 4, "defaultTtlMinutes": 120, "routeBlocking": true }
]
}
قيم type هي بالضبط ما تقبله POST /incidents وPOST /incidents/report؛ ويصف confirmBumpMinutes/maxTtlMinutes كيف تُمدِّد التأكيداتُ عمرَ الحادث.
GET /incidents
سرد الحوادث النشطة، مرتَّبة حسب الخطورة ثم حسب الأحدث، مع بيانات وصفية للطبقة. عناصر items[] هي الإسقاط ضمن القائمة البيضاء نفسه المستخدَم في POST /incidents (بلا معرِّف مُبلِّغ؛ وmetadata هو { subType?, photoUrl?, source }).
bbox المُشوَّه (ليس west,south,east,north مع west < east وsouth < north) يُعيد 400 "bbox must be west,south,east,north" — حتى عند عدم وجود أي حادث نشط. ويُعامَل bbox= الفارغ على أنه غير موجود.معاملات الاستعلام
west,south,east,north.{
"total": 1,
"items": [
{
"id": "b1f2c3d4-…",
"type": "accident",
"status": "active",
"location": "POINT(35.9106 31.9539)",
"title": "Two-car collision",
"severity": 4,
"expiresAt": "2026-06-09T10:40:00.000Z",
"confirmations": 3,
"rejections": 0
}
],
"metadata": { "layerType": "incidents", "source": "navvo-incidents", "dataUrl": "/api/v1/incidents/geojson", "hasData": true }
}
items[].location هو سلسلة نصية بصيغة WKT؛ وللحصول على إحداثيات مُحلَّلة استخدم نقطة نهاية GeoJSON أدناه.
GET /incidents/geojson
الحوادث النشطة على هيئة FeatureCollection بصيغة GeoJSON (الإحداثيات [lng, lat]). يقبل المرشِّحات نفسها bbox/type/limit/zoom (مع نفس التحقق المسبق من bbox كما في السرد). أصبحت properties لكل عنصر تتضمن الآن photoUrl (نص | null) — دليل مصوَّر مُرفَق وقت البلاغ. يتوفر أيضًا متغيِّر لكل بلاطة GET /incidents/geojson/tiles/{z}/{x}/{y} ومخطِّط تغطية GET /incidents/geojson/tile-cover.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [35.9106, 31.9539] },
"properties": { "id": "b1f2c3d4-…", "type": "accident", "title": "Two-car collision", "severity": 4, "confirmations": 3, "rejections": 0, "photoUrl": null }
}
],
"metadata": { "layerType": "incidents", "hasData": true }
}
POST /incidents
الإبلاغ عن حادث جديد.
جسم الطلب
1–5. القيمة الافتراضية 2.5–1440. القيمة الافتراضية 180.https:// لدليل مصوَّر (بحد أقصى 500 حرف). القيمة غير المبدوءة بـ https أو الأطول من الحد تُعيد 400 "photoUrl must be an https URL". يُخزَّن على الحادث ويظهر كخاصية photoUrl على عنصر GeoJSON.Authorization: Bearer <token> الخاصة بالمستخدم المسجَّل دخوله فيُنسَب البلاغ إلى ذلك المستخدم المُوثَّق. أما الحقل القديم reportedByUserId في الجسم فيُحترَم فقط للطلبات المجهولة وهو مهمَل؛ ولا يُعاد معرِّف المُبلِّغ أبدًا في الاستجابة.{ "type": "hazard", "lat": 31.9539, "lng": 35.9106, "title": "Debris on road", "severity": 3, "ttlMinutes": 120, "photoUrl": "https://cdn.example.com/hazard.jpg" }
تُعيد 201 مع الحادث المُنشأ (status: "active"، وexpiresAt محسوبة من ttlMinutes). الاستجابة هي إسقاط ضمن قائمة بيضاء: { id, createdAt, updatedAt, type, status, location, title, description, severity, expiresAt, confirmations, rejections, metadata }، حيث يحتوي metadata فقط على subType? وphotoUrl? وsource. ويكون title/description بقيمة null (وليس محذوفًا) عند عدم تعيينهما.
POST /incidents/report
مساعد البلاغ الجماعي — مثل POST /incidents لكن مع إزالة تلقائية للتكرار. إذا وُجد حادث نشط من النوع نفسه ضمن ~80م، يُعامَل هذا كـ تأكيد (يرفع confirmations للحادث ويجدّد صلاحيته) بدل إنشاء دبّوس مكرّر — وهو السلوك الصحيح عندما يبلّغ سائقون كثيرون عن الازدحام أو الحادث نفسه. وإلا يُنشأ حادث جديد.
نفس جسم POST /incidents (بما في ذلك photoUrl الاختياري ونسب المستخدم عبر Bearer)، مضافًا إليه dedupMeters اختياري (عدد، 10–500، القيمة الافتراضية 80). يُتحقَّق من الجسم بالكامل الآن: النوع type غير الصالح، أو lat/lng غير الرقمي، أو severity/ttlMinutes خارج النطاق، أو dedupMeters خارج النطاق، يُعيد 400 بدل حفظ بيانات فاسدة. والحادث incident في استجابتَي merged:true وmerged:false هو الإسقاط ضمن القائمة البيضاء نفسه المستخدَم في POST /incidents (بلا تسريب معرِّف مُبلِّغ من حادث مدموج).
curl -s -X POST "https://navvo.io/api/v1/incidents/report" \
-H "x-api-key: $NAVVO_API_KEY" -H "content-type: application/json" \
-d '{ "type": "jam", "lat": 31.97, "lng": 35.92, "severity": 3, "title": "Heavy traffic" }'
{ "provider": "navvo-incidents", "merged": true, "distanceM": 31, "confirmations": 2, "incident": { } }
| الحقل | النوع | ملاحظات |
|---|---|---|
merged | boolean | true إذا دُمج في حادث قريب من النوع نفسه (تأكيد)؛ وfalse إذا أُنشئ جديد |
distanceM | number | (عند الدمج) المسافة إلى الحادث المُطابَق |
confirmations | number | (عند الدمج) عدد تأكيدات الحادث بعد هذا البلاغ |
incident | object | الحادث الناتج |
استخدمه من زرّ "إبلاغ" كي تتجمّع البلاغات المتكرّرة لحدث واحد في دبّوس واحد متزايد التأكيد بدل ازدحام الخريطة.
POST /incidents/{id}/votes
تأكيد حادث أو رفضه (تحقق جماعي). تُعيد 201 مع الحادث المُحدَّث (الإسقاط ضمن القائمة البيضاء — بلا معرِّف مُبلِّغ). الحادث الذي يحصل على 5 رفضات فأكثر (وعدد الرفضات يفوق ضعف التأكيدات) يُوسَم تلقائيًا بـ rejected ويسقط من القوائم. ومعرِّف الحادث غير المعروف يُعيد 404 "Incident not found".
Authorization الخاصة بالمستخدم كي يُنسَب تصويته ويُحتسَب بشكل دائم.جسم الطلب
confirm أو reject.{ "vote": "confirm" }
تعديلات الطرق والإغلاقات
تعديلات الطرق يتم إنشاؤها على منصة Navvo (لوحة العمليات) وهي النظير الرسمي الأطول
عمراً للحوادث الجماعية: إغلاقات الطرق، قيود الوصول، طرق مرسومة مخصّصة،
وتعديلات السمات. التعديلات الفعّالة تظهر على الخريطة وفي هذه الواجهة البرمجية،
وبالنسبة للإغلاقات/القيود تُلتَفّ حولها في التوجيه تلقائياً (انظر
roadEditConstraints في استجابة المسار). كل تعديل قد يكون
دائماً أو مؤقتاً (بنافذة بداية/نهاية).
النطاق المطلوب: tiles
GET /road-edits/geojson
تعديلات الطرق الفعّالة في منطقة العرض على هيئة FeatureCollection بصيغة GeoJSON
بهندسة مختلطة (LineString لمقاطع الطرق، Polygon لإغلاقات المناطق، Point للتعديلات
النقطية). تُعاد فقط التعديلات الفعّالة الآن (التعديل المجدول يظهر بعد مرور وقت بدايته،
والمنتهي أو المعطّل يسقط).
west,south,east,north. احذفها للحصول على الكل (بحد أقصى).curl -s "https://navvo.io/api/v1/road-edits/geojson?bbox=35.8,31.9,36.0,32.0" \
-H "x-api-key: $NAVVO_API_KEY"
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "LineString", "coordinates": [[35.911, 31.954], [35.912, 31.955]] },
"properties": {
"id": "…", "layerType": "road_edits", "editType": "closure", "geometryType": "line",
"name": "Rainbow St closed", "reason": "construction", "status": "active",
"severity": 4, "blocksRouting": true,
"startsAt": null, "endsAt": "2026-07-01T18:00:00.000Z", "permanent": false,
"color": "#DC2626"
}
}
],
"metadata": { "layerType": "road_edits", "name": "Road edits", "source": "navvo-road-edits", "hasData": true }
}
| الخاصية | ملاحظات |
|---|---|
editType | closure · restriction · custom_road · attribute |
geometryType | line · polygon · point |
blocksRouting | عند true يلتفّ التوجيه حول هذا التعديل |
permanent / startsAt / endsAt | نافذة الصلاحية (permanent: true ⇐ بلا نهاية) |
color | لون العرض المقترَح لنوع التعديل |
custom_road هي تعليقات على الخريطة — تُرسَم لكنها غير قابلة للتوجيه (محرّك
التوجيه يسير على رسم بياني مُجهَّز مسبقاً؛ والطريق الجديد القابل للقيادة يحتاج إعادة بناء
الرسم البياني). أما الإغلاقات والقيود والتعديلات فتأخذ مفعولها فوراً.