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

Toulouse Du 4 au 5 décembre 2024

Voir la formation

Actualités en lien

Image
Guide ODbL
15/11/2024

Mini-guide à l’usage des collec­ti­vi­tés : l’Open Data, entre néces­sité et oppor­tu­nité

Tout ce que vous avez toujours voulu savoir sur l’Open Data. Petit guide à desti­na­tion des collec­ti­vi­tés pour l’ap­pré­hen­der et se l’ap­pro­prier.

Voir l'article
Image
Rentrée 2024
05/11/2024

Une rentrée riche autour de la donnée et des rencontres pour Makina Corpus Terri­toires

Chaque rentrée apporte son lot d’op­por­tu­ni­tés pour faire avan­cer les projets autour de la données au service des terri­toires. Le calen­drier de Makina Corpus en la matière a été parti­cu­liè­re­ment dense en événe­ments.

Voir l'article
Image
Encart GeoDataDays 2024
05/09/2024

GeoDa­ta­days 2024 : retrou­vez-nous et parti­ci­pez à nos confé­rences

Les 19 et 20 septembre, parti­ci­pez aux confé­rences animées par nos experts SIG aux GeoDa­ta­Days 2024, en Pays de la Loire à Nantes.

 

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus