Makina Blog

Le blog Makina-corpus

Calcul d'itinéraires piétons avec OSRM


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.

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.

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
<https://github.com/Project-OSRM/osrm-backend/issues/64>
.

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.

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

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

Formations associées

Formations SIG / Cartographie

Formation Leaflet

À distance (FOAD) Du 1er au 2 juillet 2024

Voir la formation

Actualités en lien

Image
Capture d'une partie de carte montrant un réseau de voies sur un fond de carte sombre. Au centre, une popup affiche les information de l'un des tronçons du réseau.
28/02/2024

Géné­rer un fichier PMTiles avec Tippe­ca­noe

Exemple de géné­ra­tion et d’af­fi­chage d’un jeu de tuiles vecto­rielles en PMTiles à partir de données publiques.

Voir l'article
Image
Encart article Protomaps : Illustration d'une portion de pyramide de tuiles
14/02/2024

Protomaps, stockez vos pyramides de tuiles plus simplement

Présentation d'un nouveau format de stockage de tuiles cartographiques

Voir l'article
Image
Article : Servir sa couche raster QGIS en tuiles sans effort avec le format PMTiles
25/01/2024

Servir sa couche raster QGIS en tuiles sans effort avec le format PMTiles

Cet article vous présente une approche permet­tant de tuiler et de publier une couche raster fabriquée avec QGIS.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus