Makina Blog
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
Actualités en lien
Mini-guide à l’usage des collectivités : l’Open Data, entre nécessité et opportunité
Tout ce que vous avez toujours voulu savoir sur l’Open Data. Petit guide à destination des collectivités pour l’appréhender et se l’approprier.
Une rentrée riche autour de la donnée et des rencontres pour Makina Corpus Territoires
Chaque rentrée apporte son lot d’opportunités pour faire avancer les projets autour de la données au service des territoires. Le calendrier de Makina Corpus en la matière a été particulièrement dense en événements.
GeoDatadays 2024 : retrouvez-nous et participez à nos conférences
Les 19 et 20 septembre, participez aux conférences animées par nos experts SIG aux GeoDataDays 2024, en Pays de la Loire à Nantes.