{"id":808,"date":"2019-06-11T09:08:42","date_gmt":"2019-06-11T07:08:42","guid":{"rendered":"https:\/\/geekcommunicant.com\/blog\/?p=808"},"modified":"2019-06-11T09:11:53","modified_gmt":"2019-06-11T07:11:53","slug":"carte-interactive-metro-paris-leaflet","status":"publish","type":"post","link":"https:\/\/geekcommunicant.com\/blog\/2019\/06\/11\/carte-interactive-metro-paris-leaflet\/","title":{"rendered":"Carte interactive du m\u00e9tro de Paris avec Leaflet"},"content":{"rendered":"\n<p>Si on vous parle de solution pour int\u00e9grer une carte sur\nvotre site, la premi\u00e8re qui vous vient \u00e0 l\u2019esprit est surement Google Maps.\nMais il existe plusieurs solutions open-source et gratuites.<\/p>\n\n\n\n<p>Je vous ai d\u00e9j\u00e0 parl\u00e9 d\u2019<a href=\"https:\/\/geekcommunicant.com\/blog\/2019\/04\/08\/remake-carte-openlayers\/\">OpenLayers<\/a>, avec laquelle j\u2019ai d\u00e9j\u00e0 refait une carte r\u00e9alis\u00e9e pr\u00e9c\u00e9demment avec <a href=\"https:\/\/geekcommunicant.com\/blog\/2012\/09\/29\/comment-realiser-une-carte-interactive-1-sur-2\/\">jQuery<\/a>.<\/p>\n\n\n\n<p>Mais OpenLayers n\u2019est pas la librairie open-source la plus utilis\u00e9e. La premi\u00e8re place revient \u00e0 <a href=\"https:\/\/leafletjs.com\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Leaflet (opens in a new tab)\">Leaflet<\/a> (voir sources en fin d\u2019article).<\/p>\n\n\n\n<p>Pour m\u2019exercer, j\u2019ai d\u00e9cider de cr\u00e9er une carte interactive\ndu m\u00e9tro de Paris avec Leaflet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9l\u00e9ments utilis\u00e9s dans la carte<\/h2>\n\n\n\n<p>Pour des questions de lisibilit\u00e9 des diff\u00e9rentes lignes de m\u00e9tro, j\u2019ai choisi d\u2019utiliser le fond de carte <a href=\"http:\/\/maps.stamen.com\/#toner-lite\/12\/37.7706\/-122.3782\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Stamen Toner Lite (opens in a new tab)\">Stamen Toner Lite<\/a>.<\/p>\n\n\n\n<p>Pour le <a href=\"https:\/\/opendata.stif.info\/explore\/dataset\/traces-du-reseau-ferre-idf\/information\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"trac\u00e9 des lignes (opens in a new tab)\">trac\u00e9 des lignes<\/a>, j\u2019ai utilis\u00e9 des donn\u00e9es fournies par le STIF sur opendata.stif.info.<\/p>\n\n\n\n<p>Les <a href=\"https:\/\/data.ratp.fr\/explore\/dataset\/indices-et-couleurs-de-lignes-du-reseau-ferre-ratp\/information\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"codes couleur (opens in a new tab)\">codes couleur<\/a> des diff\u00e9rentes lignes proviennent de la RATP sur data.ratp.fr.<\/p>\n\n\n\n<p>Les <a rel=\"noreferrer noopener\" aria-label=\"coordonn\u00e9es des stations (opens in a new tab)\" href=\"https:\/\/opendata.stif.info\/explore\/dataset\/emplacement-des-gares-idf\/information\/\" target=\"_blank\">coordonn\u00e9es des stations<\/a> proviennent elles aussi du STIF, et de Wikip\u00e9dia pour les <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Stations_fant%C3%B4mes_du_m%C3%A9tro_de_Paris\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"stations fant\u00f4mes (opens in a new tab)\">stations fant\u00f4mes<\/a>.<\/p>\n\n\n\n<p>Le logo utilis\u00e9 comme marqueur de position d\u2019une station\nprovient du site de la RATP.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Mise forme des donn\u00e9es<\/h2>\n\n\n\n<p>Les donn\u00e9es ci-dessus vont \u00eatre rassembl\u00e9es dans deux <em>FeatureCollection<\/em> GeoJSON (une pour le trac\u00e9 des lignes et une pour la position des stations), qui pour des questions de praticit\u00e9 seront stock\u00e9s dans des fichiers s\u00e9par\u00e9s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Trac\u00e9 des lignes<\/h3>\n\n\n\n<p>Chaque ligne est repr\u00e9sent\u00e9e par une <em>feature<\/em> avec une <em>geometry<\/em>\nde type <em>MultiLineString<\/em>. Chacune de\nces <em>features<\/em> poss\u00e8de deux\npropri\u00e9t\u00e9&nbsp;: \u00ab&nbsp;line&nbsp;\u00bb, qui contient le num\u00e9ro de ligne, et\n\u00ab&nbsp;color&nbsp;\u00bb, qui contient le code hexa de la couleur de la ligne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Coordonn\u00e9es des stations<\/h3>\n\n\n\n<p>Chaque station est repr\u00e9sent\u00e9e par une <em>feature<\/em> avec une <em>geometry<\/em>\nde type <em>Point<\/em>. Les propri\u00e9t\u00e9s de\nchacune de ces <em>features<\/em> sont\n\u00ab&nbsp;name&nbsp;\u00bb (nom de la station) et \u00ab&nbsp;about&nbsp;\u00bb (lignes\ndesservant la station).<\/p>\n\n\n\n<!--nextpage-->\n\n\n\n<h2 class=\"wp-block-heading\">Mise en place de la carte de base<\/h2>\n\n\n\n<p>Dans tous les exemples suivants, la carte sera affich\u00e9e dans une div avec l\u2019ID \u00ab map \u00bb, de dimensions de 500 pixels de large sur 375 pixels de haut.<\/p>\n\n\n\n<p>La carte est initialis\u00e9e sur le point z\u00e9ro des routes de France, avec un niveau de zoom \u00e0 12. Ces deux r\u00e9glages sont stock\u00e9s dans deux variables : <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nvar center = &#x5B;48.8502, 2.3488];\nvar zoom = 12;\n<\/pre><\/div>\n\n\n<p>Ensuite, on initialise la map&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nvar map = L.map(&#039;map&#039;,{\n  center: center,\n  zoom: zoom\n});\n<\/pre><\/div>\n\n\n<p>L\u2019\u00e9tape suivante consiste \u00e0 ajouter le fond de carte&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nL.tileLayer(&#039;https:\/\/stamen-tiles-{s}.a.ssl.fastly.net\/toner-lite\/{z}\/{x}\/{y}{r}.{ext}&#039;, {\n  attribution: &#039;Map tiles by &lt;a href=&quot;http:\/\/stamen.com&quot;&gt;Stamen Design&lt;\/a&gt;, &lt;a href=&quot;http:\/\/creativecommons.org\/licenses\/by\/3.0&quot;&gt;CC BY 3.0&lt;\/a&gt; \u2014 Map data \u00a9 &lt;a href=&quot;https:\/\/www.openstreetmap.org\/copyright&quot;&gt;OpenStreetMap&lt;\/a&gt; contributors&#039;,\n  subdomains: &#039;abcd&#039;,\n  minZoom: 0,\n  maxZoom: 20,\n  ext: &#039;png&#039;\n}).addTo(map);\n<\/pre><\/div>\n\n\n<p>Maintenant, il ne nous reste plus qu&rsquo;\u00e0 ajouter nos objets GeoJSON :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nL.geoJson(metro_lines).addTo(map);\n\nL.geoJson(metro_stations).addTo(map);\n<\/pre><\/div>\n\n\n<p>Nous obtenons alors la carte ci-dessous :<\/p>\n\n\n\n<iframe src=\"https:\/\/geekcommunicant.com\/iframes\/leaflet-metro-base.html\" style=\"width:100%;height:425px;\"><\/iframe>\n\n\n\n<!--nextpage-->\n\n\n\n<h2 class=\"wp-block-heading\">Ajoutons notre style<\/h2>\n\n\n\n<p>Cette carte utilise les styles de base de Leaflet, mais pour\nnotre carte, nous voulons que les stations soient indiqu\u00e9es par le M et que les\nlignes soient de la couleur qu\u2019elles ont sur les cartes de la RATP.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Style des lignes<\/h3>\n\n\n\n<p>Pour le style des lignes, en plus de la couleur officielle,\nil faut r\u00e9gler leur poids \u00e0 4. Pour ce faire, au moment de la cr\u00e9ation de la\ncouche des lignes, il faut rajouter une option \u00ab&nbsp;style&nbsp;\u00bb.<\/p>\n\n\n\n<p>Cette option est une fonction qui prend en param\u00e8tre d\u2019entr\u00e9e\nune <em>feature<\/em> GeoJSON et qui retourne un\nstyle.<\/p>\n\n\n\n<p>Dans cette fonction, on r\u00e9cup\u00e8re la propri\u00e9t\u00e9 \u00ab&nbsp;color&nbsp;\u00bb\nde la <em>feature<\/em> pour l\u2019attribut \u00ab&nbsp;color&nbsp;\u00bb\ndu style, et on r\u00e8gle l\u2019attribut \u00ab&nbsp;weight&nbsp;\u00bb du style \u00e0 4.<\/p>\n\n\n\n<p>Cela donne&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nL.geoJson(metro_lines,{\n  style: function(feature){\n    return {color: feature.properties.color, weight:4}\n  }\n}).addTo(map);\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Style des stations<\/h3>\n\n\n\n<p>Pour le style des stations, au moment de la cr\u00e9ation de la couche\ncorrespondante, il faut utiliser l\u2019option \u00ab&nbsp;pointToLayer&nbsp;\u00bb.<\/p>\n\n\n\n<p>La fonction correspondante prend 2 param\u00e8tres d\u2019entr\u00e9e&nbsp;:\nune <em>feature<\/em> GeoJSON et ses coordonn\u00e9es.\nCette fonction retourne un marqueur Leaflet.<\/p>\n\n\n\n<p>\u00c0 ce marqueur on associe une ic\u00f4ne Leaflet qui utilise le logo\n\u00ab&nbsp;M&nbsp;\u00bb en le redimensionnant et en le centrant.<\/p>\n\n\n\n<p>En code cela se traduit par&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nL.geoJson(metro_stations,{\n  pointToLayer: function(feature,latlng){\n    return L.marker(latlng,{\n      icon: L.icon({\n        iconUrl: &#039;\/assets\/files\/images\/symbole_metro.svg&#039;,\n        iconSize: &#x5B;14,14],\n        iconAnchor: &#x5B;7,7]\n      })\n    });\n  }\n}).addTo(map);\n<\/pre><\/div>\n\n\n<p>Une fois ces deux modifications appliqu\u00e9es, nous obtenons le\nr\u00e9sultat suivant&nbsp;:<\/p>\n\n\n\n<iframe src=\"https:\/\/geekcommunicant.com\/iframes\/leaflet-metro-couleurs.html\" style=\"width:100%;height:425px;\"><\/iframe>\n\n\n\n<!--nextpage-->\n\n\n\n<h2 class=\"wp-block-heading\">Ajout d&rsquo;interactivit\u00e9<\/h2>\n\n\n\n<p>Au niveau interactivit\u00e9s nous voulons&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Au survol d\u2019une ligne, qu\u2019elle soit surlign\u00e9e<\/li><li>Au survol d\u2019une station, que son marqueur s\u2019agrandisse<\/li><li>Au survol des 2, affichage dans un encart des informations\nde l\u2019\u00e9l\u00e9ment survol\u00e9<\/li><\/ul>\n\n\n\n<p>Pour l\u2019ajout de ces interactions, pour les deux calques GeoJSON on va utiliser un param\u00e8tre \u00ab&nbsp;onEachFeature&nbsp;\u00bb, qui correspond \u00e0 une fonction ex\u00e9cut\u00e9e pour chaque <em>feature<\/em>.<\/p>\n\n\n\n<p>Cette fonction permet d\u2019attacher des <em>listener<\/em> d\u2019\u00e9v\u00e9nements (dans notre cas, \u00ab&nbsp;mouseover&nbsp;\u00bb et \u00ab&nbsp;mouseout&nbsp;\u00bb).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ajout de l&rsquo;encart<\/h3>\n\n\n\n<p>Mais avant d\u2019ajouter ces interactions, il faut d\u2019abord ajouter\nl\u2019encart. Pour Leaflet, l\u2019encart correspond \u00e0 un contr\u00f4le, qui se cr\u00e9e comme\nceci&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nvar info = L.control();\n<\/pre><\/div>\n\n\n<p>Avant d\u2019ajouter ce contr\u00f4le \u00e0 notre carte, il d\u2019abord lui\nrajouter deux m\u00e9thodes \u00ab&nbsp;onAdd&nbsp;\u00bb et \u00ab&nbsp;update&nbsp;\u00bb.<\/p>\n\n\n\n<p>La premi\u00e8re, qui prend la carte en param\u00e8tre d\u2019entr\u00e9e,\najoute dans le DOM notre encart et y attache la m\u00e9thode \u00ab&nbsp;update&nbsp;\u00bb&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\ninfo.onAdd = function (map) {\n    this._div = L.DomUtil.create(&#039;div&#039;, &#039;info&#039;);\n    this.update();\n    return this._div;\n};\n<\/pre><\/div>\n\n\n<p>La deuxi\u00e8me, qui prend en entr\u00e9e des propri\u00e9t\u00e9s d\u2019objet\nGeoJSON, met \u00e0 jour le contenu de l\u2019encart. La distinction ligne\/station ce\nfait sur la pr\u00e9sence ou non d\u2019une propri\u00e9t\u00e9 \u00ab&nbsp;line&nbsp;\u00bb&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\ninfo.update = function (props) {\n    if(props) {\n\tif(props.line){\n\t    this._div.innerHTML = &#039;&lt;p&gt;Ligne &#039; + props.line + &#039;&lt;\/p&gt;&#039;;\n\t} else {\n\t    this._div.innerHTML = &#039;&lt;p&gt;&#039; + props.name + &#039; \u2013 &#039; + props.about + &#039;&lt;\/p&gt;&#039;;\n        }\n    } else {\n        this._div.innerHTML = &#039;&lt;p&gt;Survoler un \u00e9l\u00e9ment&lt;\/p&gt;&#039;;\n    }\n};\n<\/pre><\/div>\n\n\n<p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUne\nfois ces deux m\u00e9thodes d\u00e9clar\u00e9es, on peut rajouter notre contr\u00f4le \u00e0 la carte&nbsp;:\n\n\n\n<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\ninfo.addTo(map);\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Ajout de l&rsquo;interactivit\u00e9 des stations<\/h3>\n\n\n\n<p>Pour s\u2019assurer que le pictogramme de la station survol\u00e9e soit toujours affich\u00e9 au-dessus des autres, il faut mettre aux marqueurs un param\u00e8tre \u00ab riseOnHover \u00bb \u00e0 <em>true&nbsp;<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nreturn L.marker(latlng,{\n  icon: L.icon({\n      iconUrl: &#039;.\/symbole.1541586932.svg&#039;,\n      iconSize:     &#x5B;14, 14],\n      iconAnchor:   &#x5B;7, 7]\n  }),\n  riseOnHover: true\n});\n<\/pre><\/div>\n\n\n<p>Pour les stations, la fonction appel\u00e9e par \u00ab&nbsp;onEachFeature&nbsp;\u00bb\nest&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nfunction onEachStation(feature, layer) {\n  layer.on({\n    mouseover: highlightStation,\n    mouseout: resetStation\n  });\n}\n<\/pre><\/div>\n\n\n<p>Les deux fonctions correspondant aux deux \u00e9v\u00e9nements sont&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nfunction highlightStation(e) {\n  info.update(e.target.feature.properties);\n  e.target.setIcon(\n    L.icon({\n      iconUrl: &#039;.\/symbole.1541586932.svg&#039;,\n      iconSize:     &#x5B;18, 18],\n      iconAnchor:   &#x5B;9, 9]\n    })\n  );\n}\n\nfunction resetStation(e) {\n  info.update();\n  e.target.setIcon(\n    L.icon({\n      iconUrl: &#039;.\/symbole.1541586932.svg&#039;,\n      iconSize:     &#x5B;14, 14],\n      iconAnchor:   &#x5B;7, 7]\n    })\n  );\n}\n<\/pre><\/div>\n\n\n<p>Une fois tout cela fait, on ajoute le param\u00e8tre \u00ab&nbsp;onEachFeature&nbsp;\u00bb\n\u00e0 notre calque&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nvar stations = L.geoJson(metro_stations, {\n  pointToLayer: function(feature, latlng) {\n    return L.marker(latlng,{\n      icon: L.icon({\n          iconUrl: &#039;.\/symbole.1541586932.svg&#039;,\n          iconSize:     &#x5B;14, 14],\n          iconAnchor:   &#x5B;7, 7]\n      }),\n      riseOnHover: true\n    });\n  },\n  onEachFeature: onEachStation\n}).addTo(map);\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Ajout de l\u2019interactiv\u00e9 des lignes<\/h3>\n\n\n\n<p>Pour les lignes, la fonction appel\u00e9e par \u00ab&nbsp;onEachFeature&nbsp;\u00bb\nest&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nfunction onEachLine(feature, layer) {\n  layer.on({\n    mouseover: highlightLine,\n    mouseout: resetLine\n  });\n}\n<\/pre><\/div>\n\n\n<p>Les deux fonctions correspondant aux \u00e9v\u00e9nements sont&nbsp;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; gutter: false; title: ; notranslate\" title=\"\">\nfunction highlightLine(e) {\n  var target = e.target;\n  info.update(target.feature.properties);\n  target.setStyle({weight:6});\n\n    if (!L.Browser.ie &amp;&amp; !L.Browser.opera &amp;&amp; !L.Browser.edge) {\n        target.bringToFront(); \/\/ positionne la ligne au-dessus dans le calque\n    }\n}\n\nfunction resetLine(e) {\n    info.update();\n  lines.resetStyle(e.target);\n}\n<\/pre><\/div>\n\n\n<p>Une fois la fonction \u00ab onEachLine \u00bb rajout\u00e9e dans le param\u00e8tre \u00ab onEachFeature \u00bb du calque des lignes, notre carte est termin\u00e9e :<\/p>\n\n\n\n<iframe src=\"https:\/\/geekcommunicant.com\/iframes\/leaflet-metro-complet.html\" style=\"width:100%;height:425px;\"><\/iframe>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Sources sur la pr\u00e9dominance de Leaflet :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" aria-label=\"SimilarTech (opens in a new tab)\" href=\"https:\/\/www.similartech.com\/compare\/leaflet-vs-openlayers\" target=\"_blank\">SimilarTech<\/a><\/li><li><a rel=\"noreferrer noopener\" aria-label=\"Google Fight (opens in a new tab)\" href=\"https:\/\/www.googlefight.com\/leaflet-vs-openlayers.php\" target=\"_blank\">Google Fight<\/a><\/li><li><a href=\"https:\/\/stackshare.io\/stackups\/leaflet-vs-openlayers\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"StackShare (opens in a new tab)\">StackShare<\/a><\/li><\/ul>\n\n\n\n<p>Une version compl\u00e8te et plus grande est disponible sur <a href=\"https:\/\/geekcommunicant.com\/demos\/carte-interactive-metro-paris-leaflet.html\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"mon site (opens in a new tab)\">mon site<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si on vous parle de solution pour int\u00e9grer une carte sur votre site, la premi\u00e8re qui vous vient \u00e0 l\u2019esprit est surement Google Maps. Mais il existe plusieurs solutions open-source et gratuites. Je vous ai d\u00e9j\u00e0 parl\u00e9 d\u2019OpenLayers, avec laquelle &hellip; <a href=\"https:\/\/geekcommunicant.com\/blog\/2019\/06\/11\/carte-interactive-metro-paris-leaflet\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[19],"tags":[14,31,45],"class_list":["post-808","post","type-post","status-publish","format-standard","hentry","category-javascript","tag-carte-interactive","tag-javascript","tag-leaflet"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2IoOb-d2","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1271,"url":"https:\/\/geekcommunicant.com\/blog\/2024\/11\/11\/marqueur-personnalise-leaflet\/","url_meta":{"origin":808,"position":0},"title":"Un marqueur personnalis\u00e9 avec Leaflet","author":"geekc","date":"11\/11\/2024","format":false,"excerpt":"Lors de mon tutoriel sur la carte du m\u00e9tro de Paris avec Leaflet, j\u2019ai d\u00e9j\u00e0 personnalis\u00e9 les marqueurs de cette carte, mais comme dans le cadre du tutoriel c\u2019\u00e9tait assez secondaire, je n\u2019ai pas d\u00e9taill\u00e9 ce point. Aujourd\u2019hui est venu le temps de revenir sur la mani\u00e8re d\u2019utiliser nos propres\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":832,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/06\/17\/carte-interactive-metro-paris-openlayers\/","url_meta":{"origin":808,"position":1},"title":"Carte interactive du m\u00e9tro de Paris avec OpenLayers","author":"geekc","date":"17\/06\/2019","format":false,"excerpt":"Apr\u00e8s vous avoir cr\u00e9\u00e9 une carte interactive du m\u00e9tro de Paris avec la librairie Leaflet (voir mon pr\u00e9c\u00e9dent article), j\u2019ai d\u00e9cid\u00e9 de recr\u00e9er cette carte avec l\u2019autre libraire majeure de cartographie en ligne\u00a0: OpenLayers (que j\u2019ai d\u00e9j\u00e0 utilis\u00e9e pour ma carte utilisant un fond statique). Donn\u00e9es utilis\u00e9es Les donn\u00e9es utilis\u00e9es\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":848,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/01\/carte-interactive-rues-sans-megots-openlayers\/","url_meta":{"origin":808,"position":2},"title":"Carte interactive des rues sans m\u00e9gots avec OpenLayers","author":"geekc","date":"01\/07\/2019","format":false,"excerpt":"Bon, je suppose que vous commencez \u00e0 avoir l\u2019habitude que je vous pr\u00e9sente la mani\u00e8re de cr\u00e9er une carte interactive \u00e0 l\u2019aide des deux librairies majeures OpenLayers et Leaflet. Apr\u00e8s avoir rapidement cr\u00e9\u00e9 la carte des rues et sections de rue concern\u00e9es par l\u2019op\u00e9ration \u00ab\u00a0Des rues sans m\u00e9gots\u00a0\u00bb avec Leaflet,\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":835,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/06\/24\/carte-interactive-rues-sans-megots-leaflet\/","url_meta":{"origin":808,"position":3},"title":"Carte interactive des rues sans m\u00e9gots avec Leaflet","author":"geekc","date":"24\/06\/2019","format":false,"excerpt":"Cette carte interactive des rues sans m\u00e9gots de Paris a \u00e9t\u00e9 r\u00e9alis\u00e9e suite \u00e0 la suite de la consultation de la page d\u2019actualit\u00e9s de la ville de Paris concernant cette action de propret\u00e9, qui ne contenait qu\u2019une image pour pr\u00e9senter la cartographie des diff\u00e9rentes rues concern\u00e9es par cette op\u00e9ration. Sources\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":856,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/08\/carte-controle-calques-leaflet\/","url_meta":{"origin":808,"position":4},"title":"Carte avec contr\u00f4le de calques avec Leaflet","author":"geekc","date":"08\/07\/2019","format":false,"excerpt":"Cette semaine encore, nous allons encore voir la cr\u00e9ation d\u2019une carte interactive avec la librairie Leaflet. La carte pr\u00e9sent\u00e9e aujourd\u2019hui utilise les groupes de calques, ainsi que le contr\u00f4le de calques, afin de r\u00e9aliser une carte historique de la ligne 2 du tramway d\u2019\u00cele-de-France. Bref historique Afin d\u2019expliquer le d\u00e9coupage\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":860,"url":"https:\/\/geekcommunicant.com\/blog\/2019\/07\/15\/carte-interactive-openlayers-controle-calques\/","url_meta":{"origin":808,"position":5},"title":"Carte interactive OpenLayers avec contr\u00f4le de calques","author":"geekc","date":"15\/07\/2019","format":false,"excerpt":"Apr\u00e8s avoir r\u00e9alis\u00e9 une carte historique de la ligne 2 du tramway d\u2019\u00cele-de-France avec Leaflet (voir le tutoriel), je me suis attaqu\u00e9 \u00e0 la cr\u00e9ation de cette m\u00eame carte avec OpenLayers. Bien que plus complet sur certains points, OpenLayers n\u2019inclus pas nativement deux fonctionnalit\u00e9s utilis\u00e9es dans la carte\u00a0: Le contr\u00f4le\u2026","rel":"","context":"Dans &quot;JavaScript&quot;","block_context":{"text":"JavaScript","link":"https:\/\/geekcommunicant.com\/blog\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/comments?post=808"}],"version-history":[{"count":0,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/posts\/808\/revisions"}],"wp:attachment":[{"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/media?parent=808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/categories?post=808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekcommunicant.com\/blog\/wp-json\/wp\/v2\/tags?post=808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}