Files
maps-saas/infrastructure/docker/graphhopper/config.yml
T
Hamza-Ayed 3a49029ee4 fix(routing): allow bidirectional travel on two-way corridors
- u_turn_costs: 60 (was infinite -> U-turns forbidden -> huge detours)
- distance_influence 70 -> 20, de-prioritise service/living_street/track
- restore safe ignored_highways (was "" -> footways imported, bad snapping)
- profiles_ch -> profiles_lm (edge-based CH too heavy with turn_costs)
- server port 8989 -> 8080 to match compose mapping, healthcheck and API
- add normalize-oneway + check-bidirectional tooling
2026-07-26 15:35:55 +03:00

77 lines
4.3 KiB
YAML

# --------------------------------------------------------------------------
# GraphHopper v11 — إعدادات محرك التوجيه
#
# ملاحظة جوهرية عن الاتجاهات (oneway):
# الاتجاه المسموح لكل حافة (edge) يُحسب مرة واحدة أثناء الاستيراد من وسوم OSM
# (oneway / oneway:motorcar / junction=roundabout ...). لا يمكن لأي custom_model
# هنا أن يفتح اتجاهاً مغلقاً في البيانات. لذلك أي طريق رئيسي ثنائي الاتجاه يظهر
# كأحادي الاتجاه = مشكلة بيانات، وتُعالج قبل البناء عبر:
# infrastructure/scripts/normalize-oneway.sh
# أما الالتفافات الطويلة "للعودة من نفس الطريق" فهي مشكلة إعدادات، وتُعالج هنا
# بواسطة turn_costs.u_turn_costs (كانت لانهائية = ممنوع الالتفاف نهائياً).
# --------------------------------------------------------------------------
graphhopper:
datareader.file: /data/master_map.osm.pbf
graph.location: /data/graph-cache
# كانت "" أي: لا تتجاهل شيئاً — فتُستورد الأرصفة والمسارات كحافات ويقفز عليها
# الـ snapping فيخرج مسار غريب بجانب الشارع. نعيد القيمة الافتراضية الآمنة.
import.osm.ignored_highways: "footway,cycleway,path,pedestrian,steps"
# قائمة واحدة بلا مسافات — GraphHopper يفصل على الفاصلة فقط
graph.encoded_values: road_class,road_environment,max_speed,road_access,surface,roundabout,lanes
profiles:
- name: car
# قيود الدوران الحقيقية من OSM (no_left_turn ...) مع تكلفة محدودة
# للالتفاف 180°. بدون u_turn_costs تكون التكلفة لانهائية، فيرفض المحرك
# أي عودة على نفس الطريق ويولّد التفافات ضخمة.
turn_costs:
vehicle_types: [motorcar, motor_vehicle]
u_turn_costs: 60 # ثانية — يسمح بالالتفاف عند فتحات الجزيرة الوسطية دون تفضيله
custom_model:
# 70 ث/كم كانت تدفع المحرك لاختيار الأقصر جغرافياً (حواري وطرق خدمة)
# على حساب الشارع الرئيسي. 20 توازن بين الزمن والمسافة.
distance_influence: 20
speed:
# القاعدة العامة أولاً ثم التخصيص؛ limit_to يأخذ الأدنى دائماً.
# (قاعدة MOTORWAY/TRUNK القديمة بـ 60 كانت بلا أثر لأن العام 60 أصلاً)
- if: "true"
limit_to: 60
- if: "road_class == PRIMARY"
limit_to: 45
- if: "road_class == SECONDARY"
limit_to: 28
- if: "road_class == TERTIARY"
limit_to: 20
- if: "road_class == RESIDENTIAL || road_class == UNCLASSIFIED"
limit_to: 14
- if: "road_class == LIVING_STREET || road_class == SERVICE"
limit_to: 14
priority:
# تفضيل الشرايين الرئيسية بدل قصّ الطريق عبر الأحياء
- if: "road_class == LIVING_STREET"
multiply_by: 0.5
- if: "road_class == SERVICE"
multiply_by: 0.6
- if: "road_class == TRACK"
multiply_by: 0.3
# CH مُعطّل: مع turn_costs يصبح البناء edge-based ويستهلك ذاكرة كبيرة على
# ملف مدمج (الأردن+سوريا+مصر)، كما أن الـ API يرسل ch.disable في كل طلب
# يحتوي custom_model أو alternative_route أصلاً. LM يعطي السرعة المطلوبة.
profiles_ch: []
profiles_lm:
- profile: car
routing.non_ch.max_visited_nodes: 2000000
server:
application_connectors:
- type: http
# 8080 داخل الحاوية: docker-compose يعرّض 8989:8080، والـ healthcheck
# و GRAPH_HOPPER_URL في الـ API يستهدفان 8080. القيمة القديمة (8989)
# كانت تخالف الثلاثة.
port: 8080
bind_host: 0.0.0.0