Accueil / Blog / Métier / Calcul d'itinéraires piétons avec OSRM

Calcul d'itinéraires piétons avec OSRM

Par Frédéric Bonifas — publié 02/02/2018, édité le 19/06/2018
Cet article présente différentes techniques utilisées dans le cadre du projet MoodWalkR pour adapter le moteur de calcul d'itinéraires OSRM au déplacement piéton.
Calcul d'itinéraires piétons avec OSRM

www.moodwalkr.com

Pondération de l'itinéraire en fonction de l'environnement traversé

Le but d'un déplacement piéton n'étant pas uniquement d'aller le plus rapidement d'un point à un autre, nous avons souhaité pondérer les itinéraires en fonction de l'environnement traversé. Cela permet de proposer des alternatives privilégiant les espaces naturels, ou le patrimoine historique par exemple.

Un article de blog de Mapbox présente une technique pour requêter directement une base PostGIS lors de la création du réseau routier. Nous avons préféré passer par un fichier raster représentant le poids de chaque profil sur une grille pour plusieurs raisons :

  • Éviter de nombreuses requêtes en base lors de la création du réseau routier
  • Stocker ce raster, qui évolue moins vite que le réseau routier, et ainsi s'abstenir de conserver une base de données
  • Pré-calculer ce raster, éventuellement sur une autre machine que celle utilisée pour le calcul du graphe routier
  • Le raster est lu nativement par OSRM.

Pour créer ce raster, le fichier OSM duquel les informations sont extraites est lu avec Osmium. Les objets intéressants pour le profil sont stockés dans un tableau (par exemple, les cours d'eau et les espaces verts pour le profil nature). Ce tableau est ensuite converti en raster grâce à Rasterio. Cela nous a donné l'occasion de proposer une pull request pour ajouter la rasterisation cumulative de différentes formes sur un même raster.

/blog/metier/2018/profils-moodwalkr/image

Traversée d'un espace ouvert

OSRM est particulièrement efficace pour calculer des itinéraires sur un réseau routier composé uniquement d'arêtes. Nous avons cependant souhaité prendre en compte une spécificité majeure du déplacement piéton : la marche est possible sur un espace ouvert tel qu'une place. Cela n'est pas encore implémenté dans OSRM, et une issue est ouverte sur le sujet depuis 2011.

Pour atteindre cet objectif, nous avons pré-calculé le graphe de visibilité de chaque polygone considéré comme traversable par un piéton. Les bindings Python de la bilbiothèque Osmium ont été utilisés, permettant de lire le fichier au format .osm.pbf en entrée, et de produire un fichier dans le même format en sortie. Les traitements ont ensuite été réalisés avec Shapely. Les différentes opérations permettant de calculer le graphe de visibilité sont les suivantes :

  • un premier parcours des ways permet d'identifier et d'indexer les barrières qui sont un obstacle au déplacement sur un milieu ouvert

  • un deuxième parcours des areas permet de créer les arêtes qui seront ensuite considérées comme faisant partie du réseau routier. Une arête est créée entre chaque point du contour du polygone avec les autres points du contour, ainsi qu'avec les points des trous du polygone. Ces arêtes sont conservées si elles remplissent un certain nombre de conditions, et notamment si :

    • elles n'intersectent pas un obstacle (en recherchant dans l'index créé lors du premiers parcours)
    • elles ne sortent pas du polygone
    • elles ne croisent pas un trou du polygone

Les arêtes ainsi créées reçoivent les attributs du polygone dont elles sont issues, comme le nom par exemple, puis sont écrites dans le fichier .osm.pbf en sortie.

/blog/metier/2018/espace-ouvert-moodwalkr/image

Prise en compte du dénivelé

La pente des chemins est calculée pour calculer la différence de temps entre le parcours en montée et en descente. Le modèle numérique de terrain SRTM est récupéré puis utilisé lors du calcul du graphe routier par OSRM, en utilisant la Tobler's hiking function pour modéliser la vitesse d'un piéton en fonction de la pente.

function segment_function (segment)
  local sourceData = sources:interpolate(dem_source, segment.source.lon, segment.source.lat)
  local targetData = sources:interpolate(dem_source, segment.target.lon, segment.target.lat)
  local elev_delta = targetData.datum - sourceData.datum

  local slope = 0

  if segment.distance ~= 0 and targetData.datum > 0 and sourceData.datum > 0 then
    slope = elev_delta / segment.distance
  end
  if slope ~= 0 then
    -- Tobler's hiking function
    local speed = segment.distance / segment.duration * 3.6 -- km/h
    speed = (speed + 1) * math.exp(-3.5 * math.abs(slope + 0.05)) -- km/h
    segment.duration = segment.distance / speed * 3.6 -- s
  end
end
/blog/metier/2018/pente-moodwalkr/image

Privilégier les trajets sur trottoirs

La cartographie des trottoirs est très inégale dans OpenStreetMap. Pour permettre à l'itinéraire d'utiliser les trottoirs tout en utilisant la route principale quand ils ne sont pas présents, les chemins qui ne sont pas piétons subissent une légère pénalité lors du calcul du graphe routier OSRM. Cette pénalité n'affecte pas le temps de parcours du chemin.

function Handlers.handle_sidewalks(way,result,data,profile)
  if properties.weight_name == 'pedestrian' then
    local penalty = 1.5
    local highway = way:get_value_by_key("highway")
    if highway == "footway" or
      highway == "pedestrian" then
      penalty = 1.
    end
    result.forward_rate = 1 / penalty
    result.backward_rate = 1 / penalty
  end
end
/blog/metier/2018/trottoirs-moodwalkr/image
ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Retour State of the Map France 2018 Retour State of the Map France 2018 23/07/2018

L'équipe de Makina attendait avec impatience l'événement de l'année, State Of The Map 2018 à ...

MoodWalkR: behind the scenes MoodWalkR: behind the scenes 30/09/2013

Understanding how MoodWalkR computes pedestrian routes.

Ré-ordonner des lignes dans PostGIS avec une requête récursive 09/02/2018

Comment ordonner des lignes les unes à la suite des autres dans PostGIS

Geotrek - 1ère rencontre des utilisateurs 21/12/2016

La communauté Geotrek, regroupant environ 60 personnes, s'est retrouvée le 18 octobre 2016 à ...

Citoyenneté Party-cipative Citoyenneté Party-cipative 10/12/2015

Succès collaboratif pour notre Carto Party du 9 décembre. Événement organisé par l’Institut ...

Nos formations
Formation Leaflet