{"id":1390,"date":"2019-06-06T13:31:59","date_gmt":"2019-06-06T11:31:59","guid":{"rendered":"https:\/\/icn-isn-boissy.yj.fr\/wp\/?page_id=1390"},"modified":"2025-04-04T08:31:55","modified_gmt":"2025-04-04T06:31:55","slug":"calculs-ditineraires","status":"publish","type":"page","link":"https:\/\/icn-isn-boissy.yj.fr\/wp\/sciences-numeriques-et-technologie\/localisation-cartographie-et-mobilite\/calculs-ditineraires\/","title":{"rendered":"Calculs d\u2019itin\u00e9raires"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\n\t\t\t\tComme vous avez pu le constater quand vous avez travaill\u00e9 sur Open \nStreet Map, il est possible de d\u00e9finir les voies de communication \n(principalement les routes). La base de donn\u00e9es\n\t\t\t\tOSM contient donc les routes (enfin, la plupart des routes&#8230;). En \nutilisant ces donn\u00e9es, il est possible de d\u00e9velopper des outils capables\n de calculer des itin\u00e9raires routiers\n\t\t\t\t(comme le propose tous les logiciels \u00ab\u00a0GPS\u00a0\u00bb : Waze, ViaMichelin, \nMappy&#8230;) : vous renseignez votre lieu de d\u00e9part, votre lieu d&rsquo;arriv\u00e9e \npuis le logiciel calcule votre itin\u00e9raire.\n\t\t\t\tCe calcul d&rsquo;itin\u00e9raire repose sur des algorithmes relativement \ncomplexes, par exemple l&rsquo;algorithme de Dijkstra qui permet d&rsquo;obtenir le \nplus court chemin entre deux points.\n\t\t\t<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 1<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> Sans entrer dans les d\u00e9tails, l&rsquo;algorithme de Dijkstra travaille sur  des graphes (chaque ville est un sommet du graphe et chaque route est  une ar\u00eate du graphe), visionnez cette vid\u00e9o pour en savoir plus. <\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Algorithme de Dijkstra\" width=\"474\" height=\"356\" src=\"https:\/\/www.youtube.com\/embed\/JPeCmKFrKio?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 2<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\n\t\t\t\tExpliquez en quelques lignes le principe de l&rsquo;algorithme de Dijkstra.\n\t\t\t<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"> La biblioth\u00e8que Python <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/MKuranowski\/pyroutelib3\" target=\"_blank\">pyroutelib3<\/a> propose des \u00ab\u00a0outils\u00a0\u00bb pour calculer des itin\u00e9raires \u00e0 partir des donn\u00e9es d&rsquo;Open Street Map. Merci \u00e0  <strong>Mikolaj Kuranowski<\/strong> pour le d\u00e9veloppement de cette biblioth\u00e8que et le support apport\u00e9 pour l&rsquo;application suivante.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 3<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Cr\u00e9ez dans votre r\u00e9pertoire g\u00e9olocolisation un dossier, nomm\u00e9 \u00ab\u00a0<strong>itin<\/strong>\u00ab\u00a0. Ouvrez ensuite l&rsquo;\u00e9diteur<strong> Thonny<\/strong>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Installer la biblioth\u00e8que:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>pyroutelib3<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette instruction permet d&rsquo;installer la biblioth\u00e8que <strong>pyroutelib3<\/strong> et l&rsquo;utiliser dans le programme ci-dessous.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 4<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> En utilisant le logiciel <strong>Thonny<\/strong>, saisir le code ci-dessous.  Enregistrez le fichier contenant ce code dans le dossier \u00ab\u00a0<strong>itin<\/strong>\u00ab\u00a0. Testez  ensuite ce programme. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nfrom pyroutelib3 import Router\nrouter = Router(\"car\")\ndepart = router.findNode(45.24938,4.67202)\narrivee = router.findNode(45.28690,4.72849)\nstatus, route = router.doRoute(depart, arrivee)\nif status == 'success':\n    routeLatLons = list(map(router.nodeLatLon, route))\nprint(routeLatLons)\n\t\t\t<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si cela ne fonctionne pas, vous faites une copie d&rsquo;\u00e9cran ( probl\u00e8me de biblioth\u00e8te actuellement).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois l&rsquo;ex\u00e9cution du programme termin\u00e9e (<strong>cela peut prendre  quelques minutes !!)<\/strong>, \u00e0 l&rsquo;aide de l'\u00a0\u00bbexplorateur de variables\u00a0\u00bb de <strong>Thonny<\/strong>, visionnez le contenu des variables . Pour cela, taper le nom de la variable dans la fen\u00eatre de commandes (droite) de l&rsquo;\u00e9diteur <strong>Thonny<\/strong>. Comme vous pouvez le constater, cette variable contient une liste de couples de valeurs (latitude, longitude). Cette liste contient donc les coordonn\u00e9es des diff\u00e9rents points par lesquels il faut passer pour se rendre du point de d\u00e9part jusqu&rsquo;au point d&rsquo;arriv\u00e9e (en passant bien \u00e9videmment par les routes d\u00e9finies dans Open Street Map).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"> Quelques explications sur le programme propos\u00e9 dans le \u00ab\u00a0\u00c0 faire vous-m\u00eame 4\u00a0\u00bb : <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Nous commen\u00e7ons par importer la biblioth\u00e8que \u00ab\u00a0pyroutelib3\u00a0\u00bb avec la premi\u00e8re ligne \u00ab\u00a0<em>from pyroutelib3 import Router<\/em>\u00a0\u00bb <\/li>\n\n\n\n<li> La deuxi\u00e8me ligne permet de d\u00e9finir le v\u00e9hicule qui sera utilis\u00e9  pour effectuer le trajet. Dans notre cas, nous utilisons une voiture  (\u00ab\u00a0<em>car<\/em>\u00ab\u00a0), mais il est possible de choisir d&rsquo;autres moyens de transport : cycle, foot, horse, tram,  train <\/li>\n\n\n\n<li> Les 2 lignes suivantes permettent de d\u00e9finir le point de d\u00e9part et  le point d&rsquo;arriv\u00e9e. Nous avons \u00ab\u00a0<em>router.findNode(latitude, longitude)<\/em>\u00ab\u00a0,  il suffit de renseigner la latitude et la longitude du lieu. <\/li>\n\n\n\n<li> La ligne \u00ab\u00a0<em>status, route = router.doRoute(depart, arrivee)<\/em>\u00a0\u00bb permet d&rsquo;effectuer le calcul de l&rsquo;itin\u00e9raire. <\/li>\n\n\n\n<li> La derni\u00e8re ligne est ex\u00e9cut\u00e9e uniquement si le calcul est men\u00e9 \u00e0  son terme (\u00ab\u00a0if\u00a0\u00bb de la ligne pr\u00e9c\u00e9dente). La variable \u00ab\u00a0<em>routeLatLons<\/em>\u00a0\u00bb  contient la liste des coordonn\u00e9es des points de cheminement (points qui  constituent le chemin entre le point de d\u00e9part et le point d&rsquo;arriv\u00e9e) <\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 5<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> Modifiez le programme du <strong>\u00c0 faire vous-m\u00eame 4<\/strong>, pour calculer le  trajet entre <strong>St F\u00e9licien<\/strong> (45.0865,4.6276)  et <strong>La Louvesc <\/strong>(45.1202,4.5343) avec comme moyen de transport<strong> le v\u00e9lo<\/strong> (v\u00e9hicule = \u00ab\u00a0cycle\u00a0\u00bb).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\n\t\t\t\tAvoir une liste de coordonn\u00e9es, c&rsquo;est d\u00e9j\u00e0 pas mal, mais cette liste\n n&rsquo;est pas tr\u00e8s exploitable telle quelle. Nous allons donc utiliser ce \nque nous avons d\u00e9j\u00e0 vu pr\u00e9c\u00e9demment sur la cr\u00e9ation de cartes.\n\t\t\t<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 6<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> Testez le programme ci-dessous (une fois le programme Python  ex\u00e9cut\u00e9, ouvrez avec un navigateur web le fichier \u00ab\u00a0<strong>maCarte_6.html<\/strong>\u00ab\u00a0). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from pyroutelib3 import Router\nimport folium\n\nrouter = Router(\"car\")\ndepart = router.findNode(45.24938,4.67202)\narrivee = router.findNode(45.28690,4.72849)\nstatus, route = router.doRoute(depart, arrivee)\nif status == 'success':\n    routeLatLons = list(map(router.nodeLatLon, route))\n    \nliste_points=&#91;]\nc= folium.Map(location=&#91;45.26072, 4.70264],zoom_start=13)\nfor coord in routeLatLons:\n    liste_points.append(coord)\nfolium.PolyLine(liste_points, color=\"blue\", weight=5, opacity=0.8).add_to(c)\nc.save('maCarte_6.html')<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\n\t\t\t\tLe programme ci-dessous ne devrait pas vous poser trop de probl\u00e8mes. Seule nouveaut\u00e9, la boucle \u00ab\u00a0for\u00a0\u00bb :\n\t\t\t<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for coord in routeLatLons:\n    liste_points.append(coord)\nfolium.PolyLine(liste_points, color=\"blue\", weight=5, opacity=0.8).add_to(c)\t\t\t<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> qui permet de parcourir la liste de coordonn\u00e9es (contenue dans la  variable \u00ab\u00a0routeLatLons\u00a0\u00bb) et de tracer une ligne bleue entre chaque point de la liste.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Faites une copie d&rsquo;\u00e9cran de la carte OSM ainsi cr\u00e9\u00e9e avec la ligne d&rsquo;itin\u00e9raire. Ins\u00e9rer l\u00e0 dans votre CR.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u00c0 faire vous-m\u00eame 7<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"> Modifiez le programme du <strong>\u00c0 faire vous-m\u00eame 6<\/strong> pour qu&rsquo;apparaisse  sur une carte l&rsquo;itin\u00e9raire  entre <strong>St F\u00e9licien <\/strong>et <strong>La Louvesc<\/strong>  en<strong> v\u00e9lo<\/strong> (cycle).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Faites une copie d&rsquo;\u00e9cran de la carte OSM ainsi cr\u00e9\u00e9e avec la ligne d&rsquo;itin\u00e9raire. Ins\u00e9rer l\u00e0 dans votre CR.<\/p>\n\r\n","protected":false},"excerpt":{"rendered":"<p>Comme vous avez pu le constater quand vous avez travaill\u00e9 sur Open Street Map, il est possible de d\u00e9finir les voies de communication (principalement les routes). La base de donn\u00e9es OSM contient donc les routes (enfin, la plupart des routes&#8230;). En utilisant ces donn\u00e9es, il est possible de d\u00e9velopper des outils capables de calculer des &hellip; <a href=\"https:\/\/icn-isn-boissy.yj.fr\/wp\/sciences-numeriques-et-technologie\/localisation-cartographie-et-mobilite\/calculs-ditineraires\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Calculs d\u2019itin\u00e9raires<\/span>  <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1385,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1390","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/pages\/1390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/comments?post=1390"}],"version-history":[{"count":24,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/pages\/1390\/revisions"}],"predecessor-version":[{"id":4271,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/pages\/1390\/revisions\/4271"}],"up":[{"embeddable":true,"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/pages\/1385"}],"wp:attachment":[{"href":"https:\/\/icn-isn-boissy.yj.fr\/wp\/wp-json\/wp\/v2\/media?parent=1390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}